ZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnR4dCBiL2FwaS9jdXJyZW50LnR4dAppbmRleCAyOWYwOTNhLi5hZDg0ODk1IDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC50eHQKKysrIGIvYXBpL2N1cnJlbnQudHh0CkBAIC03NSw2ICs3NSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGphdmEubGFuZy5TdHJpbmcgUEVSU0lTVEVOVF9BQ1RJVklUWSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUEVSU0lTVEVOVF9BQ1RJVklUWSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST0NFU1NfT1VUR09JTkdfQ0FMTFMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST0NFU1NfT1VUR09JTkdfQ0FMTFMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0NBTEVOREFSID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NBTEVOREFSIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRF9DQUxMX0xPRyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DQUxMX0xPRyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfQ09OVEFDVFMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0VYVEVSTkFMX1NUT1JBR0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfRlJBTUVfQlVGRkVSID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0ZSQU1FX0JVRkZFUiI7CkBAIC0xMjEsNiArMTIyLDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0FLRV9MT0NLID0gImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9BUE5fU0VUVElOR1MgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0FQTl9TRVRUSU5HUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NBTEVOREFSID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DQUxFTkRBUiI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NBTExfTE9HID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DQUxMX0xPRyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NPTlRBQ1RTID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DT05UQUNUUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0VYVEVSTkFMX1NUT1JBR0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9HU0VSVklDRVMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0dTRVJWSUNFUyI7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggZjI2NzQ3Yi4uZTQxYjY2NiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMTQsOSArMTQsOSBAQAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKLSAgICAgICAgZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2NvcmUgXAotICAgICAgICBleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKwlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZSBcCisJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2ltYWdlcyBcCiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC00MCw3ICs0MCw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC02NCw3ICs2NCw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC04OSw3ICs4OSw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC0xMTMsNyArMTEzLDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKQEAgLTEzNyw3ICsxMzcsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIApAQCAtMTYyLDcgKzE2Miw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCmluZGV4IDI3NzVjN2IuLmZiY2JiMzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhCkBAIC0xOTA3LDEyICsxOTA3LDEyIEBACiAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignPScpICE9IC0xIHx8IGtleS5pbmRleE9mKCc7JykgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJLZXkgXCIiICsga2V5ICsgIlwiIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyICg9IG9yIDspIik7CisgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJz0nKSAhPSAtMSB8fCBrZXkuaW5kZXhPZignOycpICE9IC0xIHx8IGtleS5pbmRleE9mKDApICE9IC0xKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiS2V5IFwiIiArIGtleSArICJcIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciAoPSBvciA7IG9yIFxcMCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignPScpICE9IC0xIHx8IHZhbHVlLmluZGV4T2YoJzsnKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlZhbHVlIFwiIiArIHZhbHVlICsgIlwiIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyICg9IG9yIDspIik7CisgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignPScpICE9IC0xIHx8IHZhbHVlLmluZGV4T2YoJzsnKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKDApICE9IC0xKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVmFsdWUgXCIiICsgdmFsdWUgKyAiXCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIgKD0gb3IgOyBvciBcXDApIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4ZjAzZmUwLi5kMWUzNjQyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI0OCw2ICsyNDgsMjEgQEAKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX3dyaXRlQ29udGFjdHMiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2Nfd3JpdGVDb250YWN0cyIgLz4KIAorICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHJlYWQgdGhlIHVzZXIncyBjYWxsIGxvZy4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DQUxMX0xPRyIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5QRVJTT05BTF9JTkZPIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfcmVhZENhbGxMb2ciCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfcmVhZENhbGxMb2ciIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSAoYnV0IG5vdCByZWFkKSB0aGUgdXNlcidzCisgICAgICAgICBjb250YWN0cyBkYXRhLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DQUxMX0xPRyIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5QRVJTT05BTF9JTkZPIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfd3JpdGVDYWxsTG9nIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3dyaXRlQ2FsbExvZyIgLz4KKwogCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVhZCB0aGUgdXNlcidzIHBlcnNvbmFsIHByb2ZpbGUgZGF0YS4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QUk9GSUxFIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggNzEzN2I3Yy4uNzc5OWY3NCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC05NDIsNiArOTQyLDI2IEBACiAgICAgICAgIGNvbnRhY3QgKGFkZHJlc3MpIGRhdGEgc3RvcmVkIG9uIHlvdXIgcGhvbmUuIE1hbGljaW91cwogICAgICAgICBhcHBzIG1heSB1c2UgdGhpcyB0byBlcmFzZSBvciBtb2RpZnkgeW91ciBjb250YWN0IGRhdGEuPC9zdHJpbmc+CiAKKworICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkQ2FsbExvZyI+cmVhZCBjYWxsIGxvZzwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGxMb2ciIHByb2R1Y3Q9InRhYmxldCI+QWxsb3dzIHRoZSBhcHAgdG8gcmVhZCB5b3VyIHRhYmxldFwncyBjYWxsIGxvZywgaW5jbHVkaW5nIGRhdGEgYWJvdXQgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNhbGxzLgorICAgICAgICBNYWxpY2lvdXMgYXBwcyBtYXkgdXNlIHRoaXMgdG8gc2VuZCB5b3VyIGRhdGEgdG8gb3RoZXIgcGVvcGxlLjwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGxMb2ciIHByb2R1Y3Q9ImRlZmF1bHQiPkFsbG93cyB0aGUgYXBwIHRvIHJlYWQgeW91ciBwaG9uZVwncyBjYWxsIGxvZywgaW5jbHVkaW5nIGRhdGEgYWJvdXQgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNhbGxzLgorICAgICAgICBNYWxpY2lvdXMgYXBwcyBtYXkgdXNlIHRoaXMgdG8gc2VuZCB5b3VyIGRhdGEgdG8gb3RoZXIgcGVvcGxlLjwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ2FsbExvZyI+d3JpdGUgY2FsbCBsb2c8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ2FsbExvZyIgcHJvZHVjdD0idGFibGV0Ij5BbGxvd3MgdGhlIGFwcCB0byBtb2RpZnkgeW91ciB0YWJsZXRcJ3MgY2FsbCBsb2csIGluY2x1ZGluZyBkYXRhIGFib3V0IGluY29taW5nIGFuZCBvdXRnb2luZyBjYWxscy4KKyAgICAgICAgTWFsaWNpb3VzIGFwcHMgbWF5IHVzZSB0aGlzIHRvIGVyYXNlIG9yIG1vZGlmeSB5b3VyIGNhbGwgbG9nLjwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDYWxsTG9nIiBwcm9kdWN0PSJkZWZhdWx0Ij5BbGxvd3MgdGhlIGFwcCB0byBtb2RpZnkgeW91ciBwaG9uZVwncyBjYWxsIGxvZywgaW5jbHVkaW5nIGRhdGEgYWJvdXQgaW5jb21pbmcgYW5kIG91dGdvaW5nIGNhbGxzLgorICAgICAgICBNYWxpY2lvdXMgYXBwcyBtYXkgdXNlIHRoaXMgdG8gZXJhc2Ugb3IgbW9kaWZ5IHlvdXIgY2FsbCBsb2cuPC9zdHJpbmc+CisKKwogICAgIDwhLS0gVGl0bGUgb2YgdGhlIHJlYWQgcHJvZmlsZSBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGRlY2lkZSB3aGV0aGVyIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJvZmlsZSBkYXRhLiBbQ0hBUiBMSU1JVD0zMF0gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIj5yZWFkIHlvdXIgcHJvZmlsZSBkYXRhPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCBwcm9maWxlIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIHJlYWQgdGhlIHVzZXIncyBwZXJzb25hbCBwcm9maWxlIGRhdGEuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Mb2NhbGVVdGlsVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Mb2NhbGVVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2E2MDQzLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvTG9jYWxlVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5UZXN0TGV2ZWw7Ci1pbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdFRhcmdldE5ldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlldy5MQVlPVVRfRElSRUNUSU9OX0xUUjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXcuTEFZT1VUX0RJUkVDVElPTl9SVEw7Ci0KLXB1YmxpYyBjbGFzcyBMb2NhbGVVdGlsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBAVGVzdFRhcmdldE5ldygKLSAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCi0gICAgICAgIG1ldGhvZCA9ICJnZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlIiwKLSAgICAgICAgYXJncyA9IHtMb2NhbGUuY2xhc3N9Ci0gICAgKQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKG51bGwpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkVOR0xJU0gpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5DQU5BREEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5DQU5BREFfRlJFTkNIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuRlJBTkNFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuRlJFTkNIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuR0VSTUFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuR0VSTUFOWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLklUQUxJQU4pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5JVEFMWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlVLKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuVVMpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlJPT1QpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkNISU5BKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuQ0hJTkVTRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkpBUEFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuSkFQQU5FU0UpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5LT1JFQSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLktPUkVBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlBSQykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlNJTVBMSUZJRURfQ0hJTkVTRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlRBSVdBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlRSQURJVElPTkFMX0NISU5FU0UpKTsKLQotICAgICAgICBMb2NhbGUgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJBRSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkJIIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiRFoiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJFRyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIklRIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiSk8iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJLVyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkxCIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiTFkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJNQSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIk9NIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiUUEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJTQSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIlNEIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiU1kiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJUTiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIllFIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLQotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJmYSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImZhIiwgIkFGIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiZmEiLCAiSVIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotCi0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoIml3Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiaXciLCAiSUwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJoZSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImhlIiwgIklMIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLQotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJwYV9BcmFiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgicGFfQXJhYiIsICJQSyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgicHMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJwcyIsICJBRiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgidXIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJ1ciIsICJJTiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInVyIiwgIlBLIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLQotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJ1el9BcmFiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgidXpfQXJhYiIsICJBRiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgLy8gTG9jYWxlIHdpdGhvdXQgYSByZWFsIGxhbmd1YWdlCi0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInp6Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAppbmRleCAzOWQ1OGFiLi4wMGZhY2M1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKQEAgLTY0LDYgKzY0LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgbmV4dCkgPSAwOwogCiAgICAgLy8gSW52b2tlIGEgZ2VuZXJpYyBtZXRob2Qgb24gdGhlIHBsYXllciBieSB1c2luZyBvcGFxdWUgcGFyY2VscwogICAgIC8vIGZvciB0aGUgcmVxdWVzdCBhbmQgcmVwbHkuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggODE2OGRmZi4uZDRhYTIzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMTA3LDYgKzEwNyw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgY2xvc2UoKSA9IDA7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQbGF5YmFja1JhdGVQZXJtaWxsZShpbnQzMl90IHJhdGUpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgbmVlZHNUcmFpbGluZ1BhZGRpbmcoKSB7IHJldHVybiB0cnVlOyB9CiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlKCkgOiBtQ29va2llKDApLCBtTm90aWZ5KDApIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKaW5kZXggOWNkNWY5Zi4uNjYyZGQxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaApAQCAtOTYsNiArOTYsOSBAQAogZW51bSBtZWRpYV9pbmZvX3R5cGUgewogICAgIC8vIDB4eAogICAgIE1FRElBX0lORk9fVU5LTk9XTiA9IDEsCisgICAgLy8gVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgorICAgIC8vIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2sKKyAgICBNRURJQV9JTkZPX1NUQVJURURfQVNfTkVYVCA9IDIsCiAgICAgLy8gN3h4CiAgICAgLy8gVGhlIHZpZGVvIGlzIHRvbyBjb21wbGV4IGZvciB0aGUgZGVjb2RlcjogaXQgY2FuJ3QgZGVjb2RlIGZyYW1lcyBmYXN0CiAgICAgLy8gZW5vdWdoLiBQb3NzaWJseSBvbmx5IHRoZSBhdWRpbyBwbGF5cyBmaW5lIGF0IHRoaXMgc3RhZ2UuCkBAIC0yMDcsNiArMjEwLDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsKiByZXBseSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IGNoYXIqIGFkZHJTdHJpbmcsIHVpbnQxNl90IHBvcnQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIHBsYXllcik7CiAKIHByaXZhdGU6CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJfbCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2VmZDM1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBIQVJEV0FSRV9BUElfSF8KLQotI2RlZmluZSBIQVJEV0FSRV9BUElfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gdGhlIE9NWF9TZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCi0vLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMnIGV4dGVuc2lvbgotLy8gaXMgZ2l2ZW4uCi0vLwotLy8gV2hlbiBBbmRyb2lkIG5hdGl2ZSBidWZmZXIgdXNlIGlzIGRpc2FibGVkIGZvciBhIHBvcnQgKHRoZSBkZWZhdWx0IHN0YXRlKSwKLS8vIHRoZSBPTVggbm9kZSBzaG91bGQgb3BlcmF0ZSBhcyBub3JtYWwsIGFuZCBleHBlY3QgVXNlQnVmZmVyIGNhbGxzIHRvIHNldCBpdHMKLS8vIGJ1ZmZlcnMuICBUaGlzIGlzIHRoZSBtb2RlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gQ1BVIGFjY2VzcyB0byB0aGUgYnVmZmVyIGlzCi0vLyByZXF1aXJlZC4KLS8vCi0vLyBXaGVuIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlciB1c2UgaGFzIGJlZW4gZW5hYmxlZCBmb3IgYSBnaXZlbiBwb3J0LCB0aGUgdmlkZW8KLS8vIGNvbG9yIGZvcm1hdCBmb3IgdGhlIHBvcnQgaXMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYW4gQW5kcm9pZCBwaXhlbCBmb3JtYXQKLS8vIHJhdGhlciB0aGFuIGFuIE9NWCBjb2xvciBmb3JtYXQuICBUaGUgbm9kZSBzaG91bGQgdGhlbiBleHBlY3QgdG8gcmVjZWl2ZQotLy8gVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciBjYWxscyAodmlhIE9NWF9TZXRQYXJhbWV0ZXIpIHJhdGhlciB0aGFuIFVzZUJ1ZmZlcgotLy8gY2FsbHMgZm9yIHRoYXQgcG9ydC4KLXN0cnVjdCBFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGVuYWJsZTsKLX07Ci0KLS8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gT01YX1NldFBhcmFtZXRlcigpIHdoZW4gdGhlIGV4dGVuc2lvbgotLy8gaW5kZXggIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIgotLy8gaXMgZ2l2ZW4uCi0vLwotLy8gV2hlbiBtZXRhIGRhdGEgaXMgc3RvcmVkIGluIHRoZSB2aWRlbyBidWZmZXJzIHBhc3NlZCBiZXR3ZWVuIE9NWCBjbGllbnRzCi0vLyBhbmQgT01YIGNvbXBvbmVudHMsIGludGVycHJldGF0aW9uIG9mIHRoZSBidWZmZXIgZGF0YSBpcyB1cCB0byB0aGUKLS8vIGJ1ZmZlciByZWNlaXZlciwgYW5kIHRoZSBkYXRhIG1heSBvciBtYXkgbm90IGJlIHRoZSBhY3R1YWwgdmlkZW8gZGF0YSwgYnV0Ci0vLyBzb21lIGluZm9ybWF0aW9uIGhlbHBmdWwgZm9yIHRoZSByZWNlaXZlciB0byBsb2NhdGUgdGhlIGFjdHVhbCBkYXRhLgotLy8gVGhlIGJ1ZmZlciByZWNlaXZlciB0aHVzIG5lZWRzIHRvIGtub3cgaG93IHRvIGludGVycHJldCB3aGF0IGlzIHN0b3JlZAotLy8gaW4gdGhlc2UgYnVmZmVycywgd2l0aCBtZWNoYW5pc21zIHByZS1kZXRlcm1pbmVkIGV4dGVybmFsbHkuIEhvdyB0bwotLy8gaW50ZXJwcmV0IHRoZSBtZXRhIGRhdGEgaXMgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhpcyBtZXRob2QuCi0vLwotLy8gQ3VycmVudGx5LCB0aGlzIGlzIHNwZWNpZmljYWxseSB1c2VkIHRvIHBhc3MgbWV0YSBkYXRhIGZyb20gdmlkZW8gc291cmNlCi0vLyAoY2FtZXJhIGNvbXBvbmVudCwgZm9yIGluc3RhbmNlKSB0byB2aWRlbyBlbmNvZGVyIHRvIGF2b2lkIG1lbWNweWluZyBvZgotLy8gaW5wdXQgdmlkZW8gZnJhbWUgZGF0YS4gVG8gZG8gdGhpcywgYlN0b3JlTWV0YUR0YSBpcyBzZXQgdG8gT01YX1RSVUUuCi0vLyBJZiBiU3RvcmVNZXRhRGF0YSBpcyBzZXQgdG8gZmFsc2UsIHJlYWwgWVVWIGZyYW1lIGRhdGEgd2lsbCBiZSBzdG9yZWQKLS8vIGluIHRoZSBidWZmZXJzLiBJbiBhZGRpdGlvbiwgaWYgbm8gT01YX1NldFBhcmFtZXRlcigpIGNhbGwgaXMgbWFkZQotLy8gd2l0aCB0aGUgY29ycmVzcG9uZGluZyBleHRlbnNpb24gaW5kZXgsIHJlYWwgWVVWIGRhdGEgaXMgc3RvcmVkCi0vLyBpbiB0aGUgYnVmZmVycy4KLXN0cnVjdCBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYlN0b3JlTWV0YURhdGE7Ci19OwotCi0vLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIE9NWF9TZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCi0vLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcicgZXh0ZW5zaW9uIGlzCi0vLyBnaXZlbi4gIFRoaXMgY2FsbCB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIGlmIGEgcHJpb3IgY2FsbCB3YXMgbWFkZSB3aXRoIHRoZQotLy8gJ09NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycycgZXh0ZW5zaW9uIGluZGV4LAotLy8gZW5hYmxpbmcgdXNlIG9mIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlcnMuCi1zdHJ1Y3QgVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlclBhcmFtcyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9QVFIgcEFwcFByaXZhdGU7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZWFkZXI7Ci0gICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd0J1ZmZlcj4mIG5hdGl2ZUJ1ZmZlcjsKLX07Ci0KLS8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gT01YX0dldFBhcmFtZXRlciB3aGVuIHRoZSBleHRlbnNpb24KLS8vIGluZGV4IGZvciB0aGUgJ09NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5nZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2UnCi0vLyBleHRlbnNpb24gaXMgZ2l2ZW4uICBUaGUgdXNhZ2UgYml0cyByZXR1cm5lZCBmcm9tIHRoaXMgcXVlcnkgd2lsbCBiZSB1c2VkIHRvCi0vLyBhbGxvY2F0ZSB0aGUgR3JhbGxvYyBidWZmZXJzIHRoYXQgZ2V0IHBhc3NlZCB0byB0aGUgdXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcgotLy8gY29tbWFuZC4KLXN0cnVjdCBHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2VQYXJhbXMgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvLyBJTgotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvLyBJTgotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvLyBJTgotICAgIE9NWF9VMzIgblVzYWdlOyAgICAgICAgICAgICAvLyBPVVQKLX07Ci0KLS8vIEFuIGVudW0gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUgdG8gaW5kaWNhdGUgYW4gb3BhcXVlIGNvbG9yZm9ybWF0Ci0vLyBpcyBkZWNsYXJlZCBpbiBtZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCi0vLyBUaGlzIHdpbGwgaW5mb3JtIHRoZSBlbmNvZGVyIHRoYXQgdGhlIGFjdHVhbAotLy8gY29sb3Jmb3JtYXQgd2lsbCBiZSByZWxheWVkIGJ5IHRoZSBHUmFsbG9jIEJ1ZmZlcnMuCi0vLyBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSAgPSAweDdGMDAwMDAxLAotCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLWV4dGVybiBhbmRyb2lkOjpPTVhQbHVnaW5CYXNlICpjcmVhdGVPTVhQbHVnaW4oKTsKLQotI2VuZGlmICAvLyBIQVJEV0FSRV9BUElfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YWRhdGFCdWZmZXJUeXBlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFkYXRhQnVmZmVyVHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFmOGFjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YWRhdGFCdWZmZXJUeXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRVRBREFUQV9CVUZGRVJfVFlQRV9ICi0jZGVmaW5lIE1FVEFEQVRBX0JVRkZFUl9UWVBFX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLSNlbmRpZgotCi0vKgotICogTWV0YWRhdGFCdWZmZXJUeXBlIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlcnMgdGhhdAotICogY2FuIGJlIHBhc3NlZCB0byB2aWRlbyBlbmNvZGVyIGNvbXBvbmVudCBmb3IgZW5jb2RpbmcsIHZpYSBTdGFnZWZyaWdodAotICogbWVkaWEgcmVjb3JkaW5nIGZyYW1ld29yay4gVG8gc2VlIGhvdyB0byB3b3JrIHdpdGggdGhlIG1ldGFkYXRhIGJ1ZmZlcnMKLSAqIGluIG1lZGlhIHJlY29yZGluZyBmcmFtZXdvcmssIHBsZWFzZSBjb25zdWx0IEhhcmR3YXJlQVBJLmgKLSAqCi0gKiBUaGUgY3JlYXRvciBvZiBtZXRhZGF0YSBidWZmZXJzIGFuZCB2aWRlbyBlbmNvZGVyIHNoYXJlIGNvbW1vbiBrbm93bGVkZ2UKLSAqIG9uIHdoYXQgaXMgYWN0dWFsbHkgYmVpbmcgc3RvcmVkIGluIHRoZXNlIG1ldGFkYXRhIGJ1ZmZlcnMsIGFuZAotICogaG93IHRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCBieSB0aGUgdmlkZW8gZW5jb2RlciBjb21wb25lbnQKLSAqIHRvIGxvY2F0ZSB0aGUgYWN0dWFsIHBpeGVsIGRhdGEgYXMgdGhlIHNvdXJjZSBpbnB1dCBmb3IgdmlkZW8KLSAqIGVuY29kZXIsIHBsdXMgd2hhdGV2ZXIgb3RoZXIgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWNlc3NhcnkuIFN0YWdlZnJpZ2h0Ci0gKiBtZWRpYSByZWNvcmRpbmcgZnJhbWV3b3JrIGRvZXMgbm90IG5lZWQgdG8ga25vdyBhbnl0aGluZyBzcGVjaWZpYyBhYm91dCB0aGUKLSAqIG1ldGFkYXRhIGJ1ZmZlcnMsIGV4Y2VwdCBmb3IgcmVjZXZpbmcgZWFjaCBpbmRpdmlkdWFsIG1ldGFkYXRhIGJ1ZmZlcgotICogYXMgdGhlIHNvdXJjZSBpbnB1dCwgbWFraW5nIGEgY29weSBvZiB0aGUgbWV0YWRhdGEgYnVmZmVyLCBhbmQgcGFzc2luZyB0aGUKLSAqIGNvcHkgdmlhIE9wZW5NQVggQVBJIHRvIHRoZSB2aWRlbyBlbmNvZGVyIGNvbXBvbmVudC4KLSAqCi0gKiBUaGUgY3JlYXRvciBvZiB0aGUgbWV0YWRhdGEgYnVmZmVycyBtdXN0IGVuc3VyZSB0aGF0IHRoZSBmaXJzdAotICogNCBieXRlcyBpbiBldmVyeSBtZXRhZGF0YSBidWZmZXIgaW5kaWNhdGVzIGl0cyBidWZmZXIgdHlwZSwKLSAqIGFuZCB0aGUgcmVzdCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVyIGNvbnRhaW5zIHRoZQotICogYWN0dWFsIG1ldGFkYXRhIGluZm9ybWF0aW9uLiBXaGVuIGEgdmlkZW8gZW5jb2RlciBjb21wb25lbnQgcmVjZWl2ZXMKLSAqIGEgbWV0YWRhdGEgYnVmZmVyLCBpdCB1c2VzIHRoZSBmaXJzdCA0IGJ5dGVzIGluIHRoYXQgYnVmZmVyIHRvIGZpbmQKLSAqIG91dCB0aGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEgYnVmZmVyLCBhbmQgdGFrZXMgYWN0aW9uIGFwcHJvcHJpYXRlCi0gKiB0byB0aGF0IHR5cGUgb2YgbWV0YWRhdGEgYnVmZmVycyAoZm9yIGluc3RhbmNlLCBsb2NhdGUgdGhlIGFjdHVhbAotICogcGl4ZWwgZGF0YSBpbnB1dCBhbmQgdGhlbiBlbmNvZGluZyB0aGUgaW5wdXQgZGF0YSB0byBwcm9kdWNlIGEKLSAqIGNvbXByZXNzZWQgb3V0cHV0IGJ1ZmZlcikuCi0gKgotICogVGhlIGZvbGxvd2luZyBzaG93cyB0aGUgbGF5b3V0IG9mIGEgbWV0YWRhdGEgYnVmZmVyLAotICogd2hlcmUgYnVmZmVyIHR5cGUgaXMgYSA0LWJ5dGUgZmllbGQgb2YgTWV0YWRhdGFCdWZmZXJUeXBlLAotICogYW5kIHRoZSBwYXlsb2FkIGlzIHRoZSBtZXRhZGF0YSBpbmZvcm1hdGlvbi4KLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgYnVmZmVyIHR5cGUgIHwgICAgICAgICAgcGF5bG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICovCi10eXBlZGVmIGVudW0gewotCi0gICAgLyoKLSAgICAgKiBrTWV0YWRhdGFCdWZmZXJUeXBlQ2FtZXJhU291cmNlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdAotICAgICAqIHRoZSBzb3VyY2Ugb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciBpcyB0aGUgY2FtZXJhIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBrTWV0YWRhdGFCdWZmZXJUeXBlQ2FtZXJhU291cmNlICA9IDAsCi0KLSAgICAvKgotICAgICAqIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdAotICAgICAqIHRoZSBwYXlsb2FkIG9mIHRoZSBtZXRhZGF0YSBidWZmZXJzIGNhbiBiZSBpbnRlcnByZXRlZCBhcwotICAgICAqIGEgYnVmZmVyX2hhbmRsZV90LgotICAgICAqIFNvIGluIHRoaXMgY2FzZSx0aGUgbWV0YWRhdGEgdGhhdCB0aGUgZW5jb2RlciByZWNlaXZlcwotICAgICAqIHdpbGwgaGF2ZSBhIGJ5dGUgc3RyZWFtIHRoYXQgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgotICAgICAqIDEuIEZpcnN0LCB0aGVyZSBpcyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhhdCBpdCBpcyBhIEdSQWxsb2MKLSAgICAgKiBzb3VyY2UgKGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKQotICAgICAqIDIuIFRoaXMgaXMgZm9sbG93ZWQgYnkgdGhlIGJ1ZmZlcl9oYW5kbGVfdCB0aGF0IGlzIGEgaGFuZGxlIHRvIHRoZQotICAgICAqIEdSYWxsb2MgYnVmZmVyLiBUaGUgZW5jb2RlciBuZWVkcyB0byBpbnRlcnByZXQgdGhpcyBHUmFsbG9jIGhhbmRsZQotICAgICAqIGFuZCBlbmNvZGUgdGhlIGZyYW1lcy4KLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqIHwgIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlIHwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkgfAotICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICovCi0gICAga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UgPSAxLAotCi0gICAgLy8gQWRkIG1vcmUgaGVyZS4uLgotCi19IE1ldGFkYXRhQnVmZmVyVHlwZTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotfQotI2VuZGlmCi0KLSNlbmRpZiAgLy8gTUVUQURBVEFfQlVGRkVSX1RZUEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkOGUxMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE9NWF9QTFVHSU5fQkFTRV9IXwotCi0jZGVmaW5lIE9NWF9QTFVHSU5fQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE9NWENvbXBvbmVudEJhc2U7Ci0KLXN0cnVjdCBPTVhQbHVnaW5CYXNlIHsKLSAgICBPTVhQbHVnaW5CYXNlKCkge30KLSAgICB2aXJ0dWFsIH5PTVhQbHVnaW5CYXNlKCkge30KLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBtYWtlQ29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpID0gMDsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZW51bWVyYXRlQ29tcG9uZW50cygKLSAgICAgICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKLSAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgT01YX1UzMiBpbmRleCkgPSAwOwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldFJvbGVzT2ZDb21wb25lbnQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcykgPSAwOwotCi1wcml2YXRlOgotICAgIE9NWFBsdWdpbkJhc2UoY29uc3QgT01YUGx1Z2luQmFzZSAmKTsKLSAgICBPTVhQbHVnaW5CYXNlICZvcGVyYXRvcj0oY29uc3QgT01YUGx1Z2luQmFzZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gT01YX1BMVUdJTl9CQVNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0F1ZGlvLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODI4NDEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9BdWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyOCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogQGZpbGUgT01YX0F1ZGlvLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgQXVkaW8gY29tcG9uZW50cyB0byBleGNoYW5nZQotICogIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbm1pbHRzLgotICovCi0KLSNpZm5kZWYgT01YX0F1ZGlvX2gKLSNkZWZpbmUgT01YX0F1ZGlvX2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKLSAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotCi0jaW5jbHVkZSA8T01YX0NvcmUuaD4KLQotLyoqIEBkZWZncm91cCBtaWRpIE1JREkKLSAqIEBpbmdyb3VwIGF1ZGlvCi0gKi8KLSAKLS8qKiBAZGVmZ3JvdXAgZWZmZWN0cyBBdWRpbyBlZmZlY3RzCi0gKiBAaW5ncm91cCBhdWRpbwotICovCi0KLS8qKiBAZGVmZ3JvdXAgYXVkaW8gT3Blbk1BWCBJTCBBdWRpbyBEb21haW4KLSAqIFN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgQXVkaW8gZG9tYWluCi0gKiBAewotICovCi0KLS8qKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgYXVkaW8gY29kaW5ncy4gIAotICogIElmICJPTVhfQVVESU9fQ29kaW5nVW51c2VkIiBpcyBzZWxlY3RlZCwgdGhlIGNvZGluZyBzZWxlY3Rpb24gbXVzdCAKLSAqICBiZSBkb25lIGluIGEgdmVuZG9yIHNwZWNpZmljIHdheS4gIFNpbmNlIHRoaXMgaXMgZm9yIGFuIGF1ZGlvIAotICogIHByb2Nlc3NpbmcgZWxlbWVudCB0aGlzIGVudW0gaXMgcmVsZXZhbnQuICBIb3dldmVyLCBmb3IgYW5vdGhlciAKLSAqICB0eXBlIG9mIGNvbXBvbmVudCBvdGhlciBlbnVtcyB3b3VsZCBiZSBpbiB0aGlzIGFyZWEuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQ09ESU5HVFlQRSB7Ci0gICAgT01YX0FVRElPX0NvZGluZ1VudXNlZCA9IDAsICAvKio8IFBsYWNlaG9sZGVyIHZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nQXV0b0RldGVjdCwgIC8qKjwgYXV0byBkZXRlY3Rpb24gb2YgYXVkaW8gZm9ybWF0ICovCi0gICAgT01YX0FVRElPX0NvZGluZ1BDTSwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBDTSBjb2RpbmcgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nQURQQ00sICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQURQQ00gZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0FNUiwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFNUiBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nR1NNRlIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgR1NNIGZ1bGxyYXRlIChpLmUuIEdTTTYxMCkgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nR1NNRUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgR1NNIEVuaGFuY2VkIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSovCi0gICAgT01YX0FVRElPX0NvZGluZ0dTTUhSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBIYWxmcmF0ZSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nUERDRlIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUERDIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdQRENFRlIsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQREMgRW5oYW5jZWQgRnVsbHJhdGUgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1BEQ0hSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBEQyBIYWxmcmF0ZSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nVERNQUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVERNQSBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKFRJQS9FSUEtMTM2LTQyMCkgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nVERNQUVGUiwgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVERNQSBFbmhhbmNlZCBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKFRJQS9FSUEtMTM2LTQxMCkgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nUUNFTFA4LCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUUNFTFAgOGticHMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1FDRUxQMTMsICAgICAvKio8IEFueSB2YXJpYW50IG9mIFFDRUxQIDEza2JwcyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nRVZSQywgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRVZSQyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nU01WLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgU01WIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdHNzExLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcxMSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nRzcyMywgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MjMgZG90IDEgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0c3MjYsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzI2IGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdHNzI5LCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcyOSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nQUFDLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQUFDIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdNUDMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBNUDMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1NCQywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFNCQyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nVk9SQklTLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVk9SQklTIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdXTUEsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBXTUEgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1JBLCAgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFJBIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdNSURJLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBNSURJIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0NvZGluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0NvZGluZ01heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0NPRElOR1RZUEU7Ci0KLQotLyoqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAotICogIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IGF1ZGlvIAotICogIHBhdGguICBJZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZWZpbmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlCi0gKiAgcG9ydCAoc3VjaCBhcyBmcmVxdWVuY3kpLCBhZGRpdGlvbmFsIHN0cnVjdHVyZXMgbXVzdCBiZSBzZW50IHN1Y2ggYXMgdGhlCi0gKiAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHN0cnVjdHVyZSB0byBzdXBwbHkgdGhlIGV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBwb3J0LgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUE9SVERFRklOSVRJT05UWVBFIHsKLSAgICBPTVhfU1RSSU5HIGNNSU1FVHlwZTsgICAgICAgICAgICAvKio8IE1JTUUgdHlwZSBvZiBkYXRhIGZvciB0aGUgcG9ydCAqLwotICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOyAvKiogPCBwbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFuIG91dHB1dCBkZXZpY2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwICovCi0gICAgT01YX0JPT0wgYkZsYWdFcnJvckNvbmNlYWxtZW50OyAgLyoqPCBUdXJucyBvbiBlcnJvciBjb25jZWFsbWVudCBpZiBpdCBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgT01YIGNvbXBvbmVudCAqLwotICAgIE9NWF9BVURJT19DT0RJTkdUWVBFIGVFbmNvZGluZzsgIC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCAoZS5nLiBQQ00sIEFNUiwgTVAzLCBldGMpICovCi19IE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEU7Ci0KLQotLyoqICBQb3J0IGZvcm1hdCBwYXJhbWV0ZXIuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVudW1lcmF0ZQotICAqICB0aGUgdmFyaW91cyBkYXRhIGlucHV0L291dHB1dCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0LgotICAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0ICovCi0gICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAweDAgdG8gTi0xICovCi0gICAgT01YX0FVRElPX0NPRElOR1RZUEUgZUVuY29kaW5nOyAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBwb3J0IChlLmcuIFBDTSwgQU1SLCBNUDMsIGV0YykgKi8KLX0gT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFOwotCi0KLS8qKiBQQ00gbW9kZSB0eXBlICAqLyAKLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fUENNTU9ERVRZUEUgeyAKLSAgICBPTVhfQVVESU9fUENNTW9kZUxpbmVhciA9IDAsICAvKio8IExpbmVhciBQQ00gZW5jb2RlZCBkYXRhICovIAotICAgIE9NWF9BVURJT19QQ01Nb2RlQUxhdywgICAgICAgIC8qKjwgQSBsYXcgUENNIGVuY29kZWQgZGF0YSAoRy43MTEpICovIAotICAgIE9NWF9BVURJT19QQ01Nb2RlTVVMYXcsICAgICAgIC8qKjwgTXUgbGF3IFBDTSBlbmNvZGVkIGRhdGEgKEcuNzExKSAgKi8gCi0gICAgT01YX0FVRElPX1BDTU1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX1BDTU1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19QQ01Nb2RlTWF4ID0gMHg3RkZGRkZGRiAKLX0gT01YX0FVRElPX1BDTU1PREVUWVBFOyAKLQotCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0NIQU5ORUxUWVBFIHsKLSAgICBPTVhfQVVESU9fQ2hhbm5lbE5vbmUgPSAweDAsICAgIC8qKjwgVW51c2VkIG9yIGVtcHR5ICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxMRiAgID0gMHgxLCAgICAvKio8IExlZnQgZnJvbnQgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbFJGICAgPSAweDIsICAgIC8qKjwgUmlnaHQgZnJvbnQgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbENGICAgPSAweDMsICAgIC8qKjwgQ2VudGVyIGZyb250ICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxMUyAgID0gMHg0LCAgICAvKio8IExlZnQgc3Vycm91bmQgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbFJTICAgPSAweDUsICAgIC8qKjwgUmlnaHQgc3Vycm91bmQgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbExGRSAgPSAweDYsICAgIC8qKjwgTG93IGZyZXF1ZW5jeSBlZmZlY3RzICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxDUyAgID0gMHg3LCAgICAvKio8IEJhY2sgc3Vycm91bmQgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbExSICAgPSAweDgsICAgIC8qKjwgTGVmdCByZWFyLiAqLwotICAgIE9NWF9BVURJT19DaGFubmVsUlIgICA9IDB4OSwgICAgLyoqPCBSaWdodCByZWFyLiAqLwotICAgIE9NWF9BVURJT19DaGFubmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19DaGFubmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1heCAgPSAweDdGRkZGRkZGIAotfSBPTVhfQVVESU9fQ0hBTk5FTFRZUEU7Ci0KLSNkZWZpbmUgT01YX0FVRElPX01BWENIQU5ORUxTIDE2ICAvKio8IG1heGltdW0gbnVtYmVyIGRpc3RpbmN0IGF1ZGlvIGNoYW5uZWxzIHRoYXQgYSBidWZmZXIgbWF5IGNvbnRhaW4gKi8KLSNkZWZpbmUgT01YX01JTl9QQ01QQVlMT0FEX01TRUMgNSAvKio8IE1pbmltdW0gYXVkaW8gYnVmZmVyIHBheWxvYWQgc2l6ZSBmb3IgdW5jb21wcmVzc2VkIChQQ00pIGF1ZGlvICovCi0KLS8qKiBQQ00gZm9ybWF0IGRlc2NyaXB0aW9uICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGUuZy4gMiBmb3Igc3RlcmVvKSAqLyAKLSAgICBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgZU51bURhdGE7ICAgLyoqPCBpbmRpY2F0ZXMgUENNIGRhdGEgYXMgc2lnbmVkIG9yIHVuc2lnbmVkICovIAotICAgIE9NWF9FTkRJQU5UWVBFIGVFbmRpYW47ICAgICAgICAgICAvKio8IGluZGljYXRlcyBQQ00gZGF0YSBhcyBsaXR0bGUgb3IgYmlnIGVuZGlhbiAqLyAKLSAgICBPTVhfQk9PTCBiSW50ZXJsZWF2ZWQ7ICAgICAgICAgICAgLyoqPCBUcnVlIGZvciBub3JtYWwgaW50ZXJsZWF2ZWQgZGF0YTsgZmFsc2UgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1pbnRlcmxlYXZlZCBkYXRhIChlLmcuIGJsb2NrIGRhdGEpICovIAotICAgIE9NWF9VMzIgbkJpdFBlclNhbXBsZTsgICAgICAgICAgICAvKio8IEJpdCBwZXIgc2FtcGxlICovIAotICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8gCi0gICAgT01YX0FVRElPX1BDTU1PREVUWVBFIGVQQ01Nb2RlOyAgIC8qKjwgUENNIG1vZGUgZW51bWVyYXRpb24gKi8gCi0gICAgT01YX0FVRElPX0NIQU5ORUxUWVBFIGVDaGFubmVsTWFwcGluZ1tPTVhfQVVESU9fTUFYQ0hBTk5FTFNdOyAvKio8IFNsb3QgaSBjb250YWlucyBjaGFubmVsIGRlZmluZWQgYnkgZUNoYW5uZWxNYXBbaV0gKi8KLQotfSBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEU7IAotCi0KLS8qKiBBdWRpbyBjaGFubmVsIG1vZGUuICBUaGlzIGlzIHVzZWQgYnkgYm90aCBBQUMgYW5kIE1QMywgYWx0aG91Z2ggdGhlIG5hbWVzIGFyZSBtb3JlIGFwcHJvcHJpYXRlCi0gKiBmb3IgdGhlIE1QMy4gIEZvciBleGFtcGxlLCBKb2ludFN0ZXJlbyBmb3IgTVAzIGlzIENvdXBsaW5nQ2hhbm5lbHMgZm9yIEFBQy4gCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIHsKLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVTdGVyZW8gPSAwLCAgLyoqPCAyIGNoYW5uZWxzLCB0aGUgYml0cmF0ZSBhbGxvY2F0aW9uIGJldHdlZW4gdGhvc2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gY2hhbm5lbHMgY2hhbmdlcyBhY2NvcmRpbmdseSB0byBlYWNoIGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVKb2ludFN0ZXJlbywgLyoqPCBtb2RlIHRoYXQgdGFrZXMgYWR2YW50YWdlIG9mIHdoYXQgaXMgY29tbW9uIGJldHdlZW4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBjaGFubmVscyBmb3IgaGlnaGVyIGNvbXByZXNzaW9uIGdhaW4gKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVEdWFsLCAgICAgICAgLyoqPCAyIG1vbm8tY2hhbm5lbHMsIGVhY2ggY2hhbm5lbCBpcyBlbmNvZGVkIHdpdGggaGFsZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0cmF0ZSBvZiB0aGUgb3ZlcmFsbCBiaXRyYXRlICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlTW9ubywgICAgICAgIC8qKjwgTW9ubyBjaGFubmVsIG1vZGUgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEU7Ci0KLQotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19NUDNTVFJFQU1GT1JNQVRUWVBFIHsKLSAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAxTGF5ZXIzID0gMCwgLyoqPCBNUDMgQXVkaW8gTVBFRyAxIExheWVyIDMgU3RyZWFtIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDJMYXllcjMsICAgICAvKio8IE1QMyBBdWRpbyBNUEVHIDIgTGF5ZXIgMyBTdHJlYW0gZm9ybWF0ICovCi0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMl81TGF5ZXIzLCAgIC8qKjwgTVAzIEF1ZGlvIE1QRUcyLjUgTGF5ZXIgMyBTdHJlYW0gZm9ybWF0ICovCi0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRTsKLQotLyoqIE1QMyBwYXJhbXMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9NUDNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KLSAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KLSAgICBPTVhfVTMyIG5BdWRpb0JhbmRXaWR0aDsgICAgICAgLyoqPCBBdWRpbyBiYW5kIHdpZHRoIChpbiBIeikgdG8gd2hpY2ggYW4gZW5jb2RlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0aGUgYXVkaW8gc2lnbmFsLiBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KLSAgICBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGVDaGFubmVsTW9kZTsgICAvKio8IENoYW5uZWwgbW9kZSBlbnVtZXJhdGlvbiAqLwotICAgIE9NWF9BVURJT19NUDNTVFJFQU1GT1JNQVRUWVBFIGVGb3JtYXQ7ICAvKio8IE1QMyBzdHJlYW0gZm9ybWF0ICovCi19IE9NWF9BVURJT19QQVJBTV9NUDNUWVBFOwotCi0KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQUFDU1RSRUFNRk9STUFUVFlQRSB7Ci0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QMkFEVFMgPSAwLCAvKio8IEFBQyBBdWRpbyBEYXRhIFRyYW5zcG9ydCBTdHJlYW0gMiBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0QURUUywgICAgIC8qKjwgQUFDIEF1ZGlvIERhdGEgVHJhbnNwb3J0IFN0cmVhbSA0IGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRMT0FTLCAgICAgLyoqPCBBQUMgTG93IE92ZXJoZWFkIEF1ZGlvIFN0cmVhbSBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0TEFUTSwgICAgIC8qKjwgQUFDIExvdyBvdmVyaGVhZCBBdWRpbyBUcmFuc3BvcnQgTXVsdGlwbGV4ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdEFESUYsICAgICAgICAvKio8IEFBQyBBdWRpbyBEYXRhIEludGVyY2hhbmdlIEZvcm1hdCAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRGRiwgICAgICAgLyoqPCBBQUMgaW5zaWRlIE1QRUctNC9JU08gRmlsZSBGb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0UkFXLCAgICAgICAgIC8qKjwgQUFDIFJhdyBGb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19BQUNTVFJFQU1GT1JNQVRUWVBFOwotCi0KLS8qKiBBQUMgbW9kZSB0eXBlLiAgTm90ZSB0aGF0IHRoZSB0ZXJtIHByb2ZpbGUgaXMgdXNlZCB3aXRoIHRoZSBNUEVHLTIKLSAqIHN0YW5kYXJkIGFuZCB0aGUgdGVybSBvYmplY3QgdHlwZSBhbmQgcHJvZmlsZSBpcyB1c2VkIHdpdGggTVBFRy00ICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFewotICBPTVhfQVVESU9fQUFDT2JqZWN0TnVsbCA9IDAsICAgICAgLyoqPCBOdWxsLCBub3QgdXNlZCAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbiA9IDEsICAgICAgLyoqPCBBQUMgTWFpbiBvYmplY3QgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdExDLCAgICAgICAgICAgIC8qKjwgQUFDIExvdyBDb21wbGV4aXR5IG9iamVjdCAoQUFDIHByb2ZpbGUpICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RTU1IsICAgICAgICAgICAvKio8IEFBQyBTY2FsYWJsZSBTYW1wbGUgUmF0ZSBvYmplY3QgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdExUUCwgICAgICAgICAgIC8qKjwgQUFDIExvbmcgVGVybSBQcmVkaWN0aW9uIG9iamVjdCAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0SEUsICAgICAgICAgICAgLyoqPCBBQUMgSGlnaCBFZmZpY2llbmN5IChvYmplY3QgdHlwZSBTQlIsIEhFLUFBQyBwcm9maWxlKSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUsICAgICAgLyoqPCBBQUMgU2NhbGFibGUgb2JqZWN0ICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RFUkxDID0gMTcsICAgICAvKio8IEVSIEFBQyBMb3cgQ29tcGxleGl0eSBvYmplY3QgKEVycm9yIFJlc2lsaWVudCBBQUMtTEMpICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RMRCA9IDIzLCAgICAgICAvKio8IEFBQyBMb3cgRGVsYXkgb2JqZWN0IChFcnJvciBSZXNpbGllbnQpICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RIRV9QUyA9IDI5LCAgICAvKio8IEFBQyBIaWdoIEVmZmljaWVuY3kgd2l0aCBQYXJhbWV0cmljIFN0ZXJlbyBjb2RpbmcgKEhFLUFBQyB2Miwgb2JqZWN0IHR5cGUgUFMpICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gIE9NWF9BVURJT19BQUNPYmplY3RWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEU7Ci0KLQotLyoqIEFBQyB0b29sIHVzYWdlIChmb3IgbkFBQ3Rvb2xzIGluIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSkuCi0gKiBSZXF1aXJlZCBmb3IgZW5jb2RlciBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25hbCBhcyBkZWNvZGVyIGluZm8gb3V0cHV0LgotICogRm9yIE1QMywgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBpcyBzdWZmaWNpZW50LiAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbE5vbmUgMHgwMDAwMDAwMCAvKio8IG5vIEFBQyB0b29scyBhbGxvd2VkIChlbmNvZGVyIGNvbmZpZykgb3IgYWN0aXZlIChkZWNvZGVyIGluZm8gb3V0cHV0KSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbE1TICAgMHgwMDAwMDAwMSAvKio8IE1TOiBNaWQvc2lkZSBqb2ludCBjb2RpbmcgdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbElTICAgMHgwMDAwMDAwMiAvKio8IElTOiBJbnRlbnNpdHkgc3RlcmVvIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xUTlMgIDB4MDAwMDAwMDQgLyoqPCBUTlM6IFRlbXBvcmFsIE5vaXNlIFNoYXBpbmcgdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbFBOUyAgMHgwMDAwMDAwOCAvKio8IFBOUzogTVBFRy00IFBlcmNlcHR1YWwgTm9pc2Ugc3Vic3RpdHV0aW9uIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xMVFAgIDB4MDAwMDAwMTAgLyoqPCBMVFA6IE1QRUctNCBMb25nIFRlcm0gUHJlZGljdGlvbiB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sQWxsICAweDdGRkZGRkZGIC8qKjwgYWxsIEFBQyB0b29scyBhbGxvd2VkIG9yIGFjdGl2ZSAoKi8KLQotLyoqIE1QRUctNCBBQUMgZXJyb3IgcmVzaWxpZW5jZSAoRVIpIHRvb2wgdXNhZ2UgKGZvciBuQUFDRVJ0b29scyBpbiBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUpLgotICogUmVxdWlyZWQgZm9yIEVSIGVuY29kZXIgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uYWwgYXMgZGVjb2RlciBpbmZvIG91dHB1dCAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDRVJOb25lICAweDAwMDAwMDAwICAvKio8IG5vIEFBQyBFUiB0b29scyBhbGxvd2VkL3VzZWQgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ0VSVkNCMTEgMHgwMDAwMDAwMSAgLyoqPCBWQ0IxMTogVmlydHVhbCBDb2RlIEJvb2tzIGZvciBBQUMgc2VjdGlvbiBkYXRhICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNFUlJWTEMgIDB4MDAwMDAwMDIgIC8qKjwgUlZMQzogUmV2ZXJzaWJsZSBWYXJpYWJsZSBMZW5ndGggQ29kaW5nICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNFUkhDUiAgIDB4MDAwMDAwMDQgIC8qKjwgSENSOiBIdWZmbWFuIENvZGV3b3JkIFJlb3JkZXJpbmcgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ0VSQWxsICAgMHg3RkZGRkZGRiAgLyoqPCBhbGwgQUFDIEVSIHRvb2xzIGFsbG93ZWQvdXNlZCAqLwotCi0KLS8qKiBBQUMgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCi0gICAgT01YX1UzMiBuQXVkaW9CYW5kV2lkdGg7ICAgICAgIC8qKjwgQXVkaW8gYmFuZCB3aWR0aCAoaW4gSHopIHRvIHdoaWNoIGFuIGVuY29kZXIgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdGhlIGF1ZGlvIHNpZ25hbC4gVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCi0gICAgT01YX1UzMiBuRnJhbWVMZW5ndGg7ICAgICAgICAgIC8qKjwgRnJhbWUgbGVuZ3RoIChpbiBhdWRpbyBzYW1wbGVzIHBlciBjaGFubmVsKSBvZiB0aGUgY29kZWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIDEwMjQgb3IgOTYwIChBQUMtTEMpLCAyMDQ4IChIRS1BQUMpLCA0ODAgb3IgNTEyIChBQUMtTEQpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLwotICAgIE9NWF9VMzIgbkFBQ3Rvb2xzOyAgICAgICAgICAgICAvKio8IEFBQyB0b29sIHVzYWdlICovCi0gICAgT01YX1UzMiBuQUFDRVJ0b29sczsgICAgICAgICAgIC8qKjwgTVBFRy00IEFBQyBlcnJvciByZXNpbGllbmNlIHRvb2wgdXNhZ2UgKi8KLSAgICBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUgZUFBQ1Byb2ZpbGU7ICAgLyoqPCBBQUMgcHJvZmlsZSBlbnVtZXJhdGlvbiAqLwotICAgIE9NWF9BVURJT19BQUNTVFJFQU1GT1JNQVRUWVBFIGVBQUNTdHJlYW1Gb3JtYXQ7IC8qKjwgQUFDIHN0cmVhbSBmb3JtYXQgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGVDaGFubmVsTW9kZTsgICAvKio8IENoYW5uZWwgbW9kZSBlbnVtZXJhdGlvbiAqLwotfSBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEU7Ci0KLQotLyoqIFZPUkJJUyBwYXJhbXMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBlbmNvZGVkIGRhdGEgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzLiBFbmNvZGluZyBpcyBzZXQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUgY2xvc2VzdCB0byBzcGVjaWZpZWQgIHZhbHVlIChpbiBicHMpICovCi0gICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAvKio8IFNldHMgbWluaW11bSBiaXRyYXRlIChpbiBicHMpLiAqLwotICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgLyoqPCBTZXRzIG1heGltdW0gYml0cmF0ZSAoaW4gYnBzKS4gKi8KLQotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCi0gICAgT01YX1UzMiBuQXVkaW9CYW5kV2lkdGg7ICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0aGUgYXVkaW8gc2lnbmFsLiBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KLSAgICBPTVhfUzMyIG5RdWFsaXR5OwkJICAvKio8IFNldHMgZW5jb2RpbmcgcXVhbGl0eSB0byBuLCBiZXR3ZWVuIC0xIChsb3cpIGFuZCAxMCAoaGlnaCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBkZWZhdWx0IG1vZGUgb2Ygb3BlcmF0aW9uLCB0ZWggcXVhbGl0eSBsZXZlbCBpcyAzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWwgcXVhbGl0eSByYW5nZSBpcyAwIC0gMTAuICovCi0gICAgT01YX0JPT0wgYk1hbmFnZWQ7CQkgIC8qKjwgU2V0ICBiaXRyYXRlICBtYW5hZ2VtZW50ICBtb2RlLiBUaGlzIHR1cm5zIG9mZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsIFZCUiBlbmNvZGluZywgYnV0IGFsbG93cyBoYXJkIG9yIHNvZnQgYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cyB0byBiZSBlbmZvcmNlZCBieSB0aGUgZW5jb2Rlci4gVGhpcyBtb2RlIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzbG93ZXIsIGFuZCBtYXkgYWxzbyBiZSBsb3dlciBxdWFsaXR5LiBJdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgdXNlZnVsIGZvciBzdHJlYW1pbmcuICovCi0gICAgT01YX0JPT0wgYkRvd25taXg7CQkgIC8qKjwgRG93bm1peCBpbnB1dCBmcm9tIHN0ZXJlbyB0byBtb25vIChoYXMgbm8gZWZmZWN0IG9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tc3RlcmVvIHN0cmVhbXMpLiBVc2VmdWwgZm9yIGxvd2VyLWJpdHJhdGUgZW5jb2RpbmcuICovICAgICAKLX0gT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEU7Ci0KLQotLyoqIFdNQSBWZXJzaW9uICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX1dNQUZPUk1BVFRZUEUgewotICBPTVhfQVVESU9fV01BRm9ybWF0VW51c2VkID0gMCwgLyoqPCBmb3JtYXQgdW51c2VkIG9yIHVua25vd24gKi8KLSAgT01YX0FVRElPX1dNQUZvcm1hdDcsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgNyAqLwotICBPTVhfQVVESU9fV01BRm9ybWF0OCwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA4ICovCi0gIE9NWF9BVURJT19XTUFGb3JtYXQ5LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDkgKi8KLSAgT01YX0FVRElPX1dNQUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgT01YX0FVRElPX1dNQUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gIE9NWF9BVURJT19XTUFGb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19XTUFGT1JNQVRUWVBFOwotCi0KLS8qKiBXTUEgUHJvZmlsZSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19XTUFQUk9GSUxFVFlQRSB7Ci0gIE9NWF9BVURJT19XTUFQcm9maWxlVW51c2VkID0gMCwgIC8qKjwgcHJvZmlsZSB1bnVzZWQgb3IgdW5rbm93biAqLwotICBPTVhfQVVESU9fV01BUHJvZmlsZUwxLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDEgKi8KLSAgT01YX0FVRElPX1dNQVByb2ZpbGVMMiwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwyICovCi0gIE9NWF9BVURJT19XTUFQcm9maWxlTDMsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMyAqLwotICBPTVhfQVVESU9fV01BUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgT01YX0FVRElPX1dNQVByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICBPTVhfQVVESU9fV01BUHJvZmlsZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFOwotCi0KLS8qKiBXTUEgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fV01BVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UxNiBuQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCi0gICAgT01YX0FVRElPX1dNQUZPUk1BVFRZUEUgZUZvcm1hdDsgLyoqPCBWZXJzaW9uIG9mIFdNQSBzdHJlYW0gLyBkYXRhICovCi0JT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFIGVQcm9maWxlOyAgLyoqPCBQcm9maWxlIG9mIFdNQSBzdHJlYW0gLyBkYXRhICovCi0gICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhICovCi0gICAgT01YX1UxNiBuQmxvY2tBbGlnbjsgICAgICAvKio8IGlzIHRoZSBibG9jayBhbGlnbm1lbnQsIG9yIGJsb2NrIHNpemUsIGluIGJ5dGVzIG9mIHRoZSBhdWRpbyBjb2RlYyAqLwotICAgIE9NWF9VMTYgbkVuY29kZU9wdGlvbnM7ICAgLyoqPCBXTUEgVHlwZS1zcGVjaWZpYyBkYXRhICovCi0gICAgT01YX1UzMiBuU3VwZXJCbG9ja0FsaWduOyAvKio8IFdNQSBUeXBlLXNwZWNpZmljIGRhdGEgKi8KLX0gT01YX0FVRElPX1BBUkFNX1dNQVRZUEU7Ci0KLS8qKiAKLSAqIFJlYWxBdWRpbyBmb3JtYXQKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19SQUZPUk1BVFRZUEUgewotICAgIE9NWF9BVURJT19SQUZvcm1hdFVudXNlZCA9IDAsIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCi0gICAgT01YX0FVRElPX1JBOCwgICAgICAgICAgICAgICAgLyoqPCBSZWFsQXVkaW8gOCBjb2RlYyAqLwotICAgIE9NWF9BVURJT19SQTksICAgICAgICAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIDkgY29kZWMgKi8KLSAgICBPTVhfQVVESU9fUkExMF9BQUMsICAgICAgICAgICAvKio8IE1QRUctNCBBQUMgY29kZWMgZm9yIGJpdHJhdGVzIG9mIG1vcmUgdGhhbiAxMjhrYnBzICovCi0gICAgT01YX0FVRElPX1JBMTBfQ09ERUMsICAgICAgICAgLyoqPCBSZWFsQXVkaW8gY29kZWMgZm9yIGJpdHJhdGVzIGxlc3MgdGhhbiAxMjgga2JwcyAqLwotICAgIE9NWF9BVURJT19SQTEwX0xPU1NMRVNTLCAgICAgIC8qKjwgUmVhbEF1ZGlvIExvc3NsZXNzICovCi0gICAgT01YX0FVRElPX1JBMTBfTVVMVElDSEFOTkVMLCAgLyoqPCBSZWFsQXVkaW8gTXVsdGljaGFubmVsICovCi0gICAgT01YX0FVRElPX1JBMTBfVk9JQ0UsICAgICAgICAgLyoqPCBSZWFsQXVkaW8gVm9pY2UgZm9yIGJpdHJhdGVzIGJlbG93IDE1IGticHMgKi8KLSAgICBPTVhfQVVESU9fUkFGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX1JBRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fUkFGb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19SQUZPUk1BVFRZUEU7Ci0KLS8qKiBSQSAoUmVhbCBBdWRpbykgcGFyYW1zICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1JBVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovIAotICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgICAvKio8IGlzIHRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YSAqLyAKLSAgICBPTVhfVTMyIG5CaXRzUGVyRnJhbWU7ICAgICAgLyoqPCBpcyB0aGUgdmFsdWUgZm9yIGJpdHMgcGVyIGZyYW1lICAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGVQZXJGcmFtZTsgICAgLyoqPCBpcyB0aGUgdmFsdWUgZm9yIHNhbXBsZXMgcGVyIGZyYW1lICovIAotICAgIE9NWF9VMzIgbkNvdXBsaW5nUXVhbnRCaXRzOyAvKio8IGlzIHRoZSBudW1iZXIgb2YgY291cGxpbmcgcXVhbnRpemF0aW9uIGJpdHMgaW4gdGhlIHN0cmVhbSAqLyAKLSAgICBPTVhfVTMyIG5Db3VwbGluZ1N0YXJ0UmVnaW9uOyAgIC8qKjwgaXMgdGhlIGNvdXBsaW5nIHN0YXJ0IHJlZ2lvbiBpbiB0aGUgc3RyZWFtICAqLyAKLSAgICBPTVhfVTMyIG5OdW1SZWdpb25zOyAgICAgICAgLyoqPCBpcyB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgdmFsdWUgKi8gCi0gICAgT01YX0FVRElPX1JBRk9STUFUVFlQRSBlRm9ybWF0OyAvKio8IGlzIHRoZSBSZWFsQXVkaW8gYXVkaW8gZm9ybWF0ICovCi19IE9NWF9BVURJT19QQVJBTV9SQVRZUEU7IAotCi0KLS8qKiBTQkMgQWxsb2NhdGlvbiBNZXRob2QgVHlwZSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19TQkNBTExPQ01FVEhPRFRZUEUgewotICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RMb3VkbmVzcywgLyoqPCBMb3VkbmVzcyBhbGxvY2F0aW9uIG1ldGhvZCAqLwotICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RTTlIsICAgICAgLyoqPCBTTlIgYWxsb2NhdGlvbiBtZXRob2QgKi8KLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19TQkNBTExPQ01FVEhPRFRZUEU7Ci0KLQotLyoqIFNCQyBwYXJhbXMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9TQkNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KLSAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCi0gICAgT01YX1UzMiBuQmxvY2tzOyAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYmxvY2tzICovCi0gICAgT01YX1UzMiBuU3ViYmFuZHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2Ygc3ViYmFuZHMgKi8KLSAgICBPTVhfVTMyIG5CaXRQb29sOyAgICAgICAgICAvKio8IEJpdHBvb2wgdmFsdWUgKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlQml0cmF0ZTsgICAvKio8IFVzZSBiaXRyYXRlIHZhbHVlIGluc3RlYWQgb2YgYml0cG9vbCAqLwotICAgIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgZUNoYW5uZWxNb2RlOyAvKio8IENoYW5uZWwgbW9kZSBlbnVtZXJhdGlvbiAqLwotICAgIE9NWF9BVURJT19TQkNBTExPQ01FVEhPRFRZUEUgZVNCQ0FsbG9jVHlwZTsgICAvKio8IFNCQyBBbGxvY2F0aW9uIG1ldGhvZCB0eXBlICovCi19IE9NWF9BVURJT19QQVJBTV9TQkNUWVBFOwotCi0KLS8qKiBBRFBDTSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAotICAgIE9NWF9VMzIgbkJpdHNQZXJTYW1wbGU7ICAgICAvKio8IE51bWJlciBvZiBiaXRzIGluIGVhY2ggc2FtcGxlICovIAotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLyAKLX0gT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRTsgCi0KLQotLyoqIEc3MjMgcmF0ZSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19HNzIzUkFURSB7Ci0gICAgT01YX0FVRElPX0c3MjNNb2RlVW51c2VkID0gMCwgIC8qKjwgQU1STkIgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCi0gICAgT01YX0FVRElPX0c3MjNNb2RlTG93LCAgICAgICAgIC8qKjwgNTMwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fRzcyM01vZGVIaWdoLCAgICAgICAgLyoqPCA2MzAwIGJwcyAqLwotICAgIE9NWF9BVURJT19HNzIzTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fRzcyM01vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19HNzIzTW9kZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0c3MjNSQVRFOwotCi0KLS8qKiBHNzIzIC0gU2FtcGxlIHJhdGUgbXVzdCBiZSA4IEtIeiAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLyAKLSAgICBPTVhfQVVESU9fRzcyM1JBVEUgZUJpdFJhdGU7ICAvKio8IHRvZG86IFNob3VsZCB0aGlzIGJlIG1vdmVkIHRvIGEgY29uZmlnPyAqLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8gCi0gICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgUG9zdCBGaWx0ZXIgKi8gCi19IE9NWF9BVURJT19QQVJBTV9HNzIzVFlQRTsgCi0KLQotLyoqIElUVSBHNzI2IChBRFBDTSkgcmF0ZSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19HNzI2TU9ERSB7Ci0gICAgT01YX0FVRElPX0c3MjZNb2RlVW51c2VkID0gMCwgIC8qKjwgRzcyNiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGUxNiwgICAgICAgICAgLyoqPCAxNiBrYnBzICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlMjQsICAgICAgICAgIC8qKjwgMjQga2JwcyAqLwotICAgIE9NWF9BVURJT19HNzI2TW9kZTMyLCAgICAgICAgICAvKio8IDMyIGticHMsIG1vc3QgY29tbW9uIHJhdGUsIGFsc28gRzcyMSAqLwotICAgIE9NWF9BVURJT19HNzI2TW9kZTQwLCAgICAgICAgICAvKio8IDQwIGticHMgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0c3MjZNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19HNzI2TU9ERTsKLQotCi0vKiogRy43MjYgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzIC0gbXVzdCBiZSBhdCA4S0h6ICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAotICAgICBPTVhfQVVESU9fRzcyNk1PREUgZUc3MjZNb2RlOwotfSBPTVhfQVVESU9fUEFSQU1fRzcyNlRZUEU7IAotCi0KLS8qKiBHNzI5IGNvZGVyIHR5cGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyOVRZUEUgewotICAgIE9NWF9BVURJT19HNzI5ID0gMCwgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5ICBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fRzcyOUEsICAgICAgICAgICAgICAvKio8IElUVSBHLjcyOSBhbm5leCBBICBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fRzcyOUIsICAgICAgICAgICAgICAvKio8IElUVSBHLjcyOSB3aXRoIGFubmV4IEIgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0c3MjlBQiwgICAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgYW5uZXhlcyBBIGFuZCBCIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19HNzI5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19HNzI5VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fRzcyOU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0c3MjlUWVBFOwotCi0KLS8qKiBHNzI5IHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAtIGZpeGVkIDZLSHogc2FtcGxlIHJhdGUgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzI5VFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0FVRElPX0c3MjlUWVBFIGVCaXRUeXBlOwotfSBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEU7Ci0KLQotLyoqIEFNUiBGcmFtZSBmb3JtYXQgKi8gCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRSB7IAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdENvbmZvcm1hbmNlID0gMCwgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBDb25mb3JtYW5jZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdGFuZGFyZCkgRm9ybWF0ICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElGMSwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBJbnRlcmZhY2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgMSAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJRjIsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgSW50ZXJmYWNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IDIqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRGU0YsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgRmlsZSBTdG9yYWdlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdFJUUFBheWxvYWQsICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBSZWFsLVRpbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgUHJvdG9jb2wgUGF5bG9hZCBGb3JtYXQgKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SVRVLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgSVRVIEZvcm1hdCAoYWRkZWQgYXQgTW90b3JvbGEgcmVxdWVzdCkgKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0TWF4ID0gMHg3RkZGRkZGRiAKLX0gT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRTsgCi0KLQotLyoqIEFNUiBiYW5kIG1vZGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIHsKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVVbnVzZWQgPSAwLCAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgdW51c2VkIC8gdW5rbm93biAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMCwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAwID0gIDQ3NTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIxLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDEgPSAgNTE1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjIsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMiA9ICA1OTAwIGJwcyAqLyAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjMsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMyA9ICA2NzAwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNCwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA0ID0gIDc0MDAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI1LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDUgPSAgNzk1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjYsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNiA9IDEwMjAwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNywgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA3ID0gMTIyMDAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IwLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDAgPSAgNjYwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjEsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMSA9ICA4ODUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMiwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAyID0gMTI2NTAgYnBzICovIAotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMywgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAzID0gMTQyNTAgYnBzICovIAotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA0ID0gMTU4NTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I1LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDUgPSAxODI1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjYsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNiA9IDE5ODUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNywgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA3ID0gMjMwNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I4LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDggPSAyMzg1MCBicHMgKi8gICAgICAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEU7Ci0gICAgIAotCi0vKiogQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIG1vZGUgKi8gCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkRUWE1PREVUWVBFIHsgCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPZmYgPSAwLCAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSBpcyBkaXNhYmxlZCAqLyAKLSAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9uVkFEMSwgICAgICAgICAvKio8IEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBNb2RlIHVzaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9pY2UgQWN0aXZpdHkgRGV0ZWN0b3IgMSAoVkFEMSkgaXMgZW5hYmxlZCAqLyAKLSAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9uVkFEMiwgICAgICAgICAvKio8IEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBNb2RlIHVzaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9pY2UgQWN0aXZpdHkgRGV0ZWN0b3IgMiAoVkFEMikgaXMgZW5hYmxlZCAqLyAgICAgICAKLSAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9uQXV0bywgICAgICAgICAvKio8IFRoZSBjb2RlYyB3aWxsIGF1dG9tYXRpY2FsbHkgc2VsZWN0IGJldHdlZW4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmYsIFZBRDEgb3IgVkFEMiBtb2RlcyAqLyAKLQotICAgIE9NWF9BVURJT19BTVJEVFhhc0VGUiwgICAgICAgICAgICAgLyoqPCBEVFggYXMgRUZSIGluc3RlYWQgb2YgQU1SIHN0YW5kYXJkICgzR1BQIDI2LjEwMSwgZnJhbWUgdHlwZSA9OCw5LDEwKSAqLwotCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlTWF4ID0gMHg3RkZGRkZGRiAKLX0gT01YX0FVRElPX0FNUkRUWE1PREVUWVBFOyAKLSAKLQotLyoqIEFNUiBwYXJhbXMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSByZWFkIG9ubHkgZmllbGQgKi8KLSAgICBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIGVBTVJCYW5kTW9kZTsgLyoqPCBBTVIgQmFuZCBNb2RlIGVudW1lcmF0aW9uICovIAotICAgIE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRSAgZUFNUkRUWE1vZGU7ICAvKio8IEFNUiBEVFggTW9kZSBlbnVtZXJhdGlvbiAqLwotICAgIE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEUgZUFNUkZyYW1lRm9ybWF0OyAvKio8IEFNUiBmcmFtZSBmb3JtYXQgZW51bWVyYXRpb24gKi8KLX0gT01YX0FVRElPX1BBUkFNX0FNUlRZUEU7Ci0KLQotLyoqIEdTTV9GUiAoRVRTSSAwNi4xMCwgM0dQUCA0Ni4wMTApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUZSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX0dTTUZSVFlQRTsKLQotCi0vKiogR1NNLUhSIChFVFNJIDA2LjIwLCAzR1BQIDQ2LjAyMCkgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fR1NNSFJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLwotfSBPTVhfQVVESU9fUEFSQU1fR1NNSFJUWVBFOwotCi0KLS8qKiBHU00tRUZSIChFVFNJIDA2LjYwLCAzR1BQIDQ2LjA2MCkgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fR1NNRUZSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX0dTTUVGUlRZUEU7Ci0KLQotLyoqIFRETUEgRlIgKFRJQS9FSUEtMTM2LTQyMCwgVlNFTFAgNy45NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1RETUFGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFOwotCi0KLS8qKiBURE1BIEVGUiAoVElBL0VJQS0xMzYtNDEwLCBBQ0VMUCA3LjRrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX1RETUFFRlJUWVBFOwotCi0KLS8qKiBQREMgRlIgKCBSQ1ItMjcsIFZTRUxQIDYuN2ticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BEQ0ZSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX1BEQ0ZSVFlQRTsKLQotCi0vKiogUERDIEVGUiAoIFJDUi0yNywgQUNFTFAgNi43a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUERDRUZSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEU7Ci0KLS8qKiBQREMgSFIgKCBSQ1ItMjcsIFBTSS1DRUxQIDMuNDVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QRENIUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9QRENIUlRZUEU7Ci0KLQotLyoqIENETUEgUmF0ZSB0eXBlcyAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19DRE1BUkFURVRZUEUgewotICAgIE9NWF9BVURJT19DRE1BUmF0ZUJsYW5rID0gMCwgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaXMgYmxhbmsgKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVGdWxsLCAgICAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIGZ1bGwgcmF0ZSAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZUhhbGYsICAgICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gaGFsZiByYXRlICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlUXVhcnRlciwgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBxdWFydGVyIHJhdGUgKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVFaWdodGgsICAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIGVpZ2h0aCByYXRlIChEVFgpKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVFcmFzdXJlLCAgICAgICAgICAgIC8qKjwgQ0RNQSBlcmFzdXJlIGZyYW1lICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19DRE1BUmF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFOwotCi0KLS8qKiBRQ0VMUDggKFRJQS9FSUEtOTYsIHVwIHRvIDhrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLwotICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IEZyYW1lIHJhdGUgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KLX0gT01YX0FVRElPX1BBUkFNX1FDRUxQOFRZUEU7Ci0KLQotLyoqIFFDRUxQMTMgKCBDRE1BLCBFSUEvVElBLTczMywgMTMuM2ticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1FDRUxQMTNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX0FVRElPX0NETUFSQVRFVFlQRSBlQ0RNQVJhdGU7IC8qKjwgRnJhbWUgcmF0ZSAqLwotICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWlubWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDEgKi8KLSAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgICAgICAvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gNCAqLwotfSBPTVhfQVVESU9fUEFSQU1fUUNFTFAxM1RZUEU7Ci0KLQotLyoqIEVWUkMgKCBDRE1BLCBFSUEvVElBLTEyNywgUkNFTFAgdXAgdG8gOC41NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0VWUkNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX0FVRElPX0NETUFSQVRFVFlQRSBlQ0RNQVJhdGU7IC8qKjwgYWN0dWFsIEZyYW1lIHJhdGUgKi8KLSAgICBPTVhfQk9PTCBiUkFURV9SRURVQ29uOyAgICAgICAvKio8IFJBVEVfUkVEVUN0aW9uIGlzIHJlcXVlc3RlZCBmb3IgdGhpcyBmcmFtZSAqLwotICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWlubWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDEgKi8KLSAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgICAgICAvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gNCAqLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBIaWdoIFBhc3MgRmlsdGVyICovCi0gICAgT01YX0JPT0wgYk5vaXNlU3VwcHJlc3NvcjsgICAgLyoqPCBFbmFibGUgZW5jb2RlcidzIG5vaXNlIHN1cHByZXNzb3IgcHJlLXByb2Nlc3NpbmcgKi8KLSAgICBPTVhfQk9PTCBiUG9zdEZpbHRlcjsgICAgICAgICAvKio8IEVuYWJsZSBkZWNvZGVyJ3MgcG9zdCBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX0VWUkNUWVBFOwotCi0KLS8qKiBTTVYgKCB1cCB0byA4LjU1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fU01WVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IEZyYW1lIHJhdGUgKi8KLSAgICBPTVhfQk9PTCBiUkFURV9SRURVQ29uOyAgICAgICAgICAgLyoqPCBSQVRFX1JFRFVDdGlvbiBpcyByZXF1ZXN0ZWQgZm9yIHRoaXMgZnJhbWUgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxID8/Ki8KLSAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgICAgICAvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gNCA/PyovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgZW5jb2RlcidzIEhpZ2ggUGFzcyBGaWx0ZXIgPz8qLwotICAgIE9NWF9CT09MIGJOb2lzZVN1cHByZXNzb3I7ICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBub2lzZSBzdXBwcmVzc29yIHByZS1wcm9jZXNzaW5nICovCi0gICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgZGVjb2RlcidzIHBvc3QgRmlsdGVyID8/Ki8KLX0gT01YX0FVRElPX1BBUkFNX1NNVlRZUEU7Ci0KLQotLyoqIE1JREkgRm9ybWF0IAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElGT1JNQVRUWVBFCi17Ci0gICAgT01YX0FVRElPX01JRElGb3JtYXRVbmtub3duID0gMCwgLyoqPCBNSURJIEZvcm1hdCB1bmtub3duIG9yIGRvbid0IGNhcmUgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdFNNRjAsICAgICAgICAvKio8IFN0YW5kYXJkIE1JREkgRmlsZSBUeXBlIDAgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdFNNRjEsICAgICAgICAvKio8IFN0YW5kYXJkIE1JREkgRmlsZSBUeXBlIDEgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdFNNRjIsICAgICAgICAvKio8IFN0YW5kYXJkIE1JREkgRmlsZSBUeXBlIDIgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdFNQTUlESSwgICAgICAvKio8IFNQLU1JREkgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdFhNRjAsICAgICAgICAvKio8IGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMCAqLwotICAgIE9NWF9BVURJT19NSURJRm9ybWF0WE1GMSwgICAgICAgIC8qKjwgZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAxICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRNb2JpbGVYTUYsICAgLyoqPCBNb2JpbGUgWE1GIChlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDIpICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19NSURJRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEU7Ci0KLQotLyoqIE1JREkgcGFyYW1zIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fTUlESVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkZpbGVTaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIE1JREkgZmlsZSBpbiBieXRlcywgd2hlcmUgdGhlIGVudGlyZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIGZpbGUgcGFzc2VkIGluLCBvdGhlcndpc2UgaWYgMHgwLCB0aGUgTUlESSBkYXRhIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG1lcmdlZCBhbmQgc3RyZWFtZWQgKGluc3RlYWQgb2YgcGFzc2VkIGFzIGFuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZSBNSURJIGZpbGUpICovCi0gICAgT01YX0JVMzIgc01heFBvbHlwaG9ueTsgICAgICAgIC8qKjwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpbXVsdGFuZW91cyBwb2x5cGhvbmljIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlcy4gQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlwaG9ueSBvZiB0aGUgZGV2aWNlIGlzIHVzZWQgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgT01YX0JPT0wgYkxvYWREZWZhdWx0U291bmQ7ICAgIC8qKjwgV2hldGhlciB0byBsb2FkIGRlZmF1bHQgc291bmQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuayBhdCBpbml0aWFsaXphdGlvbiAqLwotICAgIE9NWF9BVURJT19NSURJRk9STUFUVFlQRSBlTWlkaUZvcm1hdDsgLyoqPCBWZXJzaW9uIG9mIHRoZSBNSURJIGZpbGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0gT01YX0FVRElPX1BBUkFNX01JRElUWVBFOwotCi0KLS8qKiBUeXBlIG9mIHRoZSBNSURJIHNvdW5kIGJhbmsgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEUgewotICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rVW51c2VkID0gMCwgICAgICAgICAgIC8qKjwgdW51c2VkL3Vua25vd24gc291bmRiYW5rIHR5cGUgKi8KLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0RMUzEsICAgICAgICAgICAgICAgICAvKio8IERMUyB2ZXJzaW9uIDEgKi8KLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0RMUzIsICAgICAgICAgICAgICAgICAvKio8IERMUyB2ZXJzaW9uIDIgKi8KLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua01vYmlsZURMU0Jhc2UsICAgICAgICAvKio8IE1vYmlsZSBETFMsIHVzaW5nIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgKi8KLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua01vYmlsZURMU1BsdXNPcHRpb25zLCAvKio8IE1vYmlsZSBETFMsIHVzaW5nIHRoZSBzcGVjaWZpY2F0aW9uLWRlZmluZWQgb3B0aW9uYWwgZmVhdHVyZSBzZXQgKi8KLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19NSURJU09VTkRCQU5LVFlQRTsKLQotCi0vKiogQmFuayBMYXlvdXQgZGVzY3JpYmVzIGhvdyBiYW5rIE1TQiAmIExTQiBhcmUgdXNlZCBpbiB0aGUgRExTIGluc3RydW1lbnQgZGVmaW5pdGlvbnMgc291bmQgYmFuayAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRSB7Ci0gICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFVudXNlZCA9IDAsICAgLyoqPCB1bnVzZWQvdW5rbm93biBzb3VuZGJhbmsgdHlwZSAqLwotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRHTSwgICAgICAgICAgIC8qKjwgR1MgbGF5b3V0IChiYXNlZCBvbiBiYW5rIE1TQiAweDAwKSAqLwotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRHTTIsICAgICAgICAgIC8qKjwgR2VuZXJhbCBNSURJIDIgbGF5b3V0ICh1c2luZyBNU0IgMHg3OC8weDc5LCBMU0IgMHgwMCkgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0VXNlciwgICAgICAgICAvKio8IERvZXMgbm90IGNvbmZvcm0gdG8gYW55IGJhbmsgbnVtYmVyaW5nIHN0YW5kYXJkcyAqLwotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX01JRElTT1VOREJBTktMQVlPVVRUWVBFOwotCi0KLS8qKiBNSURJIHBhcmFtcyB0byBsb2FkL3VubG9hZCB1c2VyIHNvdW5kYmFuayAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01JRElMT0FEVVNFUlNPVU5EVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuRExTSW5kZXg7ICAgICAgICAvKio8IERMUyBmaWxlIGluZGV4IHRvIGJlIGxvYWRlZCAqLwotICAgIE9NWF9VMzIgbkRMU1NpemU7ICAgICAgICAgLyoqPCBTaXplIGluIGJ5dGVzICovCi0gICAgT01YX1BUUiBwRExTRGF0YTsgICAgICAgICAvKio8IFBvaW50ZXIgdG8gRExTIGZpbGUgZGF0YSAqLwotICAgIE9NWF9BVURJT19NSURJU09VTkRCQU5LVFlQRSBlTWlkaVNvdW5kQmFuazsgICAvKio8IE1pZGkgc291bmQgYmFuayB0eXBlIGVudW1lcmF0aW9uICovCi0gICAgT01YX0FVRElPX01JRElTT1VOREJBTktMQVlPVVRUWVBFIGVNaWRpU291bmRCYW5rTGF5b3V0OyAvKio8IE1pZGkgc291bmQgYmFuayBsYXlvdXQgZW51bWVyYXRpb24gKi8KLX0gT01YX0FVRElPX1BBUkFNX01JRElMT0FEVVNFUlNPVU5EVFlQRTsKLQotCi0vKiogU3RydWN0dXJlIGZvciBMaXZlIE1JREkgZXZlbnRzIGFuZCBNSVAgbWVzc2FnZXMuIAotICogKE1JUCA9IE1heGltdW0gSW5zdGFudGFuZW91cyBQb2x5cGhvbnk7IHBhcnQgb2YgdGhlIFNQLU1JREkgc3RhbmRhcmQuKSAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJSU1NRURJQVRFRVZFTlRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5NaWRpRXZlbnRTaXplOyAgIC8qKjwgU2l6ZSBvZiBpbW1lZGlhdGUgTUlESSBldmVudHMgb3IgTUlQIG1lc3NhZ2UgaW4gYnl0ZXMgICovCi0gICAgT01YX1U4IG5NaWRpRXZlbnRzWzFdOyAgICAvKio8IE1JREkgZXZlbnQgYXJyYXkgdG8gYmUgcmVuZGVyZWQgaW1tZWRpYXRlbHksIG9yIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IGZvciB0aGUgTUlQIG1lc3NhZ2UgYnVmZmVyLCB3aGVyZSB0aGUgc2l6ZSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVkIGJ5IG5NaWRpRXZlbnRTaXplICovCi19IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRTsKLQotCi0vKiogTUlESSBzb3VuZCBiYW5rLyBwcm9ncmFtIHBhaXIgaW4gYSBnaXZlbiBjaGFubmVsIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgVmFsaWQgY2hhbm5lbCB2YWx1ZXMgcmFuZ2UgZnJvbSAxIHRvIDE2ICovCi0gICAgT01YX1UxNiBuSURQcm9ncmFtOyAgICAgICAgIC8qKjwgVmFsaWQgcHJvZ3JhbSBJRCByYW5nZSBpcyAxIHRvIDEyOCAqLwotICAgIE9NWF9VMTYgbklEU291bmRCYW5rOyAgICAgICAvKio8IFNvdW5kIGJhbmsgSUQgKi8KLSAgICBPTVhfVTMyIG5Vc2VyU291bmRCYW5rSW5kZXg7LyoqPCBVc2VyIHNvdW5kYmFuayBpbmRleCwgZWFzaWVyIHRvIGFjY2VzcyBzb3VuZGJhbmtzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGluZGV4IGlmIG11bHRpcGxlIGJhbmtzIGFyZSBwcmVzZW50ICovCi19IE9NWF9BVURJT19DT05GSUdfTUlESVNPVU5EQkFOS1BST0dSQU1UWVBFOwotCi0KLS8qKiBNSURJIGNvbnRyb2wgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESUNPTlRST0xUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQlMzMiBzUGl0Y2hUcmFuc3Bvc2l0aW9uOyAvKio8IFBpdGNoIHRyYW5zcG9zaXRpb24gaW4gc2VtaXRvbmVzLCBzdG9yZWQgYXMgUTIyLjEwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IGJhc2VkIG9uIEpBVkEgTU1BUEkgKEpTUi0xMzUpIHJlcXVpcmVtZW50ICovCi0gICAgT01YX0JVMzIgc1BsYXlCYWNrUmF0ZTsgICAgICAgLyoqPCBSZWxhdGl2ZSBwbGF5YmFjayByYXRlLCBzdG9yZWQgYXMgUTE0LjE3IGZpeGVkLXBvaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmFzZWQgb24gSlNSLTEzNSByZXF1aXJlbWVudCAqLwotICAgIE9NWF9CVTMyIHNUZW1wbyA7ICAgICAgICAgICAgIC8qKjwgVGVtcG8gaW4gYmVhdHMgcGVyIG1pbnV0ZSAoQlBNKSwgc3RvcmVkIGFzIFEyMi4xMCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkLXBvaW50IG51bWJlciBiYXNlZCBvbiBKU1ItMTM1IHJlcXVpcmVtZW50ICovCi0gICAgT01YX1UzMiBuTWF4UG9seXBob255OyAgICAgICAgLyoqPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2ltdWx0YW5lb3VzIHBvbHlwaG9uaWMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZXMuIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlwaG9ueSBvZiB0aGUgZGV2aWNlIGlzIHVzZWQgICovCi0gICAgT01YX1UzMiBuTnVtUmVwZWF0OyAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHBsYXliYWNrICovCi0gICAgT01YX1UzMiBuU3RvcFRpbWU7ICAgICAgICAgICAgLyoqPCBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBpbmRpY2F0ZSB3aGVuIHBsYXliYWNrIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBzdG9wIGF1dG9tYXRpY2FsbHkuICBTZXQgdG8gemVybyBpZiBub3QgdXNlZCAqLwotICAgIE9NWF9VMTYgbkNoYW5uZWxNdXRlTWFzazsgICAgIC8qKjwgMTYgYml0IG1hc2sgZm9yIGNoYW5uZWwgbXV0ZSBzdGF0dXMgKi8KLSAgICBPTVhfVTE2IG5DaGFubmVsU29sb01hc2s7ICAgICAvKio8IDE2IGJpdCBtYXNrIGZvciBjaGFubmVsIHNvbG8gc3RhdHVzICovCi0gICAgT01YX1UzMiBuVHJhY2swMDMxTXV0ZU1hc2s7ICAgLyoqPCAzMiBiaXQgbWFzayBmb3IgdHJhY2sgbXV0ZSBzdGF0dXMuIE5vdGU6IFRoaXMgaXMgZm9yIHRyYWNrcyAwLTMxICovCi0gICAgT01YX1UzMiBuVHJhY2szMjYzTXV0ZU1hc2s7ICAgLyoqPCAzMiBiaXQgbWFzayBmb3IgdHJhY2sgbXV0ZSBzdGF0dXMuIE5vdGU6IFRoaXMgaXMgZm9yIHRyYWNrcyAzMi02MyAqLwotICAgIE9NWF9VMzIgblRyYWNrMDAzMVNvbG9NYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIHNvbG8gc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMC0zMSAqLwotICAgIE9NWF9VMzIgblRyYWNrMzI2M1NvbG9NYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIHNvbG8gc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMzItNjMgKi8KLQotfSBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRTsKLQotCi0vKiogTUlESSBQbGF5YmFjayBTdGF0ZXMgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVBMQVlCQUNLU1RBVEVUWVBFIHsKLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlVW5rbm93biA9IDAsICAgICAgLyoqPCBVbmtub3duIHN0YXRlIG9yIHN0YXRlIGRvZXMgbm90IG1hcCB0byAKLSAgCQkJCQkJCQkJCQkJCW90aGVyIGRlZmluZWQgc3RhdGVzICovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZUNsb3NlZEVuZ2FnZWQsICAgIC8qKjwgTm8gTUlESSByZXNvdXJjZSBpcyBjdXJyZW50bHkgb3Blbi4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JREkgZXZlbnRzLiAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQYXJzaW5nLCAgICAgICAgICAvKio8IEEgTUlESSByZXNvdXJjZSBpcyBvcGVuIGFuZCBpcyBiZWluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltZWQuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBNSURJIGV2ZW50cy4gKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlT3BlbkVuZ2FnZWQsICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgcHJpbWVkIGJ1dCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcGxheWluZy4gVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgTUlESSBldmVudHMuIFRoZSB0cmFuc2l0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdGF0ZSBpcyBvbmx5IHBvc3NpYmxlIGZyb20gdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmcgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgJ3BsYXliYWNrIGhlYWQnIHJlYWNoZXMgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG1lZGlhIGRhdGEgb3IgdGhlIHBsYXliYWNrIHN0b3BzIGR1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0b3AgdGltZSBzZXQuKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZywgICAgICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWluZy4gVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgTUlESSBldmVudHMuKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZ1BhcnRpYWxseSwgLyoqPCBCZXN0LWVmZm9ydCBwbGF5YmFjayBkdWUgdG8gU1AtTUlESS9ETFMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBjb25zdHJhaW50cyAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nU2lsZW50bHksICAvKio8IER1ZSB0byBzeXN0ZW0gcmVzb3VyY2UgY29uc3RyYWludHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1AtTUlESSBjb250ZW50IGNvbnN0cmFpbnRzLCB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGF1ZGlibGUgTUlESSBjb250ZW50IGR1cmluZyBwbGF5YmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseS4gVGhlIHNpdHVhdGlvbiBtYXkgY2hhbmdlIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIGFyZSBmcmVlZCBsYXRlci4qLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX01JRElQTEFZQkFDS1NUQVRFVFlQRTsKLQotCi0vKiogTUlESSBzdGF0dXMgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMTYgbk51bVRyYWNrczsgICAgICAgICAvKio8IE51bWJlciBvZiBNSURJIHRyYWNrcyBpbiB0aGUgZmlsZSwgcmVhZCBvbmx5IGZpZWxkLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgdW50aWwgdGhlIGVudGlyZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICAqLwotICAgIE9NWF9VMzIgbkR1cmF0aW9uOyAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnRseSBvcGVuIE1JREkgcmVzb3VyY2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbWlsbGlzZWNvbmRzLiBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICAqLyAgCi0gICAgT01YX1UzMiBuUG9zaXRpb247ICAgICAgICAgIC8qKjwgQ3VycmVudCBQb3NpdGlvbiBvZiB0aGUgTUlESSByZXNvdXJjZSBiZWluZyBwbGF5ZWQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JPT0wgYlZpYnJhOyAgICAgICAgICAgIC8qKjwgRG9lcyBWaWJyYSB0cmFjayBleGlzdD8gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAqLwotICAgIE9NWF9VMzIgbk51bU1ldGFFdmVudHM7ICAgICAvKio8IFRvdGFsIG51bWJlciBvZiBNSURJIE1ldGEgRXZlbnRzIGluIHRoZSBjdXJyZW50bHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBNSURJIHJlc291cmNlLiBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICAqLwotICAgIE9NWF9VMzIgbk51bUFjdGl2ZVZvaWNlczsgICAvKio8IE51bWJlciBvZiBhY3RpdmUgdm9pY2VzIGluIHRoZSBjdXJyZW50bHkgcGxheWluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIHJlc291cmNlLiBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgdW50aWwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICovCi0gICAgT01YX0FVRElPX01JRElQTEFZQkFDS1NUQVRFVFlQRSBlTUlESVBsYXlCYWNrU3RhdGU7ICAvKio8IE1JREkgcGxheWJhY2sgc3RhdGUgZW51bWVyYXRpb24sIHJlYWQgb25seSBmaWVsZCAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElTVEFUVVNUWVBFOwotCi0KLS8qKiBNSURJIE1ldGEgRXZlbnQgc3RydWN0dXJlIG9uZSBwZXIgTWV0YSBFdmVudC4KLSAqICBNSURJIE1ldGEgRXZlbnRzIGFyZSBsaWtlIGF1ZGlvIG1ldGFkYXRhLCBleGNlcHQgdGhhdCB0aGV5IGFyZSBpbnRlcnNwZXJzZWQgCi0gKiAgd2l0aCB0aGUgTUlESSBjb250ZW50IHRocm91Z2hvdXQgdGhlIGZpbGUgYW5kIGFyZSBub3QgbG9jYWxpemVkIGluIHRoZSBoZWFkZXIuIAotICogIEFzIHN1Y2gsIGl0IGlzIG5lY2Vzc2FyeSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBNZXRhIEV2ZW50cyBmcm9tIAotICogIHRoZSBlbmdpbmUsIGFzIGl0IGVuY291bnRlcnMgdGhlc2UgTWV0YSBFdmVudHMgd2l0aGluIHRoZSBNSURJIGNvbnRlbnQuIAotICogIEZvciBleGFtcGxlLCBTTUYgZmlsZXMgY2FuIGhhdmUgdXAgdG8gMTQgdHlwZXMgb2YgTUlESSBNZXRhIEV2ZW50cyAoY29weXJpZ2h0LCAKLSAqICBhdXRob3IsIGRlZmF1bHQgdGVtcG8sIGV0Yy4pIHNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZSBmaWxlLiAKLSAqICBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVFRZUEV7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkluZGV4OyAgICAgICAgICAgLyoqPCBJbmRleCBvZiBNZXRhIEV2ZW50ICovIAotICAgIE9NWF9VOCBuTWV0YUV2ZW50VHlwZTsgICAgLyoqPCBNZXRhIEV2ZW50IFR5cGUsIDdiaXRzIChpLmUuIDAgLSAxMjcpICovIAotICAgIE9NWF9VMzIgbk1ldGFFdmVudFNpemU7ICAgLyoqPCBzaXplIG9mIHRoZSBNZXRhIEV2ZW50IGluIGJ5dGVzICovIAotICAgIE9NWF9VMzIgblRyYWNrOyAgICAgICAgICAgLyoqPCB0cmFjayBudW1iZXIgZm9yIHRoZSBtZXRhIGV2ZW50ICovCi0gICAgT01YX1UzMiBuUG9zaXRpb247ICAgICAgICAvKio8IFBvc2l0aW9uIG9mIHRoZSBtZXRhLWV2ZW50IGluIG1pbGxpc2Vjb25kcyAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFOyAKLQotCi0vKiogTUlESSBNZXRhIEV2ZW50IERhdGEgc3RydWN0dXJlIC0gb25lIHBlciBNZXRhIEV2ZW50LiAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVERBVEFUWVBFeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKLSAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgIC8qKjwgSW5kZXggb2YgTWV0YSBFdmVudCAqLyAKLSAgICBPTVhfVTMyIG5NZXRhRXZlbnRTaXplOyAgIC8qKjwgc2l6ZSBvZiB0aGUgTWV0YSBFdmVudCBpbiBieXRlcyAqLyAKLSAgICBPTVhfVTggbkRhdGFbMV07ICAgICAgICAgIC8qKjwgYXJyYXkgb2Ygb25lIG9yIG1vcmUgYnl0ZXMgb2YgbWV0YSBkYXRhIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBpbmRpY2F0ZWQgYnkgdGhlIG5NZXRhRXZlbnRTaXplIGZpZWxkICovIAotfSBPTVhfQVVESU9fQ09ORklHX19NSURJTUVUQUVWRU5UREFUQVRZUEU7IAotCi0KLS8qKiBBdWRpbyBWb2x1bWUgYWRqdXN0bWVudCBmb3IgYSBwb3J0ICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1ZPTFVNRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0byAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3Mgdm9sdW1lLiAgU2VsZWN0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUuICovCi0gICAgT01YX0JPT0wgYkxpbmVhcjsgICAgICAgICAgIC8qKjwgSXMgdGhlIHZvbHVtZSB0byBiZSBzZXQgaW4gbGluZWFyICgwLjEwMCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbG9nYXJpdGhtaWMgc2NhbGUgKG1CKSAqLwotICAgIE9NWF9CUzMyIHNWb2x1bWU7ICAgICAgICAgICAvKio8IFZvbHVtZSBsaW5lYXIgc2V0dGluZyBpbiB0aGUgMC4uMTAwIHJhbmdlLCBPUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZSBsb2dhcml0aG1pYyBzZXR0aW5nIGZvciB0aGlzIHBvcnQuICBUaGUgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHZvbHVtZSBhcmUgaW4gbUIgKG1pbGxpYmVscyA9IDEvMTAwIGRCKSByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgZ2FpbiBvZiAxIChlLmcuIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGxldmVsKS4gIFZhbHVlcyBhcmUgaW4gbUIgZnJvbSBuTWF4IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXhpbXVtIHZvbHVtZSkgdG8gbk1pbiBtQiAodHlwaWNhbGx5IG5lZ2F0aXZlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGUgdm9sdW1lIGlzICJ2b2x0YWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgYSAicG93ZXIiLCBpdCB0YWtlcyBhIHNldHRpbmcgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjAwIG1CIHRvIGRlY3JlYXNlIHRoZSB2b2x1bWUgYnkgMS8yLiAgSWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbXBvbmVudCBjYW5ub3QgYWNjdXJhdGVseSBzZXQgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSB0byB0aGUgcmVxdWVzdGVkIHZhbHVlLCBpdCBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSB2b2x1bWUgdG8gdGhlIGNsb3Nlc3QgdmFsdWUgQkVMT1cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdGVkIHZhbHVlLiAgV2hlbiBnZXR0aW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSBzZXR0aW5nLCB0aGUgY3VycmVudCBhY3R1YWwgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSByZXR1cm5lZC4gKi8KLX0gT01YX0FVRElPX0NPTkZJR19WT0xVTUVUWVBFOwotCi0KLS8qKiBBdWRpbyBWb2x1bWUgYWRqdXN0bWVudCBmb3IgYSBjaGFubmVsICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxWT0xVTUVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIHZvbHVtZS4gIFNlbGVjdCB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLiAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IGNoYW5uZWwgdG8gc2VsZWN0IGZyb20gMCB0byBOLTEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIE9NWF9BTEwgdG8gYXBwbHkgdm9sdW1lIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsIGNoYW5uZWxzICovCi0gICAgT01YX0JPT0wgYkxpbmVhcjsgICAgICAgICAgIC8qKjwgSXMgdGhlIHZvbHVtZSB0byBiZSBzZXQgaW4gbGluZWFyICgwLjEwMCkgb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nYXJpdGhtaWMgc2NhbGUgKG1CKSAqLwotICAgIE9NWF9CUzMyIHNWb2x1bWU7ICAgICAgICAgICAvKio8IFZvbHVtZSBsaW5lYXIgc2V0dGluZyBpbiB0aGUgMC4uMTAwIHJhbmdlLCBPUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZSBsb2dhcml0aG1pYyBzZXR0aW5nIGZvciB0aGlzIHBvcnQuICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGZvciB2b2x1bWUgYXJlIGluIG1CIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaWxsaWJlbHMgPSAxLzEwMCBkQikgcmVsYXRpdmUgdG8gYSBnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgMSAoZS5nLiB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBsZXZlbCkuICBWYWx1ZXMgYXJlIGluIG1CIGZyb20gbk1heCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGUgdm9sdW1lIGlzICJ2b2x0YWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgYSAicG93ZXIiLCBpdCB0YWtlcyBhIHNldHRpbmcgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjAwIG1CIHRvIGRlY3JlYXNlIHRoZSB2b2x1bWUgYnkgMS8yLiAgSWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbXBvbmVudCBjYW5ub3QgYWNjdXJhdGVseSBzZXQgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSB0byB0aGUgcmVxdWVzdGVkIHZhbHVlLCBpdCBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSB2b2x1bWUgdG8gdGhlIGNsb3Nlc3QgdmFsdWUgQkVMT1cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdGVkIHZhbHVlLiAgV2hlbiBnZXR0aW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSBzZXR0aW5nLCB0aGUgY3VycmVudCBhY3R1YWwgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSByZXR1cm5lZC4gKi8KLSAgICBPTVhfQk9PTCBiSXNNSURJOyAgICAgICAgICAgLyoqPCBUUlVFIGlmIG5DaGFubmVsIHJlZmVycyB0byBhIE1JREkgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBvdGhlcndpc2UgKi8KLX0gT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRTsKLQotCi0vKiogQXVkaW8gYmFsYW5jZSBzZXR0aW5nICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0JBTEFOQ0VUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIGJhbGFuY2UuICBTZWxlY3QgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UuICovCi0gICAgT01YX1MzMiBuQmFsYW5jZTsgICAgICAgICAgIC8qKjwgYmFsYW5jZSBzZXR0aW5nIGZvciB0aGlzIHBvcnQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xMDAgdG8gMTAwLCB3aGVyZSAtMTAwIGluZGljYXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBsZWZ0LCBhbmQgbm8gcmlnaHQgKi8KLX0gT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRTsKLQotCi0vKiogQXVkaW8gUG9ydCBtdXRlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01VVEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIG11dGUuICBTZWxlY3QgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGUuICovCi0gICAgT01YX0JPT0wgYk11dGU7ICAgICAgICAgICAgIC8qKjwgTXV0ZSBzZXR0aW5nIGZvciB0aGlzIHBvcnQgKi8KLX0gT01YX0FVRElPX0NPTkZJR19NVVRFVFlQRTsKLQotCi0vKiogQXVkaW8gQ2hhbm5lbCBtdXRlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxNVVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgY2hhbm5lbCB0byBzZWxlY3QgZnJvbSAwIHRvIE4tMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgT01YX0FMTCB0byBhcHBseSBtdXRlIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsIGNoYW5uZWxzICovCi0gICAgT01YX0JPT0wgYk11dGU7ICAgICAgICAgICAgIC8qKjwgTXV0ZSBzZXR0aW5nIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgICBPTVhfQk9PTCBiSXNNSURJOyAgICAgICAgICAgLyoqPCBUUlVFIGlmIG5DaGFubmVsIHJlZmVycyB0byBhIE1JREkgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBvdGhlcndpc2UgKi8gCi19IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTE1VVEVUWVBFOwotCi0KLQotLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIGxvdWRuZXNzIGNvbnRyb2wsIHdoaWNoIGJvb3N0cyBiYXNzIGFuZCB0byBhIAotICogIHNtYWxsZXIgZXh0ZW50IGhpZ2ggZW5kIGZyZXF1ZW5jaWVzIHRvIGNvbXBlbnNhdGUgZm9yIGhlYXJpbmcKLSAqICBhYmlsaXR5IGF0IHRoZSBleHRyZW1lIGVuZHMgb2YgdGhlIGF1ZGlvIHNwZWN0cnVtCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkxvdWRuZXNzOyAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgbG91ZG5lc3MgKi8KLX0gT01YX0FVRElPX0NPTkZJR19MT1VETkVTU1RZUEU7Ci0KLQotLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIGJhc3MsIHdoaWNoIGNvbnRyb2xzIGxvdyBmcmVxdWVuY2llcwotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19CQVNTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgYmFzcyBjb250cm9sICovCi0gICAgT01YX1MzMiBuQmFzczsgICAgICAgICAgICAgLyoqPCBiYXNzIHNldHRpbmcgZm9yIHRoZSBwb3J0LCBhcyBhIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIG1lYW5zIG5vIGNoYW5nZSBpbiBiYXNzIGxldmVsKSovCi19IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEU7Ci0KLQotLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIHRyZWJsZSwgd2hpY2ggY29udHJvbHMgaGlnaCBmcmVxdWVuY2llcyB0b25lcwotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19UUkVCTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciB0cmVibGUgY29udHJvbCAqLwotICAgIE9NWF9TMzIgIG5UcmVibGU7ICAgICAgICAgIC8qKjwgdHJlYmxlIHNldHRpbmcgZm9yIHRoZSBwb3J0LCBhcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzIHZhbHVlIGZyb20gLTEwMCB0byAxMDAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgbWVhbnMgbm8gY2hhbmdlIGluIHRyZWJsZSBsZXZlbCkgKi8KLX0gT01YX0FVRElPX0NPTkZJR19UUkVCTEVUWVBFOwotCi0KLS8qKiBBbiBlcXVhbGl6ZXIgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHR3byByZWFzb25zOiB0byBjb21wZW5zYXRlIGZvciBhbiAKLSAqICBzdWItb3B0aW1hbCBmcmVxdWVuY3kgcmVzcG9uc2Ugb2YgYSBzeXN0ZW0gdG8gbWFrZSBpdCBzb3VuZCBtb3JlIG5hdHVyYWwgCi0gKiAgb3IgdG8gY3JlYXRlIGludGVudGlvbmFsbHkgc29tZSB1bm5hdHVyYWwgY29sb3JpbmcgdG8gdGhlIHNvdW5kIHRvIGNyZWF0ZQotICogIGFuIGVmZmVjdC4KLSAqICBAaW5ncm91cCBlZmZlY3RzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfRVFVQUxJWkVSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgZXF1YWxpemVyICovCi0gICAgT01YX0JVMzIgc0JhbmRJbmRleDsgICAgICAgLyoqPCBCYW5kIG51bWJlciB0byBiZSBzZXQuICBVcHBlciBMaW1pdCBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tMSwgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGJhbmRzLCBsb3dlciBsaW1pdCBpcyAwICovCi0gICAgT01YX0JVMzIgc0NlbnRlckZyZXE7ICAgICAgLyoqPCBDZW50ZXIgZnJlcXVlY2llcyBpbiBIei4gIFRoaXMgaXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBvbmx5IGVsZW1lbnQgYW5kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxvd2VyLCBjZW50ZXIgYW5kIHVwcGVyIGZyZXF1ZW5jeSBvZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmFuZC4gICovCi0gICAgT01YX0JTMzIgc0JhbmRMZXZlbDsgICAgICAgLyoqPCBiYW5kIGxldmVsIGluIG1pbGxpYmVscyAqLwotfSBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEU7Ci0KLQotLyoqIFN0ZXJlbyB3aWRlbmluZyBtb2RlIHR5cGUgCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8gCi10eXBlZGVmIGVudW0gT01YX0FVRElPX1NURVJFT1dJREVOSU5HVFlQRSB7Ci0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nSGVhZHBob25lcywgICAgLyoqPCBTdGVyZW8gd2lkZW5pbmcgZm9yIGxvdWRzcGVha2VycyAqLwotICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0xvdWRzcGVha2VycywgIC8qKjwgU3RlcmVvIHdpZGVuaW5nIGZvciBjbG9zZWx5IHNwYWNlZCBsb3Vkc3BlYWtlcnMgKi8KLSAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEU7Ci0KLQotLyoqIENvbnRyb2wgZm9yIHN0ZXJlbyB3aWRlbmluZywgd2hpY2ggaXMgYSBzcGVjaWFsIDItY2hhbm5lbAotICogIGNhc2Ugb2YgdGhlIGF1ZGlvIHZpcnR1YWxpemVyIGVmZmVjdC4gRm9yIGV4YW1wbGUsIGZvciA1LjEtY2hhbm5lbCAKLSAqICBvdXRwdXQsIGl0IHRyYW5zbGF0ZXMgdG8gdmlydHVhbCBzdXJyb3VuZCBzb3VuZC4gCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3Igc3RlcmVvIHdpZGVuaW5nIGNvbnRyb2wgKi8KLSAgICBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFIGVXaWRlbmluZ1R5cGU7IC8qKjwgU3RlcmVvIHdpZGVuaW5nIGFsZ29yaXRobSB0eXBlICovCi0gICAgT01YX1UzMiAgblN0ZXJlb1dpZGVuaW5nOyAgLyoqPCBzdGVyZW8gd2lkZW5pbmcgc2V0dGluZyBmb3IgdGhlIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAwIHRvIDEwMCAgKi8KLX0gT01YX0FVRElPX0NPTkZJR19TVEVSRU9XSURFTklOR1RZUEU7Ci0KLQotLyoqIFRoZSBjaG9ydXMgZWZmZWN0IChvciBgYGNob3JhbGl6ZXInJykgaXMgYW55IHNpZ25hbCBwcm9jZXNzb3Igd2hpY2ggbWFrZXMKLSAqICBvbmUgc291bmQgc291cmNlIChzdWNoIGFzIGEgdm9pY2UpIHNvdW5kIGxpa2UgbWFueSBzdWNoIHNvdXJjZXMgc2luZ2luZyAKLSAqICAob3IgcGxheWluZykgaW4gdW5pc29uLiBTaW5jZSBwZXJmb3JtYW5jZSBpbiB1bmlzb24gaXMgbmV2ZXIgZXhhY3QsIGNob3J1cyAKLSAqICBlZmZlY3RzIHNpbXVsYXRlIHRoaXMgYnkgbWFraW5nIGluZGVwZW5kZW50bHkgbW9kaWZpZWQgY29waWVzIG9mIHRoZSBpbnB1dCAKLSAqICBzaWduYWwuIE1vZGlmaWNhdGlvbnMgbWF5IGluY2x1ZGUgKDEpIGRlbGF5LCAoMikgZnJlcXVlbmN5IHNoaWZ0LCBhbmQgCi0gKiAgKDMpIGFtcGxpdHVkZSBtb2R1bGF0aW9uLgotICogQGluZ3JvdXAgZWZmZWN0cwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0NIT1JVU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGNob3J1cyAqLwotICAgIE9NWF9CVTMyIHNEZWxheTsgICAgICAgICAgIC8qKjwgYXZlcmFnZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlUzMiBzTW9kdWxhdGlvblJhdGU7ICAvKio8IHJhdGUgb2YgbW9kdWxhdGlvbiBpbiBtaWxsaWhlcnR6ICovCi0gICAgT01YX1UzMiBuTW9kdWxhdGlvbkRlcHRoOyAgLyoqPCBkZXB0aCBvZiBtb2R1bGF0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5IChpLmUuIDAgdG8gMTAwKSAqLwotICAgIE9NWF9CVTMyIG5GZWVkYmFjazsgICAgICAgIC8qKjwgRmVlZGJhY2sgZnJvbSBjaG9ydXMgb3V0cHV0IHRvIGlucHV0IGluIHBlcmNlbnRhZ2UgKi8KLX0gT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFOwotCi0KLS8qKiBSZXZlcmJlcmF0aW9uIGlzIHBhcnQgb2YgdGhlIHJlZmxlY3RlZCBzb3VuZCB0aGF0IGZvbGxvd3MgdGhlIGVhcmx5IAotICogIHJlZmxlY3Rpb25zLiBJbiBhIHR5cGljYWwgcm9vbSwgdGhpcyBjb25zaXN0cyBvZiBhIGRlbnNlIHN1Y2Nlc3Npb24gb2YgCi0gKiAgZWNob2VzIHdob3NlIGVuZXJneSBkZWNheXMgZXhwb25lbnRpYWxseS4gVGhlIHJldmVyYmVyYXRpb24gZWZmZWN0IHN0cnVjdHVyZSAKLSAqICBhcyBkZWZpbmVkIGhlcmUgaW5jbHVkZXMgYm90aCAoZWFybHkpIHJlZmxlY3Rpb25zIGFzIHdlbGwgYXMgKGxhdGUpIHJldmVyYmVyYXRpb25zLiAKLSAqIEBpbmdyb3VwIGVmZmVjdHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19SRVZFUkJFUkFUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgcmV2ZXJiZXJhdGlvbiBjb250cm9sICovCi0gICAgT01YX0JTMzIgc1Jvb21MZXZlbDsgICAgICAgICAgLyoqPCBJbnRlbnNpdHkgbGV2ZWwgZm9yIHRoZSB3aG9sZSByb29tIGVmZmVjdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGJvdGggZWFybHkgcmVmbGVjdGlvbnMgYW5kIGxhdGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcmJlcmF0aW9uKSBpbiBtaWxsaWJlbHMgKi8KLSAgICBPTVhfQlMzMiBzUm9vbUhpZ2hGcmVxTGV2ZWw7ICAvKio8IEF0dGVudWF0aW9uIGF0IGhpZ2ggZnJlcXVlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBpbnRlbnNpdHkgYXQgbG93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyBpbiBtaWxsaWJlbHMgKi8KLSAgICBPTVhfQlMzMiBzUmVmbGVjdGlvbnNMZXZlbDsgICAvKio8IEludGVuc2l0eSBsZXZlbCBvZiBlYXJseSByZWZsZWN0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbGF0aXZlIHRvIHJvb20gdmFsdWUpLCBpbiBtaWxsaWJlbHMgKi8KLSAgICBPTVhfQlUzMiBzUmVmbGVjdGlvbnNEZWxheTsgICAvKio8IERlbGF5IHRpbWUgb2YgdGhlIGZpcnN0IHJlZmxlY3Rpb24gcmVsYXRpdmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgZGlyZWN0IHBhdGgsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE9NWF9CUzMyIHNSZXZlcmJMZXZlbDsgICAgICAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIG9mIGxhdGUgcmV2ZXJiZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gcm9vbSBsZXZlbCwgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JVMzIgc1JldmVyYkRlbGF5OyAgICAgICAgLyoqPCBUaW1lIGRlbGF5IGZyb20gdGhlIGZpcnN0IGVhcmx5IHJlZmxlY3Rpb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsYXRlIHJldmVyYmVyYXRpb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlUzMiBzRGVjYXlUaW1lOyAgICAgICAgICAvKio8IExhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSB0aW1lIGF0IGxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmNpZXMsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE9NWF9CVTMyIG5EZWNheUhpZ2hGcmVxUmF0aW87IC8qKjwgUmF0aW8gb2YgaGlnaCBmcmVxdWVuY3kgZGVjYXkgdGltZSByZWxhdGl2ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxvdyBmcmVxdWVuY3kgZGVjYXkgdGltZSBpbiBwZXJjZW50ICAqLwotICAgIE9NWF9VMzIgbkRlbnNpdHk7ICAgICAgICAgICAgIC8qKjwgTW9kYWwgZGVuc2l0eSBpbiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcGVyY2VudCAoaS5lLiAwIC0gMTAwKSAqLwotICAgIE9NWF9VMzIgbkRpZmZ1c2lvbjsgICAgICAgICAgIC8qKjwgRWNobyBkZW5zaXR5IGluIHRoZSBsYXRlIHJldmVyYmVyYXRpb24gZGVjYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBwZXJjZW50IChpLmUuIDAgLSAxMDApICovCi0gICAgT01YX0JVMzIgc1JlZmVyZW5jZUhpZ2hGcmVxOyAgLyoqPCBSZWZlcmVuY2UgaGlnaCBmcmVxdWVuY3kgaW4gSGVydHouIFRoaXMgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJlcXVlbmN5IHVzZWQgYXMgdGhlIHJlZmVyZW5jZSBmb3IgYWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhpZ2gtZnJlcXVlbmN5IHNldHRpbmdzIGFib3ZlICovCi0KLX0gT01YX0FVRElPX0NPTkZJR19SRVZFUkJFUkFUSU9OVFlQRTsKLQotCi0vKiogUG9zc2libGUgc2V0dGluZ3MgZm9yIHRoZSBFY2hvIENhbmNlbGF0aW9uIHN0cnVjdHVyZSB0byB1c2UgCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fRUNIT0NBTlRZUEUgewotICAgT01YX0FVRElPX0VjaG9DYW5PZmYgPSAwLCAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIGlzIGRpc2FibGVkICovCi0gICBPTVhfQVVESU9fRWNob0Nhbk5vcm1hbCwgICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gbm9ybWFsIG9wZXJhdGlvbiAtIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gZnJvbSBwbGFzdGljcyBhbmQgZmFjZSAqLwotICAgT01YX0FVRElPX0VjaG9DYW5IRnJlZSwgICAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG9wdGltaXplZCBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZHMgRnJlZSBvcGVyYXRpb24gKi8KLSAgIE9NWF9BVURJT19FY2hvQ2FuQ2FyS2l0LCAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG9wdGltaXplZCBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyIEtpdCAobG9uZ2VyIGVjaG8pICovCi0gICBPTVhfQVVESU9fRWNob0Nhbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgIE9NWF9BVURJT19FY2hvQ2FuVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgIE9NWF9BVURJT19FY2hvQ2FuTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fRUNIT0NBTlRZUEU7Ci0KLQotLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIGVjaG8gY2FuY2VsYXRpb24sIHdoaWNoIHJlbW92ZXMgdW5kZXNpcmVkIGVjaG8ncwotICogIGZyb20gdGhlIGF1ZGlvCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0VDSE9DQU5DRUxBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9BVURJT19FQ0hPQ0FOVFlQRSBlRWNob0NhbmNlbGF0aW9uOyAvKio8IEVjaG8gY2FuY2VsYXRpb24gc2V0dGluZ3MgKi8KLX0gT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBub2lzZSByZWR1Y3Rpb24sIHdoaWNoIHVuZGVzaXJlZCBub2lzZSBmcm9tCi0gKiB0aGUgYXVkaW8KLSAqIEBpbmdyb3VwIGVmZmVjdHMKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQk9PTCBiTm9pc2VSZWR1Y3Rpb247ICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBub2lzZSByZWR1Y3Rpb24gKi8KLX0gT01YX0FVRElPX0NPTkZJR19OT0lTRVJFRFVDVElPTlRZUEU7Ci0KLS8qKiBAfSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29tcG9uZW50LmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvbXBvbmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWI3ODRlYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvbXBvbmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTk2ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiBPTVhfQ29tcG9uZW50LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgT01YX0NvbXBvbmVudCBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCB0byBkZWZpbmUKLSAqICB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhIGNvbXBvbmVudC4gIFRoaXMgaGVhZGVyIGZpbGUgaXMgaW50ZW5kZWQgdG8KLSAqICBiZSB1c2VkIGJ5IGJvdGggdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50LgotICovCi0KLSNpZm5kZWYgT01YX0NvbXBvbmVudF9oCi0jZGVmaW5lIE9NWF9Db21wb25lbnRfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotCi0vKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLQotI2luY2x1ZGUgPE9NWF9BdWRpby5oPgotI2luY2x1ZGUgPE9NWF9WaWRlby5oPgotI2luY2x1ZGUgPE9NWF9JbWFnZS5oPgotI2luY2x1ZGUgPE9NWF9PdGhlci5oPgotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBlbnVtIE9NWF9QT1JURE9NQUlOVFlQRSB7IAotICAgIE9NWF9Qb3J0RG9tYWluQXVkaW8sIAotICAgIE9NWF9Qb3J0RG9tYWluVmlkZW8sIAotICAgIE9NWF9Qb3J0RG9tYWluSW1hZ2UsIAotICAgIE9NWF9Qb3J0RG9tYWluT3RoZXIsCi0gICAgT01YX1BvcnREb21haW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1BvcnREb21haW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9Qb3J0RG9tYWluTWF4ID0gMHg3ZmZmZmZmCi19IE9NWF9QT1JURE9NQUlOVFlQRTsKLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBQb3J0IG51bWJlciB0aGUgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfRElSVFlQRSBlRGlyOyAgICAgICAgICAgICAgLyoqPCBEaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkgb2YgdGhpcyBwb3J0ICovCi0gICAgT01YX1UzMiBuQnVmZmVyQ291bnRBY3R1YWw7ICAgIC8qKjwgVGhlIGFjdHVhbCBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgb24gdGhpcyBwb3J0ICovCi0gICAgT01YX1UzMiBuQnVmZmVyQ291bnRNaW47ICAgICAgIC8qKjwgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhpcyBwb3J0IHJlcXVpcmVzICovCi0gICAgT01YX1UzMiBuQnVmZmVyU2l6ZTsgICAgICAgICAgIC8qKjwgU2l6ZSwgaW4gYnl0ZXMsIGZvciBidWZmZXJzIHRvIGJlIHVzZWQgZm9yIHRoaXMgY2hhbm5lbCAqLwotICAgIE9NWF9CT09MIGJFbmFibGVkOyAgICAgICAgICAgICAvKio8IFBvcnRzIGRlZmF1bHQgdG8gZW5hYmxlZCBhbmQgYXJlIGVuYWJsZWQvZGlzYWJsZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUvT01YX0NvbW1hbmRQb3J0RGlzYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGRpc2FibGVkIGEgcG9ydCBpcyB1bnBvcHVsYXRlZC4gQSBkaXNhYmxlZCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHBvcHVsYXRlZCB3aXRoIGJ1ZmZlcnMgb24gYSB0cmFuc2l0aW9uIHRvIElETEUuICovCi0gICAgT01YX0JPT0wgYlBvcHVsYXRlZDsgICAgICAgICAgIC8qKjwgUG9ydCBpcyBwb3B1bGF0ZWQgd2l0aCBhbGwgb2YgaXRzIGJ1ZmZlcnMgYXMgaW5kaWNhdGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ1ZmZlckNvdW50QWN0dWFsLiBBIGRpc2FibGVkIHBvcnQgaXMgYWx3YXlzIHVucG9wdWxhdGVkLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBlbmFibGVkIHBvcnQgaXMgcG9wdWxhdGVkIG9uIGEgdHJhbnNpdGlvbiB0byBPTVhfU3RhdGVJZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVucG9wdWxhdGVkIG9uIGEgdHJhbnNpdGlvbiB0byBsb2FkZWQuICovCi0gICAgT01YX1BPUlRET01BSU5UWVBFIGVEb21haW47ICAgIC8qKjwgRG9tYWluIG9mIHRoZSBwb3J0LiBEZXRlcm1pbmVzIHRoZSBjb250ZW50cyBvZiBtZXRhZGF0YSBiZWxvdy4gKi8KLSAgICB1bmlvbiB7Ci0gICAgICAgIE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEUgYXVkaW87Ci0gICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgdmlkZW87Ci0gICAgICAgIE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEUgaW1hZ2U7Ci0gICAgICAgIE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgb3RoZXI7Ci0gICAgfSBmb3JtYXQ7Ci0gICAgT01YX0JPT0wgYkJ1ZmZlcnNDb250aWd1b3VzOwotICAgIE9NWF9VMzIgbkJ1ZmZlckFsaWdubWVudDsKLX0gT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRTsKLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9VMzJUWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKLSAgICBPTVhfVTMyIG5VMzI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBVMzIgdmFsdWUgKi8KLX0gT01YX1BBUkFNX1UzMlRZUEU7Ci0KLS8qKiBAaW5ncm91cCBycG0gKi8KLXR5cGVkZWYgZW51bSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgewotICAgIE9NWF9TdXNwZW5zaW9uRGlzYWJsZWQsIC8qKjwgTm8gc3VzcGVuc2lvbjsgdjEuMCBiZWhhdmlvciAqLwotICAgIE9NWF9TdXNwZW5zaW9uRW5hYmxlZCwgIC8qKjwgU3VzcGVuc2lvbiBhbGxvd2VkICovICAgCi0gICAgT01YX1N1c3BlbnNpb25Qb2xpY3lLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1N1c3BlbnNpb25Qb2xpY3lTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5TWF4ID0gMHg3ZmZmZmZmZgotfSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEU7Ci0KLS8qKiBAaW5ncm91cCBycG0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAKLSAgICBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgZVBvbGljeTsKLX0gT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIGVudW0gT01YX1NVU1BFTlNJT05UWVBFIHsKLSAgICBPTVhfTm90U3VzcGVuZGVkLCAvKio8IGNvbXBvbmVudCBpcyBub3Qgc3VzcGVuZGVkICovCi0gICAgT01YX1N1c3BlbmRlZCwgICAgLyoqPCBjb21wb25lbnQgaXMgc3VzcGVuZGVkICovCi0gICAgT01YX1N1c3BlbnNpb25LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1N1c3BlbnNpb25WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9TdXNwZW5kTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfU1VTUEVOU0lPTlRZUEU7Ci0KLS8qKiBAaW5ncm91cCBycG0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIAotICAgIE9NWF9TVVNQRU5TSU9OVFlQRSBlVHlwZTsgICAgICAgICAgICAgCi19IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSA7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9CT09MIGJFbmFibGVkOyAgICAKLX0gT01YX0NPTkZJR19CT09MRUFOVFlQRTsKLQotLyogUGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGNvbnRlbnQgdXJpIHRvIHVzZS4gKi8KLS8qKiBAaW5ncm91cCBjcCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMsIGluY2x1ZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIFVSSSBuYW1lICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1U4IGNvbnRlbnRVUklbMV07ICAgICAgICAgICAgICAgLyoqPCBUaGUgVVJJIG5hbWUgKi8KLX0gT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFOwotCi0vKiBQYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgcGlwZSB0byB1c2UuICovCi0vKiogQGluZ3JvdXAgY3AgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEUKLXsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0hBTkRMRVRZUEUgaFBpcGU7ICAgICAgIC8qKjwgVGhlIHBpcGUgaGFuZGxlKi8KLX0gT01YX1BBUkFNX0NPTlRFTlRQSVBFVFlQRTsKLQotLyoqIEBpbmdyb3VwIHJwbSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1JFU09VUkNFQ09OQ0VBTE1FTlRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9CT09MIGJSZXNvdXJjZUNvbmNlYWxtZW50Rm9yYmlkZGVuOyAvKio8IGRpc2FsbG93IHRoZSB1c2Ugb2YgcmVzb3VyY2UgY29uY2VhbG1lbnQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgKGxpa2UgZGVncmFkaW5nIGFsZ29yaXRobSBxdWFsaXR5IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciByZXNvdXJjZSBjb25zdW1wdGlvbiBvciBmdW5jdGlvbmFsIGJ5cGFzcykgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgY29tcG9uZW50IGFzIGEgcmVzb2x1dGlvbiB0byByZXNvdXJjZSBjb25mbGljdHMuICovCi19IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRTsKLQotCi0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgZW51bSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSB7Ci0gICAgT01YX01ldGFkYXRhQ2hhcnNldFVua25vd24gPSAwLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRBU0NJSSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0QmluYXJ5LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRDb2RlUGFnZTEyNTIsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjgsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEphdmFDb25mb3JtYW50VVRGOCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGNywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SW1hcFVURjcsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjE2TEUsIAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkJFLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjEyMzQ1LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRIWkdCMjMxMiwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IyMzEyLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjE4MDMwLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQkssCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEJpZzUsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MiwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTMsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk0LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTYsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk3LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5OCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTksCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxMCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTEzLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTQsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxNSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0U2hpZnRKSVMsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzIwMjJKUCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPMjAyMkpQMSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPRVVDSlAsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFNNUzdCaXQsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VHlwZU1heD0gMHg3RkZGRkZGRgotfSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRTsKLQotLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIGVudW0gT01YX01FVEFEQVRBU0NPUEVUWVBFCi17Ci0gICAgT01YX01ldGFkYXRhU2NvcGVBbGxMZXZlbHMsCi0gICAgT01YX01ldGFkYXRhU2NvcGVUb3BMZXZlbCwKLSAgICBPTVhfTWV0YWRhdGFTY29wZVBvcnRMZXZlbCwKLSAgICBPTVhfTWV0YWRhdGFTY29wZU5vZGVMZXZlbCwKLSAgICBPTVhfTWV0YWRhdGFTY29wZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfTWV0YWRhdGFTY29wZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX01ldGFkYXRhU2NvcGVUeXBlTWF4ID0gMHg3ZmZmZmZmZgotfSBPTVhfTUVUQURBVEFTQ09QRVRZUEU7Ci0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBlbnVtIE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFCi17Ci0gICAgT01YX01ldGFkYXRhU2VhcmNoVmFsdWVTaXplQnlJbmRleCwKLSAgICBPTVhfTWV0YWRhdGFTZWFyY2hJdGVtQnlJbmRleCwKLSAgICBPTVhfTWV0YWRhdGFTZWFyY2hOZXh0SXRlbUJ5S2V5LAotICAgIE9NWF9NZXRhZGF0YVNlYXJjaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfTWV0YWRhdGFTZWFyY2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9NZXRhZGF0YVNlYXJjaFR5cGVNYXggPSAweDdmZmZmZmZmCi19IE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFOwotLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRQotewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9NRVRBREFUQVNDT1BFVFlQRSBlU2NvcGVNb2RlOwotICAgIE9NWF9VMzIgblNjb3BlU3BlY2lmaWVyOwotICAgIE9NWF9VMzIgbk1ldGFkYXRhSXRlbUNvdW50OwotfSBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRTsKLQotLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEUKLXsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfTUVUQURBVEFTQ09QRVRZUEUgZVNjb3BlTW9kZTsKLSAgICBPTVhfVTMyIG5TY29wZVNwZWNpZmllcjsKLSAgICBPTVhfVTMyIG5NZXRhZGF0YUl0ZW1JbmRleDsgIAotICAgIE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFIGVTZWFyY2hNb2RlOwotICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVLZXlDaGFyc2V0OwotICAgIE9NWF9VOCBuS2V5U2l6ZVVzZWQ7Ci0gICAgT01YX1U4IG5LZXlbMTI4XTsKLSAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlVmFsdWVDaGFyc2V0OwotICAgIE9NWF9TVFJJTkcgc0xhbmd1YWdlQ291bnRyeTsKLSAgICBPTVhfVTMyIG5WYWx1ZU1heFNpemU7Ci0gICAgT01YX1UzMiBuVmFsdWVTaXplVXNlZDsKLSAgICBPTVhfVTggblZhbHVlWzFdOwotfSBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEU7Ci0KLS8qIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEUKLXsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfQk9PTCBiQWxsS2V5czsKLSAgICBPTVhfVTMyIG5QYXJlbnROb2RlSUQ7Ci0gICAgT01YX1UzMiBuTnVtTm9kZXM7Ci19IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRTsKLQotLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEUKLXsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfQk9PTCBiQWxsS2V5czsKLSAgICBPTVhfVTMyIG5QYXJlbnROb2RlSUQ7Ci0gICAgT01YX1UzMiBuTm9kZUluZGV4OyAKLSAgICBPTVhfVTMyIG5Ob2RlSUQ7IAotICAgIE9NWF9TVFJJTkcgY05vZGVOYW1lOwotICAgIE9NWF9CT09MIGJJc0xlYWZUeXBlOwotfSBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEU7Ci0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRSAKLXsgCi0gICAgT01YX1UzMiBuU2l6ZTsgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfQk9PTCBiQWxsS2V5czsJLyogaWYgdHJ1ZSB0aGVuIHRoaXMgc3RydWN0dXJlIHJlZmVycyB0byBhbGwga2V5cyBhbmQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdGhyZWUga2V5IGZpZWxkcyBiZWxvdyBhcmUgaWdub3JlZCAqLwotICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVLZXlDaGFyc2V0OwotICAgIE9NWF9VMzIgbktleVNpemVVc2VkOyAKLSAgICBPTVhfVTggICBuS2V5IFsxMjhdOyAKLSAgICBPTVhfVTMyIG5MYW5ndWFnZUNvdW50cnlTaXplVXNlZDsKLSAgICBPTVhfVTggbkxhbmd1YWdlQ291bnRyeVsxMjhdOwotICAgIE9NWF9CT09MIGJFbmFibGVkOwkvKiBpZiB0cnVlIHRoZW4ga2V5IGlzIHBhcnQgb2YgZmlsdGVyIChlLmcuIAotICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0YWluZWQgZm9yIHF1ZXJ5IGxhdGVyKS4gSWYgZmFsc2UgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5IGlzIG5vdCBwYXJ0IG9mIGZpbHRlciAqLwotfSBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFOyAKLQotLyoqIFRoZSBPTVhfSEFORExFVFlQRSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29tcG9uZW50IGhhbmRsZS4gIFRoZSBjb21wb25lbnQgCi0gKiAgaGFuZGxlIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBvZiB0aGUgY29tcG9uZW50J3MgcHVibGljIG1ldGhvZHMgYW5kIGFsc28KLSAqICBjb250YWlucyBwb2ludGVycyB0byB0aGUgY29tcG9uZW50J3MgcHJpdmF0ZSBkYXRhIGFyZWEuICBUaGUgY29tcG9uZW50Ci0gKiAgaGFuZGxlIGlzIGluaXRpYWxpemVkIGJ5IHRoZSBPTVggY29yZSAod2l0aCBoZWxwIGZyb20gdGhlIGNvbXBvbmVudCkKLSAqICBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyB0aGUgY29tcG9uZW50LiAgQWZ0ZXIgdGhlIGNvbXBvbmVudCBpcwotICogIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4gc2FmZWx5IGFjY2VzcyBhbnkgb2YgdGhlCi0gKiAgY29tcG9uZW50J3MgcHVibGljIGZ1bmN0aW9ucyAoYWx0aG91Z2ggc29tZSBtYXkgcmV0dXJuIGFuIGVycm9yIGJlY2F1c2UKLSAqICB0aGUgc3RhdGUgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGFjY2VzcykuCi0gKiAKLSAqICBAaW5ncm91cCBjb21wCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT01QT05FTlRUWVBFCi17Ci0gICAgLyoqIFRoZSBzaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBieXRlcy4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eQotICAgICAgICBvZiB0aGUgYWxsb2NhdG9yIG9mIHRoaXMgc3RydWN0dXJlIHRvIGZpbGwgaW4gdGhpcyB2YWx1ZS4gIFNpbmNlCi0gICAgICAgIHRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLCB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIHdpbGwgZmlsbCBpbiB0aGlzIHZhbHVlLiAqLwotICAgIE9NWF9VMzIgblNpemU7Ci0KLSAgICAvKiogblZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIE9NWCBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIHN0cnVjdHVyZSAKLSAgICAgICAgaXMgYnVpbHQgYWdhaW5zdC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY3JlYXRvciBvZiB0aGlzIAotICAgICAgICBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhbHVlIGFuZCBldmVyeSB1c2VyIG9mIHRoaXMgc3RydWN0dXJlIAotICAgICAgICBzaG91bGQgdmVyaWZ5IHRoYXQgaXQga25vd3MgaG93IHRvIHVzZSB0aGUgZXhhY3QgdmVyc2lvbiBvZiAKLSAgICAgICAgdGhpcyBzdHJ1Y3R1cmUgZm91bmQgaGVyZWluLiAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLQotICAgIC8qKiBwQ29tcG9uZW50UHJpdmF0ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvbXBvbmVudCBwcml2YXRlIGRhdGEgYXJlYS4gIAotICAgICAgICBUaGlzIG1lbWJlciBpcyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGJ5IHRoZSBjb21wb25lbnQgd2hlbiB0aGUgCi0gICAgICAgIGNvbXBvbmVudCBpcyBmaXJzdCBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhY2Nlc3MgdGhpcyAKLSAgICAgICAgZGF0YSBhcmVhLiAqLwotICAgIE9NWF9QVFIgcENvbXBvbmVudFByaXZhdGU7Ci0KLSAgICAvKiogcEFwcGxpY2F0aW9uUHJpdmF0ZSBpcyBhIHBvaW50ZXIgdGhhdCBpcyBhIHBhcmFtZXRlciB0byB0aGUgCi0gICAgICAgIE9NWF9HZXRIYW5kbGUgbWV0aG9kLCBhbmQgY29udGFpbnMgYW4gYXBwbGljYXRpb24gcHJpdmF0ZSB2YWx1ZSAKLSAgICAgICAgcHJvdmlkZWQgYnkgdGhlIElMIGNsaWVudC4gIFRoaXMgYXBwbGljYXRpb24gcHJpdmF0ZSBkYXRhIGlzIAotICAgICAgICByZXR1cm5lZCB0byB0aGUgSUwgQ2xpZW50IGJ5IE9NWCBpbiBhbGwgY2FsbGJhY2tzICovCi0gICAgT01YX1BUUiBwQXBwbGljYXRpb25Qcml2YXRlOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRDb21wb25lbnRWZXJzaW9uIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0Q29tcG9uZW50VmVyc2lvbiBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkdldENvbXBvbmVudFZlcnNpb24pKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX09VVCBPTVhfU1RSSU5HIHBDb21wb25lbnROYW1lLAotICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHBDb21wb25lbnRWZXJzaW9uLAotICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHBTcGVjVmVyc2lvbiwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX1VVSURUWVBFKiBwQ29tcG9uZW50VVVJRCk7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX1NlbmRDb21tYW5kIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2VuZENvbW1hbmQgbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpTZW5kQ29tbWFuZCkoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9DT01NQU5EVFlQRSBDbWQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBhcmFtMSwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQ21kRGF0YSk7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0dldFBhcmFtZXRlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldFBhcmFtZXRlciBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkdldFBhcmFtZXRlcikoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIAotICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5QYXJhbUluZGV4LCAgCi0gICAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKLQotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9TZXRQYXJhbWV0ZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBTZXRQYXJhbWV0ZXIgbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRQYXJhbWV0ZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCAKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7Ci0KLQotICAgIC8qKiByZWZlciB0byBPTVhfR2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0Q29uZmlnIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqR2V0Q29uZmlnKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsIAotICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7Ci0KLQotICAgIC8qKiByZWZlciB0byBPTVhfU2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2V0Q29uZmlnIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqU2V0Q29uZmlnKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsIAotICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOwotCi0KLSAgICAvKiogcmVmZXIgdG8gT01YX0dldEV4dGVuc2lvbkluZGV4IGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0RXh0ZW5zaW9uSW5kZXggbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRFeHRlbnNpb25JbmRleCkoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9TVFJJTkcgY1BhcmFtZXRlck5hbWUsCi0gICAgICAgICAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUqIHBJbmRleFR5cGUpOwotCi0KLSAgICAvKiogcmVmZXIgdG8gT01YX0dldFN0YXRlIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0U3RhdGUgbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRTdGF0ZSkoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfT1VUIE9NWF9TVEFURVRZUEUqIHBTdGF0ZSk7Ci0KLSAgICAKLSAgICAvKiogVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIHdpbGwgaW50ZXJhY3Qgd2l0aCBhbm90aGVyIE9NWAotICAgICAgICBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIGlmIHR1bm5lbGluZyBpcyBwb3NzaWJsZSBhbmQgdG8gc2V0dXAgdGhlCi0gICAgICAgIHR1bm5lbGluZy4gIFRoZSByZXR1cm4gY29kZXMgZm9yIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIAotICAgICAgICBkZXRlcm1pbmUgaWYgdHVubmVsaW5nIGlzIG5vdCBwb3NzaWJsZSwgb3IgaWYgdHVubmVsaW5nIGlzIG5vdAotICAgICAgICBzdXBwb3J0ZWQuICAKLSAgICAgICAgCi0gICAgICAgIEJhc2UgcHJvZmlsZSBjb21wb25lbnRzIChpLmUuIG5vbi1pbnRlcm9wKSBkbyBub3Qgc3VwcG9ydCB0aGlzCi0gICAgICAgIG1ldGhvZCBhbmQgc2hvdWxkIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCAKLQotICAgICAgICBUaGUgaW50ZXJvcCBwcm9maWxlIGNvbXBvbmVudCBNVVNUIHN1cHBvcnQgdHVubmVsaW5nIHRvIGFub3RoZXIgCi0gICAgICAgIGludGVyb3AgcHJvZmlsZSBjb21wb25lbnQgd2l0aCBhIGNvbXBhdGlibGUgcG9ydCBwYXJhbWV0ZXJzLiAgCi0gICAgICAgIEEgY29tcG9uZW50IG1heSBhbHNvIHN1cHBvcnQgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbi4KLSAgICAgICAgCi0gICAgICAgIElmIHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24gaXMgc3VwcG9ydGVkIHRoZSBuZWdvdGlhdGlvbiBvZiAKLSAgICAgICAgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbiBpcyBkb25lIG91dHNpZGUgb2YgT01YIGluIGEgdmVuZG9yIAotICAgICAgICBzcGVjaWZpYyB3YXkuIEl0IGlzIG9ubHkgcmVxdWlyZWQgdGhhdCB0aGUgcHJvcGVyIHJlc3VsdCBiZSAKLSAgICAgICAgcmV0dXJuZWQgYW5kIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGUgc2V0dXAgaXMgZG9uZSBpcyBsZWZ0IAotICAgICAgICB0byB0aGUgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLiAgCi0gICAgCi0gICAgICAgIFdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIG5Qb3J0IGluIGFuIG91dHB1dCBwb3J0LCB0aGUKLSAgICAgICAgY29tcG9uZW50IHdpbGw6Ci0gICAgICAgIDEuICBQb3B1bGF0ZSB0aGUgcFR1bm5lbFNldHVwIHN0cnVjdHVyZSB3aXRoIHRoZSBvdXRwdXQgcG9ydCdzIAotICAgICAgICAgICAgcmVxdWlyZW1lbnRzIGFuZCBjb25zdHJhaW50cyBmb3IgdGhlIHR1bm5lbC4KLQotICAgICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBuUG9ydCBpbiBhbiBpbnB1dCBwb3J0LCB0aGUKLSAgICAgICAgY29tcG9uZW50IHdpbGw6Ci0gICAgICAgIDEuICBRdWVyeSB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgb3V0cHV0IHBvcnQgdG8gCi0gICAgICAgICAgICBkZXRlcm1pbmUgaWYgdGhlIHBvcnRzIGFyZSBjb21wYXRpYmxlIGZvciB0dW5uZWxpbmcKLSAgICAgICAgMi4gIElmIHRoZSBwb3J0cyBhcmUgY29tcGF0aWJsZSwgdGhlIGNvbXBvbmVudCBzaG91bGQgc3RvcmUKLSAgICAgICAgICAgIHRoZSB0dW5uZWwgc3RlcCBwcm92aWRlZCBieSB0aGUgb3V0cHV0IHBvcnQKLSAgICAgICAgMy4gIERldGVybWluZSB3aGljaCBwb3J0IChlaXRoZXIgaW5wdXQgb3Igb3V0cHV0KSBpcyB0aGUgYnVmZmVyCi0gICAgICAgICAgICBzdXBwbGllciwgYW5kIGNhbGwgT01YX1NldFBhcmFtZXRlciBvbiB0aGUgb3V0cHV0IHBvcnQgdG8KLSAgICAgICAgICAgIGluZGljYXRlIHRoaXMgc2VsZWN0aW9uLgotICAgICAgICAKLSAgICAgICAgVGhlIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAotICAgICAgICBAcGFyYW0gW2luXSBoQ29tcAotICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QuCi0gICAgICAgIEBwYXJhbSBbaW5dIG5Qb3J0Ci0gICAgICAgICAgICBuUG9ydCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRvIGJlIHVzZWQKLSAgICAgICAgICAgIGZvciB0dW5uZWxpbmcuCi0gICAgICAgIEBwYXJhbSBbaW5dIGhUdW5uZWxlZENvbXAKLSAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIHR1bm5lbCB3aXRoLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50IAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZC4gIFdoZW4KLSAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIDB4MCB0aGUgY29tcG9uZW50IHNob3VsZCBzZXR1cCB0aGUgcG9ydCBmb3IKLSAgICAgICAgICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBDbGllbnQuCi0gICAgICAgIEBwYXJhbSBbaW5dIG5Qb3J0T3V0cHV0Ci0gICAgICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIGluZGljYXRlIHRoZSBwb3J0IHRoZSBjb21wb25lbnQgc2hvdWxkCi0gICAgICAgICAgICB0dW5uZWwgd2l0aC4KLSAgICAgICAgQHBhcmFtIFtpbl0gcFR1bm5lbFNldHVwCi0gICAgICAgICAgICBQb2ludGVyIHRvIHRoZSB0dW5uZWwgc2V0dXAgc3RydWN0dXJlLiAgV2hlbiBuUG9ydCBpcyBhbiBvdXRwdXQgcG9ydAotICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBzaG91bGQgcG9wdWxhdGUgdGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZS4gIFdoZW4KLSAgICAgICAgICAgIFdoZW4gblBvcnQgaXMgYW4gaW5wdXQgcG9ydCB0aGUgY29tcG9uZW50IHNob3VsZCByZXZpZXcgdGhlIHNldHVwCi0gICAgICAgICAgICBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IHdpdGggdGhlIG91dHB1dCBwb3J0LgotICAgICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgICAgICBAaW5ncm91cCB0dW4KLSAgICAqLwotCi0gICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudFR1bm5lbFJlcXVlc3QpKAotICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wLAotICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnQsCi0gICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaFR1bm5lbGVkQ29tcCwKLSAgICAgICAgT01YX0lOICBPTVhfVTMyIG5UdW5uZWxlZFBvcnQsCi0gICAgICAgIE9NWF9JTk9VVCAgT01YX1RVTk5FTFNFVFVQVFlQRSogcFR1bm5lbFNldHVwKTsgCi0KLSAgICAvKiogcmVmZXIgdG8gT01YX1VzZUJ1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFVzZUJ1ZmZlciBtZXRob2QuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpVc2VCdWZmZXIpKAotICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBwcEJ1ZmZlckhkciwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0SW5kZXgsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5TaXplQnl0ZXMsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1U4KiBwQnVmZmVyKTsKLQotICAgIC8qKiByZWZlciB0byBPTVhfQWxsb2NhdGVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBBbGxvY2F0ZUJ1ZmZlciBtZXRob2QuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpBbGxvY2F0ZUJ1ZmZlcikoCi0gICAgICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIHBwQnVmZmVyLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbmRleCwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBQcml2YXRlLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblNpemVCeXRlcyk7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0ZyZWVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBGcmVlQnVmZmVyIG1ldGhvZC4KLSAgICAgICAgQGluZ3JvdXAgYnVmCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkZyZWVCdWZmZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5kZXgsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKLQotICAgIC8qKiByZWZlciB0byBPTVhfRW1wdHlUaGlzQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRW1wdHlUaGlzQnVmZmVyIG1ldGhvZC4KLSAgICAgICAgQGluZ3JvdXAgYnVmCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkVtcHR5VGhpc0J1ZmZlcikoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKLQotICAgIC8qKiByZWZlciB0byBPTVhfRmlsbFRoaXNCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBGaWxsVGhpc0J1ZmZlciBtZXRob2QuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpGaWxsVGhpc0J1ZmZlcikoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKLQotICAgIC8qKiBUaGUgU2V0Q2FsbGJhY2tzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBjb3JlIHRvIHNwZWNpZnkgdGhlIGNhbGxiYWNrCi0gICAgICAgIHN0cnVjdHVyZSBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nCi0gICAgICAgIGNhbGwuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICAgICAgQHBhcmFtIFtpbl0gcENhbGxiYWNrcwotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIAotICAgICAgICAgICAgY2FsbGJhY2sgaW5mb3JtYXRpb24gdG8gdGhlIGNvbXBvbmVudAotICAgICAgICBAcGFyYW0gW2luXSBwQXBwRGF0YQotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlLiAgSXQgaXMgYW50aWNpcGF0ZWQgdGhhdCAKLSAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgb3IgYSAidGhpcwotICAgICAgICAgICAgcG9pbnRlciIgaW4gdGhpcyBhcmVhIHRvIGFsbG93IHRoZSBjYWxsYmFjayAoaW4gdGhlIGFwcGxpY2F0aW9uKQotICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsCi0gICAgICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKlNldENhbGxiYWNrcykoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsYmFja3MsIAotICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBBcHBEYXRhKTsKLQotICAgIC8qKiBDb21wb25lbnREZUluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBjb21wb25lbnQKLSAgICAgICAgcHJvdmlkaW5nIGEgbWVhbnMgdG8gZnJlZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBhdCBjb21wb25lbnQKLSAgICAgICAgaW5pdGlhbGl6YXRpb24uICBOT1RFOiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb21wb25lbnQgaGFuZGxlIGlzCi0gICAgICAgIG5vdCB2YWxpZCBmb3IgZnVydGhlciB1c2UuCi0gICAgICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqQ29tcG9uZW50RGVJbml0KSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7Ci0KLSAgICAvKiogQGluZ3JvdXAgYnVmICovCi0gICAgT01YX0VSUk9SVFlQRSAoKlVzZUVHTEltYWdlKSgKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogcHBCdWZmZXJIZHIsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuUG9ydEluZGV4LAotICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcFByaXZhdGUsCi0gICAgICAgICAgICBPTVhfSU4gdm9pZCogZWdsSW1hZ2UpOwotCi0gICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudFJvbGVFbnVtKSgKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0JCU9NWF9PVVQgT01YX1U4ICpjUm9sZSwKLQkJT01YX0lOIE9NWF9VMzIgbkluZGV4KTsKLQotfSBPTVhfQ09NUE9ORU5UVFlQRTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db250ZW50UGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db250ZW50UGlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTllNGRiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29udGVudFBpcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogT01YX0NvbnRlbnRQaXBlLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgT01YX0NvbnRlbnRQaXBlIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyB1c2VkIHRvIGRlZmluZQotICogIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZvciBjb250ZW50IHBpcGxlcy4gIFRoaXMgaGVhZGVyIGZpbGUgaXMgaW50ZW5kZWQgdG8KLSAqICBiZSB1c2VkIGJ5IHRoZSBjb21wb25lbnQuCi0gKi8KLQotI2lmbmRlZiBPTVhfQ09OVEVOVFBJUEVfSAotI2RlZmluZSBPTVhfQ09OVEVOVFBJUEVfSAotCi0jaWZuZGVmIEtEX0VBQ0NFUwotLyogT3BlbktPREUgZXJyb3IgY29kZXMuIENQUmVzdWx0IHZhbHVlcyBtYXkgYmUgemVybyAoaW5kaWNhdGluZyBzdWNjZXNzCi0gICBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMpICovCi0jZGVmaW5lIEtEX0VBQ0NFUyAoMSkKLSNkZWZpbmUgS0RfRUFERFJJTlVTRSAoMikKLSNkZWZpbmUgS0RfRUFHQUlOICg1KQotI2RlZmluZSBLRF9FQkFERiAoNykKLSNkZWZpbmUgS0RfRUJVU1kgKDgpCi0jZGVmaW5lIEtEX0VDT05OUkVGVVNFRCAoOSkKLSNkZWZpbmUgS0RfRUNPTk5SRVNFVCAoMTApCi0jZGVmaW5lIEtEX0VERUFETEsgKDExKQotI2RlZmluZSBLRF9FREVTVEFERFJSRVEgKDEyKQotI2RlZmluZSBLRF9FUkFOR0UgKDM1KQotI2RlZmluZSBLRF9FRVhJU1QgKDEzKQotI2RlZmluZSBLRF9FRkJJRyAoMTQpCi0jZGVmaW5lIEtEX0VIT1NUVU5SRUFDSCAoMTUpCi0jZGVmaW5lIEtEX0VJTlZBTCAoMTcpCi0jZGVmaW5lIEtEX0VJTyAoMTgpCi0jZGVmaW5lIEtEX0VJU0NPTk4gKDIwKQotI2RlZmluZSBLRF9FSVNESVIgKDIxKQotI2RlZmluZSBLRF9FTUZJTEUgKDIyKQotI2RlZmluZSBLRF9FTkFNRVRPT0xPTkcgKDIzKQotI2RlZmluZSBLRF9FTk9FTlQgKDI0KQotI2RlZmluZSBLRF9FTk9NRU0gKDI1KQotI2RlZmluZSBLRF9FTk9TUEMgKDI2KQotI2RlZmluZSBLRF9FTk9TWVMgKDI3KQotI2RlZmluZSBLRF9FTk9UQ09OTiAoMjgpCi0jZGVmaW5lIEtEX0VQRVJNICgzMykKLSNkZWZpbmUgS0RfRVRJTUVET1VUICgzNikKLSNkZWZpbmUgS0RfRUlMU0VRICgxOSkKLSNlbmRpZgotCi0vKiogTWFwIHR5cGVzIGZyb20gT01YIHN0YW5kYXJkIHR5cGVzIG9ubHkgaGVyZSBzbyBpbnRlcmZhY2UgaXMgYXMgZ2VuZXJpYyBhcyBwb3NzaWJsZS4gKi8KLXR5cGVkZWYgT01YX1UzMiAgICBDUHJlc3VsdDsKLXR5cGVkZWYgY2hhciAqICAgICBDUHN0cmluZzsgIAotdHlwZWRlZiB2b2lkICogICAgIENQaGFuZGxlOwotdHlwZWRlZiBPTVhfVTMyICAgIENQdWludDsKLXR5cGVkZWYgT01YX1MzMiAgICBDUGludDsgIAotdHlwZWRlZiBjaGFyICAgICAgIENQYnl0ZTsgIAotdHlwZWRlZiBPTVhfQk9PTCAgIENQYm9vbDsKLQotLyoqIGVudW1lcmF0aW9uIG9mIG9yaWdpbiB0eXBlcyB1c2VkIGluIHRoZSBDUF9QSVBFVFlQRSdzIFNlZWsgZnVuY3Rpb24gCi0gKiBAaW5ncm91cCBjcAotICovCi10eXBlZGVmIGVudW0gQ1BfT1JJR0lOVFlQRSB7Ci0gICAgQ1BfT3JpZ2luQmVnaW4sICAgICAgCi0gICAgQ1BfT3JpZ2luQ3VyLCAgICAgIAotICAgIENQX09yaWdpbkVuZCwgICAgICAKLSAgICBDUF9PcmlnaW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgQ1BfT3JpZ2luVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBDUF9PcmlnaW5NYXggPSAwWDdGRkZGRkZGCi19IENQX09SSUdJTlRZUEU7Ci0KLS8qKiBlbnVtZXJhdGlvbiBvZiBjb250YWN0IGFjY2VzcyB0eXBlcyB1c2VkIGluIHRoZSBDUF9QSVBFVFlQRSdzIE9wZW4gZnVuY3Rpb24gCi0gKiBAaW5ncm91cCBjcAotICovCi10eXBlZGVmIGVudW0gQ1BfQUNDRVNTVFlQRSB7Ci0gICAgQ1BfQWNjZXNzUmVhZCwgICAgICAKLSAgICBDUF9BY2Nlc3NXcml0ZSwgIAotICAgIENQX0FjY2Vzc1JlYWRXcml0ZSAsICAKLSAgICBDUF9BY2Nlc3NLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgQ1BfQWNjZXNzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBDUF9BY2Nlc3NNYXggPSAwWDdGRkZGRkZGCi19IENQX0FDQ0VTU1RZUEU7Ci0KLS8qKiBlbnVtZXJhdGlvbiBvZiByZXN1bHRzIHJldHVybmVkIGJ5IHRoZSBDUF9QSVBFVFlQRSdzIENoZWNrQXZhaWxhYmxlQnl0ZXMgZnVuY3Rpb24gCi0gKiBAaW5ncm91cCBjcAotICovCi10eXBlZGVmIGVudW0gQ1BfQ0hFQ0tCWVRFU1JFU1VMVFRZUEUKLXsKLSAgICBDUF9DaGVja0J5dGVzT2ssICAgICAgICAgICAgICAgICAgICAvKio8IFRoZXJlIGFyZSBhdCBsZWFzdCB0aGUgcmVxdWVzdCBudW1iZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYnl0ZXMgYXZhaWxhYmxlICovCi0gICAgQ1BfQ2hlY2tCeXRlc05vdFJlYWR5LCAgICAgICAgICAgICAgLyoqPCBUaGUgcGlwZSBpcyBzdGlsbCByZXRyaWV2aW5nIGJ5dGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcmVzZW50bHkgbGFja3Mgc3VmZmljaWVudCBieXRlcy4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhleSBhcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZmljaWVudCBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLwotICAgIENQX0NoZWNrQnl0ZXNJbnN1ZmZpY2llbnRCeXRlcyAgLCAgICAgLyoqPCBUaGUgcGlwZSBoYXMgcmV0cmlldmVkIGFsbCBieXRlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhvc2UgYXZhaWxhYmxlIGFyZSBsZXNzIHRoYW4gdGhvc2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkICovCi0gICAgQ1BfQ2hlY2tCeXRlc0F0RW5kT2ZTdHJlYW0sICAgICAgICAgLyoqPCBUaGUgcGlwZSBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBubyBtb3JlIGJ5dGVzIGFyZSBhdmFpbGFibGUuICovCi0gICAgQ1BfQ2hlY2tCeXRlc091dE9mQnVmZmVycywgICAgICAgICAgLyoqPCBBbGwgcmVhZC93cml0ZSBidWZmZXJzIGFyZSBjdXJyZW50bHkgaW4gdXNlLiAqLwotICAgIENQX0NoZWNrQnl0ZXNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgQ1BfQ2hlY2tCeXRlc1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfQ2hlY2tCeXRlc01heCA9IDBYN0ZGRkZGRkYKLX0gQ1BfQ0hFQ0tCWVRFU1JFU1VMVFRZUEU7Ci0KLS8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjay4gCi0gKiBAaW5ncm91cCBjcAotICovCi10eXBlZGVmIGVudW0gQ1BfRVZFTlRUWVBFewotICAgIENQX0J5dGVzQXZhaWxhYmxlLCAgICAgIAkgICAgLyoqIGJ5dGVzIHJlcXVlc3RlZCBpbiBhIENoZWNrQXZhaWxhYmxlQnl0ZXMgY2FsbCBhcmUgbm93IGF2YWlsYWJsZSovCi0gICAgQ1BfT3ZlcmZsb3csICAJCSAgICAgICAgICAgLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrKi8KLSAgICBDUF9QaXBlRGlzY29ubmVjdGVkICAsICAJCSAgICAvKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2sqLwotICAgIENQX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX0V2ZW50VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBDUF9FdmVudE1heCA9IDBYN0ZGRkZGRkYKLX0gQ1BfRVZFTlRUWVBFOwotCi0vKiogY29udGVudCBwaXBlIGRlZmluaXRpb24gCi0gKiBAaW5ncm91cCBjcAotICovCi10eXBlZGVmIHN0cnVjdCBDUF9QSVBFVFlQRQotewotICAgIC8qKiBPcGVuIGEgY29udGVudCBzdHJlYW0gZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gKi8gCi0gICAgQ1ByZXN1bHQgKCpPcGVuKSggQ1BoYW5kbGUqIGhDb250ZW50LCBDUHN0cmluZyBzelVSSSwgQ1BfQUNDRVNTVFlQRSBlQWNjZXNzICk7Ci0KLSAgICAvKiogQ2xvc2UgYSBjb250ZW50IHN0cmVhbS4gKi8gCi0gICAgQ1ByZXN1bHQgKCpDbG9zZSkoIENQaGFuZGxlIGhDb250ZW50ICk7Ci0KLSAgICAvKiogQ3JlYXRlIGEgY29udGVudCBzb3VyY2UgYW5kIG9wZW4gaXQgZm9yIHdyaXRpbmcuICovIAotICAgIENQcmVzdWx0ICgqQ3JlYXRlKSggQ1BoYW5kbGUgKmhDb250ZW50LCBDUHN0cmluZyBzelVSSSApOwotCi0gICAgLyoqIENoZWNrIHRoZSB0aGF0IHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nIChkZXBlbmRpbmcgb24gYWNjZXNzIHR5cGUpLiovCi0gICAgQ1ByZXN1bHQgKCpDaGVja0F2YWlsYWJsZUJ5dGVzKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQdWludCBuQnl0ZXNSZXF1ZXN0ZWQsIENQX0NIRUNLQllURVNSRVNVTFRUWVBFICplUmVzdWx0ICk7Ci0KLSAgICAvKiogU2VlayB0byBjZXJ0YWluIHBvc2l0aW9uIGluIHRoZSBjb250ZW50IHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luLiAqLwotICAgIENQcmVzdWx0ICgqU2V0UG9zaXRpb24pKCBDUGhhbmRsZSAgaENvbnRlbnQsIENQaW50IG5PZmZzZXQsIENQX09SSUdJTlRZUEUgZU9yaWdpbik7Ci0KLSAgICAvKiogUmV0cmlldmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50LiAqLwotICAgIENQcmVzdWx0ICgqR2V0UG9zaXRpb24pKCBDUGhhbmRsZSBoQ29udGVudCwgQ1B1aW50ICpwUG9zaXRpb24pOwotCi0gICAgLyoqIFJldHJpZXZlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBzaXplIGZyb20gdGhlIGNvbnRlbnQgc3RyZWFtIChhZHZhbmNlIGNvbnRlbnQgcG9pbnRlciBieSBzaXplIG9mIGRhdGEpLgotICAgICAgIE5vdGU6IHBpcGUgY2xpZW50IHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHNtYWxsIGhpZ2ggZnJlcXVlbmN5IHJlYWRzLiAqLwotICAgIENQcmVzdWx0ICgqUmVhZCkoIENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKnBEYXRhLCBDUHVpbnQgblNpemUpOyAKLQotICAgIC8qKiBSZXRyaWV2ZSBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIHBpcGUgdGhhdCBjb250YWlucyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcy4gCi0gICAgICAgQnVmZmVyIGNvbnRhaW5zIHRoZSBuZXh0IGJsb2NrIG9mIGJ5dGVzLCBhcyBzcGVjaWZpZWQgYnkgblNpemUsIG9mIHRoZSBjb250ZW50LiBuU2l6ZSBhbHNvCi0gICAgICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgYWN0dWFsbHkgcmVhZC4gQ29udGVudCBwb2ludGVyIGFkdmFuY2VzIHRoZSBieSB0aGUgcmV0dXJuZWQgc2l6ZS4gCi0gICAgICAgTm90ZTogcGlwZSBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciBsYXJnZSByZWFkcy4gVGhlIGNsaWVudCBtdXN0IGNhbGwgCi0gICAgICAgUmVsZWFzZVJlYWRCdWZmZXIgd2hlbiBkb25lIHdpdGggYnVmZmVyLiAKLQotICAgICAgIEluIHNvbWUgY2FzZXMgdGhlIHJlcXVlc3RlZCBibG9jayBtYXkgbm90IHJlc2lkZSBpbiBjb250aWd1b3VzIG1lbW9yeSB3aXRoaW4gdGhlCi0gICAgICAgcGlwZSBpbXBsZW1lbnRhdGlvbi4gRm9yIGluc3RhbmNlIGlmIHRoZSBwaXBlIGxldmVyYWdlcyBhIGNpcmN1bGFyIGJ1ZmZlciB0aGVuIHRoZSByZXF1ZXN0ZWQgCi0gICAgICAgYmxvY2sgbWF5IHN0cmFkZGxlIHRoZSBib3VuZGFyeSBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLiBCeSBkZWZhdWx0IGEgcGlwZSBpbXBsZW1lbnRhdGlvbiAKLSAgICAgICBwZXJmb3JtcyBhIGNvcHkgaW4gdGhpcyBjYXNlIHRvIHByb3ZpZGUgdGhlIGJsb2NrIHRvIHRoZSBwaXBlIGNsaWVudCBpbiBvbmUgY29udGlndW91cyBidWZmZXIuCi0gICAgICAgSWYsIGhvd2V2ZXIsIHRoZSBjbGllbnQgc2V0cyBiRm9yYmlkQ29weSwgdGhlbiB0aGUgcGlwZSByZXR1cm5zIG9ubHkgdGhvc2UgYnl0ZXMgcHJlY2VkaW5nIHRoZSBtZW1vcnkgCi0gICAgICAgYm91bmRhcnkuIEhlcmUgdGhlIGNsaWVudCBtYXkgcmV0cmlldmUgdGhlIGRhdGEgaW4gc2VnbWVudHMgb3ZlciBzdWNjZXNzaXZlIGNhbGxzLiAqLwotICAgIENQcmVzdWx0ICgqUmVhZEJ1ZmZlcikoIENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKipwcEJ1ZmZlciwgQ1B1aW50ICpuU2l6ZSwgQ1Bib29sIGJGb3JiaWRDb3B5KTsKLQotICAgIC8qKiBSZWxlYXNlIGEgYnVmZmVyIG9idGFpbmVkIGJ5IFJlYWRCdWZmZXIgYmFjayB0byB0aGUgcGlwZS4gKi8KLSAgICBDUHJlc3VsdCAoKlJlbGVhc2VSZWFkQnVmZmVyKShDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwQnVmZmVyKTsKLQotICAgIC8qKiBXcml0ZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB0byB0aGUgY29udGVudCAoYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgc2l6ZSBvZiBkYXRhKS4KLSAgICAgICBOb3RlOiBwaXBlIGNsaWVudCBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciBzbWFsbCBoaWdoIGZyZXF1ZW5jeSB3cml0ZXMuICovCi0gICAgQ1ByZXN1bHQgKCpXcml0ZSkoIENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKmRhdGEsIENQdWludCBuU2l6ZSk7IAotCi0gICAgLyoqIFJldHJpZXZlIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgcGlwZSB1c2VkIHRvIHdyaXRlIGRhdGEgdG8gdGhlIGNvbnRlbnQuIAotICAgICAgIENsaWVudCB3aWxsIGZpbGwgYnVmZmVyIHdpdGggb3V0cHV0IGRhdGEuIE5vdGU6IHBpcGUgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZQotICAgICAgIGZvciBsYXJnZSB3cml0ZXMuIFRoZSBjbGllbnQgbXVzdCBjYWxsIFdyaXRlQnVmZmVyIHdoZW4gZG9uZSBpdCBoYXMgZmlsbGVkIHRoZSBidWZmZXIgd2l0aCBkYXRhLiovCi0gICAgQ1ByZXN1bHQgKCpHZXRXcml0ZUJ1ZmZlcikoIENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKipwcEJ1ZmZlciwgQ1B1aW50IG5TaXplKTsKLQotICAgIC8qKiBEZWxpdmVyIGEgYnVmZmVyIG9idGFpbmVkIHZpYSBHZXRXcml0ZUJ1ZmZlciB0byB0aGUgcGlwZS4gUGlwZSB3aWxsIHdyaXRlIHRoZSAKLSAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciB0byBjb250ZW50IGFuZCBhZHZhbmNlIGNvbnRlbnQgcG9pbnRlciBieSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyICovCi0gICAgQ1ByZXN1bHQgKCpXcml0ZUJ1ZmZlcikoIENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKnBCdWZmZXIsIENQdWludCBuRmlsbGVkU2l6ZSk7Ci0KLSAgICAvKiogUmVnaXN0ZXIgYSBwZXItaGFuZGxlIGNsaWVudCBjYWxsYmFjayB3aXRoIHRoZSBjb250ZW50IHBpcGUuICovCi0gICAgQ1ByZXN1bHQgKCpSZWdpc3RlckNhbGxiYWNrKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQcmVzdWx0ICgqQ2xpZW50Q2FsbGJhY2spKENQX0VWRU5UVFlQRSBlRXZlbnQsIENQdWludCBpUGFyYW0pKTsKLQotfSBDUF9QSVBFVFlQRTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29yZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYjBmNmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQ4ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiBPTVhfQ29yZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9Db3JlIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyB1c2VkIGJ5IGJvdGggdGhlCi0gKiAgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzIGNvbW1vbiBpdGVtcy4KLSAqLwotCi0jaWZuZGVmIE9NWF9Db3JlX2gKLSNkZWZpbmUgT01YX0NvcmVfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyogRWFjaCBPTVggaGVhZGVyIHNoYWxsIGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKLSAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotCi0jaW5jbHVkZSA8T01YX0luZGV4Lmg+Ci0KLQotLyoqIFRoZSBPTVhfQ09NTUFORFRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY3Rpb24gaW4gdGhlCi0gKiAgT01YX1NlbmRDb21tYW5kIG1hY3JvLiAgCi0gKiAgQGluZ3JvdXAgY29yZQotICovCi10eXBlZGVmIGVudW0gT01YX0NPTU1BTkRUWVBFCi17Ci0gICAgT01YX0NvbW1hbmRTdGF0ZVNldCwgICAgLyoqPCBDaGFuZ2UgdGhlIGNvbXBvbmVudCBzdGF0ZSAqLwotICAgIE9NWF9Db21tYW5kRmx1c2gsICAgICAgIC8qKjwgRmx1c2ggdGhlIGRhdGEgcXVldWUocykgb2YgYSBjb21wb25lbnQgKi8KLSAgICBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLCAvKio8IERpc2FibGUgYSBwb3J0IG9uIGEgY29tcG9uZW50LiAqLwotICAgIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwgIC8qKjwgRW5hYmxlIGEgcG9ydCBvbiBhIGNvbXBvbmVudC4gKi8KLSAgICBPTVhfQ29tbWFuZE1hcmtCdWZmZXIsICAvKio8IE1hcmsgYSBjb21wb25lbnQvYnVmZmVyIGZvciBvYnNlcnZhdGlvbiAqLwotICAgIE9NWF9Db21tYW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9Db21tYW5kVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQ29tbWFuZE1heCA9IDBYN0ZGRkZGRkYKLX0gT01YX0NPTU1BTkRUWVBFOwotCi0KLQotLyoqIFRoZSBPTVhfU1RBVEVUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgb3IgY2hhbmdlIHRoZSBjb21wb25lbnQKLSAqICBzdGF0ZS4gIFRoaXMgZW51bWVyYXRpb24gcmVmbGVjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCB3aGVuCi0gKiAgdXNlZCB3aXRoIHRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gb3IgYmVjb21lcyB0aGUgcGFyYW1ldGVyIGluIGEgc3RhdGUgY2hhbmdlCi0gKiAgY29tbWFuZCB3aGVuIHVzZWQgd2l0aCB0aGUgT01YX1NlbmRDb21tYW5kIG1hY3JvLgotICoKLSAqICBUaGUgY29tcG9uZW50IHdpbGwgYmUgaW4gdGhlIExvYWRlZCBzdGF0ZSBhZnRlciB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxseQotICogIGxvYWRlZCBpbnRvIG1lbW9yeS4gIEluIHRoZSBMb2FkZWQgc3RhdGUsIHRoZSBjb21wb25lbnQgaXMgbm90IGFsbG93ZWQgdG8KLSAqICBhbGxvY2F0ZSBvciBob2xkIHJlc291cmNlcyBvdGhlciB0aGFuIHRvIGJ1aWxkIGl0J3MgaW50ZXJuYWwgcGFyYW1ldGVyCi0gKiAgYW5kIGNvbmZpZ3VyYXRpb24gdGFibGVzLiAgVGhlIGFwcGxpY2F0aW9uIHdpbGwgc2VuZCBvbmUgb3IgbW9yZQotICogIFNldFBhcmFtZXRlcnMvR2V0UGFyYW1ldGVycyBhbmQgU2V0Q29uZmlnL0dldENvbmZpZyBjb21tYW5kcyB0byB0aGUKLSAqICBjb21wb25lbnQgYW5kIHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgZWFjaCBvZiB0aGVzZSBwYXJhbWV0ZXIgYW5kCi0gKiAgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGZvciB1c2UgbGF0ZXIuICBXaGVuIHRoZSBhcHBsaWNhdGlvbiBzZW5kcyB0aGUKLSAqICBJZGxlIGNvbW1hbmQsIHRoZSBjb21wb25lbnQgd2lsbCBhY3F1aXJlIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciB0aGUKLSAqICBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBhbmQgd2lsbCB0cmFuc2l0aW9uIHRvIHRoZSBpZGxlIHN0YXRlIGlmIHRoZQotICogIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bC4gIElmIHRoZSBjb21wb25lbnQgY2Fubm90IHN1Y2Nlc3NmdWxseQotICogIHRyYW5zaXRpb24gdG8gdGhlIGlkbGUgc3RhdGUgZm9yIGFueSByZWFzb24sIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50Ci0gKiAgc2hhbGwgYmUgZnVsbHkgcm9sbGVkIGJhY2sgdG8gdGhlIExvYWRlZCBzdGF0ZSAoZS5nLiBhbGwgYWxsb2NhdGVkIAotICogIHJlc291cmNlcyBzaGFsbCBiZSByZWxlYXNlZCkuICBXaGVuIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgdGhlIGNvbW1hbmQKLSAqICB0byBnbyB0byB0aGUgRXhlY3V0aW5nIHN0YXRlLCBpdCBzaGFsbCBiZWdpbiBwcm9jZXNzaW5nIGJ1ZmZlcnMgYnkKLSAqICBzZW5kaW5nIGFsbCBpbnB1dCBidWZmZXJzIGl0IGhvbGRzIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFdoaWxlCi0gKiAgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgSWRsZSBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHNlbmQgdGhlCi0gKiAgUGF1c2UgY29tbWFuZC4gIElmIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgdGhlIHBhdXNlIGNvbW1hbmQgd2hpbGUgaW4gdGhlCi0gKiAgSWRsZSBzdGF0ZSwgdGhlIGNvbXBvbmVudCBzaGFsbCBzZW5kIGFsbCBpbnB1dCBidWZmZXJzIGl0IGhvbGRzIHRvIHRoZSAKLSAqICBhcHBsaWNhdGlvbiwgYnV0IHNoYWxsIG5vdCBiZWdpbiBwcm9jZXNzaW5nIGJ1ZmZlcnMuICBUaGlzIHdpbGwgYWxsb3cgdGhlCi0gKiAgYXBwbGljYXRpb24gdG8gcHJlZmlsbCBidWZmZXJzLgotICogCi0gKiAgQGluZ3JvdXAgY29tcAotICovCi0KLXR5cGVkZWYgZW51bSBPTVhfU1RBVEVUWVBFCi17Ci0gICAgT01YX1N0YXRlSW52YWxpZCwgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgdGhhdCBpdCdzIGludGVybmFsIGRhdGEgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgYXJlIGNvcnJ1cHRlZCB0byB0aGUgcG9pbnQgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW5ub3QgZGV0ZXJtaW5lIGl0J3Mgc3RhdGUgcHJvcGVybHkgKi8KLSAgICBPTVhfU3RhdGVMb2FkZWQsICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGJlZW4gbG9hZGVkIGJ1dCBoYXMgbm90IGNvbXBsZXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbi4gIFRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgT01YX0dldFBhcmFtZXRlciBtYWNybyBhcmUgdGhlIG9ubHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIG1hY3JvcyBhbGxvd2VkIHRvIGJlIHNlbnQgdG8gdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gdGhpcyBzdGF0ZS4gKi8KLSAgICBPTVhfU3RhdGVJZGxlLCAgICAgICAgLyoqPCBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gY29tcGxldGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGNvbXBvbmVudCBpcyByZWFkeSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydC4gKi8KLSAgICBPTVhfU3RhdGVFeGVjdXRpbmcsICAgLyoqPCBjb21wb25lbnQgaGFzIGFjY2VwdGVkIHRoZSBzdGFydCBjb21tYW5kIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBwcm9jZXNzaW5nIGRhdGEgKGlmIGRhdGEgaXMgYXZhaWxhYmxlKSAqLwotICAgIE9NWF9TdGF0ZVBhdXNlLCAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgcmVjZWl2ZWQgcGF1c2UgY29tbWFuZCAqLwotICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMsIC8qKjwgY29tcG9uZW50IGlzIHdhaXRpbmcgZm9yIHJlc291cmNlcywgZWl0aGVyIGFmdGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVlbXB0aW9uIG9yIGJlZm9yZSBpdCBnZXRzIHRoZSByZXNvdXJjZXMgcmVxdWVzdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgc3BlY2lmaWNhdGlvbiBmb3IgY29tcGxldGUgZGV0YWlscy4gKi8KLSAgICBPTVhfU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfU3RhdGVNYXggPSAwWDdGRkZGRkZGCi19IE9NWF9TVEFURVRZUEU7Ci0KLS8qKiBUaGUgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBzdGFuZGFyZCBPTVggRXJyb3JzLiAgVGhlc2UgCi0gKiAgZXJyb3JzIHNob3VsZCBjb3ZlciBtb3N0IG9mIHRoZSBjb21tb24gZmFpbHVyZSBjYXNlcy4gIEhvd2V2ZXIsIAotICogIHZlbmRvcnMgYXJlIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwgZXJyb3IgbWVzc2FnZXMgb2YgdGhlaXIgb3duIGFzIAotICogIGxvbmcgYXMgdGhleSBmb2xsb3cgdGhlc2UgcnVsZXM6Ci0gKiAgMS4gIFZlbmRvciBlcnJvciBtZXNzYWdlcyBzaGFsbCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMHg5MDAwMDAwMCB0bwotICogICAgICAweDkwMDBGRkZGLgotICogIDIuICBWZW5kb3IgZXJyb3IgbWVzc2FnZXMgc2hhbGwgYmUgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIHByb3ZpZGVkCi0gKiAgICAgIHdpdGggdGhlIGNvbXBvbmVudC4gIE5vIGVycm9yIG1lc3NhZ2VzIGFyZSBhbGxvd2VkIHRoYXQgYXJlCi0gKiAgICAgIG5vdCBkZWZpbmVkLgotICovCi10eXBlZGVmIGVudW0gT01YX0VSUk9SVFlQRQotewotICBPTVhfRXJyb3JOb25lID0gMCwKLQotICAvKiogVGhlcmUgd2VyZSBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gKi8KLSAgT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzID0gKE9NWF9TMzIpIDB4ODAwMDEwMDAsCi0KLSAgLyoqIFRoZXJlIHdhcyBhbiBlcnJvciwgYnV0IHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgY291bGQgbm90IGJlIGRldGVybWluZWQgKi8KLSAgT01YX0Vycm9yVW5kZWZpbmVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMDEsCi0KLSAgLyoqIFRoZSBjb21wb25lbnQgbmFtZSBzdHJpbmcgd2FzIG5vdCB2YWxpZCAqLwotICBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZSA9IChPTVhfUzMyKSAweDgwMDAxMDAyLAotCi0gIC8qKiBObyBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgc3RyaW5nIHdhcyBmb3VuZCAqLwotICBPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZCA9IChPTVhfUzMyKSAweDgwMDAxMDAzLAotCi0gIC8qKiBUaGUgY29tcG9uZW50IHNwZWNpZmllZCBkaWQgbm90IGhhdmUgYSAiT01YX0NvbXBvbmVudEluaXQiIG9yCi0gICAgICAiT01YX0NvbXBvbmVudERlSW5pdCBlbnRyeSBwb2ludCAqLwotICBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDQsCi0KLSAgLyoqIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgd2VyZSBub3QgdmFsaWQgKi8KLSAgT01YX0Vycm9yQmFkUGFyYW1ldGVyID0gKE9NWF9TMzIpIDB4ODAwMDEwMDUsCi0KLSAgLyoqIFRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkICovCi0gIE9NWF9FcnJvck5vdEltcGxlbWVudGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMDYsCi0KLSAgLyoqIFRoZSBidWZmZXIgd2FzIGVtcHRpZWQgYmVmb3JlIHRoZSBuZXh0IGJ1ZmZlciB3YXMgcmVhZHkgKi8KLSAgT01YX0Vycm9yVW5kZXJmbG93ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDcsCi0KLSAgLyoqIFRoZSBidWZmZXIgd2FzIG5vdCBhdmFpbGFibGUgd2hlbiBpdCB3YXMgbmVlZGVkICovCi0gIE9NWF9FcnJvck92ZXJmbG93ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDgsCi0KLSAgLyoqIFRoZSBoYXJkd2FyZSBmYWlsZWQgdG8gcmVzcG9uZCBhcyBleHBlY3RlZCAqLwotICBPTVhfRXJyb3JIYXJkd2FyZSA9IChPTVhfUzMyKSAweDgwMDAxMDA5LAotCi0gIC8qKiBUaGUgY29tcG9uZW50IGlzIGluIHRoZSBzdGF0ZSBPTVhfU3RhdGVJbnZhbGlkICovCi0gIE9NWF9FcnJvckludmFsaWRTdGF0ZSA9IChPTVhfUzMyKSAweDgwMDAxMDBBLAotCi0gIC8qKiBTdHJlYW0gaXMgZm91bmQgdG8gYmUgY29ycnVwdCAqLwotICBPTVhfRXJyb3JTdHJlYW1Db3JydXB0ID0gKE9NWF9TMzIpIDB4ODAwMDEwMEIsCi0KLSAgLyoqIFBvcnRzIGJlaW5nIGNvbm5lY3RlZCBhcmUgbm90IGNvbXBhdGlibGUgKi8KLSAgT01YX0Vycm9yUG9ydHNOb3RDb21wYXRpYmxlID0gKE9NWF9TMzIpIDB4ODAwMDEwMEMsCi0KLSAgLyoqIFJlc291cmNlcyBhbGxvY2F0ZWQgdG8gYW4gaWRsZSBjb21wb25lbnQgaGF2ZSBiZWVuCi0gICAgICBsb3N0IHJlc3VsdGluZyBpbiB0aGUgY29tcG9uZW50IHJldHVybmluZyB0byB0aGUgbG9hZGVkIHN0YXRlICovCi0gIE9NWF9FcnJvclJlc291cmNlc0xvc3QgPSAoT01YX1MzMikgMHg4MDAwMTAwRCwKLQotICAvKiogTm8gbW9yZSBpbmRpY2llcyBjYW4gYmUgZW51bWVyYXRlZCAqLwotICBPTVhfRXJyb3JOb01vcmUgPSAoT01YX1MzMikgMHg4MDAwMTAwRSwKLQotICAvKiogVGhlIGNvbXBvbmVudCBkZXRlY3RlZCBhIHZlcnNpb24gbWlzbWF0Y2ggKi8KLSAgT01YX0Vycm9yVmVyc2lvbk1pc21hdGNoID0gKE9NWF9TMzIpIDB4ODAwMDEwMEYsCi0KLSAgLyoqIFRoZSBjb21wb25lbnQgaXMgbm90IHJlYWR5IHRvIHJldHVybiBkYXRhIGF0IHRoaXMgdGltZSAqLwotICBPTVhfRXJyb3JOb3RSZWFkeSA9IChPTVhfUzMyKSAweDgwMDAxMDEwLAotCi0gIC8qKiBUaGVyZSB3YXMgYSB0aW1lb3V0IHRoYXQgb2NjdXJyZWQgKi8KLSAgT01YX0Vycm9yVGltZW91dCA9IChPTVhfUzMyKSAweDgwMDAxMDExLAotCi0gIC8qKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIHRyeWluZyB0byB0cmFuc2l0aW9uIGludG8gdGhlIHN0YXRlIHlvdSBhcmUgYWxyZWFkeSBpbiAqLwotICBPTVhfRXJyb3JTYW1lU3RhdGUgPSAoT01YX1MzMikgMHg4MDAwMTAxMiwKLQotICAvKiogUmVzb3VyY2VzIGFsbG9jYXRlZCB0byBhbiBleGVjdXRpbmcgb3IgcGF1c2VkIGNvbXBvbmVudCBoYXZlIGJlZW4gCi0gICAgICBwcmVlbXB0ZWQsIGNhdXNpbmcgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gdG8gdGhlIGlkbGUgc3RhdGUgKi8KLSAgT01YX0Vycm9yUmVzb3VyY2VzUHJlZW1wdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMTMsIAotCi0gIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAotICAgICAgZHVyaW5nIHRoZSBhbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgKG9uIGEgdHJhbnNpdGlvbiBmcm9tIHRoZSBMT0FERUQgdG8gdGhlIElETEUgc3RhdGUgb3IKLSAgICAgIG9uIGEgcG9ydCByZXN0YXJ0KSB3aGVuIGl0IGRlZW1zIHRoYXQgaXQgaGFzIHdhaXRlZCBhbiB1bnVzdWFsbHkgbG9uZyB0aW1lIGZvciB0aGUgc3VwcGxpZXIgCi0gICAgICB0byBzZW5kIGl0IGFuIGFsbG9jYXRlZCBidWZmZXIgdmlhIGEgVXNlQnVmZmVyIGNhbGwuICovCi0gIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdBbGxvY2F0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTQsCi0KLSAgLyoqIEEgbm9uLXN1cHBsaWVyIHBvcnQgc2VuZHMgdGhpcyBlcnJvciB0byB0aGUgSUwgY2xpZW50ICh2aWEgdGhlIEV2ZW50SGFuZGxlciBjYWxsYmFjaykgCi0gICAgICBkdXJpbmcgdGhlIGRlYWxsb2NhdGlvbiBvZiBidWZmZXJzIChvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgSURMRSB0byBMT0FERUQgc3RhdGUgb3IgCi0gICAgICBvbiBhIHBvcnQgc3RvcCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgdGhlIHN1cHBsaWVyIAotICAgICAgdG8gcmVxdWVzdCB0aGUgZGVhbGxvY2F0aW9uIG9mIGEgYnVmZmVyIGhlYWRlciB2aWEgYSBGcmVlQnVmZmVyIGNhbGwuICovCi0gIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdEZWFsbG9jYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNSwKLQotICAvKiogQSBzdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAotICAgICAgZHVyaW5nIHRoZSBzdG9wcGluZyBvZiBhIHBvcnQgKGVpdGhlciBvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgSURMRSB0byBMT0FERUQgCi0gICAgICBzdGF0ZSBvciBhIHBvcnQgc3RvcCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgCi0gICAgICB0aGUgbm9uLXN1cHBsaWVyIHRvIHJldHVybiBhIGJ1ZmZlciB2aWEgYW4gRW1wdHlUaGlzQnVmZmVyIG9yIEZpbGxUaGlzQnVmZmVyIGNhbGwuICovCi0gIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdTdG9wID0gKE9NWF9TMzIpIDB4ODAwMDEwMTYsCi0KLSAgLyoqIEF0dGVtcHRpbmcgYSBzdGF0ZSB0cmFuc3Rpb24gdGhhdCBpcyBub3QgYWxsb3dlZCAqLwotICBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNywKLQotICAvKiBBdHRlbXB0aW5nIGEgY29tbWFuZCB0aGF0IGlzIG5vdCBhbGxvd2VkIGR1cmluZyB0aGUgcHJlc2VudCBzdGF0ZS4gKi8KLSAgT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxOCwgCi0KLSAgLyoqIFRoZSB2YWx1ZXMgZW5jYXBzdWxhdGVkIGluIHRoZSBwYXJhbWV0ZXIgb3IgY29uZmlnIHN0cnVjdHVyZSBhcmUgbm90IHN1cHBvcnRlZC4gKi8KLSAgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nID0gKE9NWF9TMzIpIDB4ODAwMDEwMTksCi0KLSAgLyoqIFRoZSBwYXJhbWV0ZXIgb3IgY29uZmlnIGluZGljYXRlZCBieSB0aGUgZ2l2ZW4gaW5kZXggaXMgbm90IHN1cHBvcnRlZC4gKi8KLSAgT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleCA9IChPTVhfUzMyKSAweDgwMDAxMDFBLAotCi0gIC8qKiBUaGUgcG9ydCBpbmRleCBzdXBwbGllZCBpcyBpbmNvcnJlY3QuICovCi0gIE9NWF9FcnJvckJhZFBvcnRJbmRleCA9IChPTVhfUzMyKSAweDgwMDAxMDFCLAotCi0gIC8qKiBUaGUgcG9ydCBoYXMgbG9zdCBvbmUgb3IgbW9yZSBvZiBpdHMgYnVmZmVycyBhbmQgaXQgdGh1cyB1bnBvcHVsYXRlZC4gKi8KLSAgT01YX0Vycm9yUG9ydFVucG9wdWxhdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMUMsCi0KLSAgLyoqIENvbXBvbmVudCBzdXNwZW5kZWQgZHVlIHRvIHRlbXBvcmFyeSBsb3NzIG9mIHJlc291cmNlcyAqLwotICBPTVhfRXJyb3JDb21wb25lbnRTdXNwZW5kZWQgPSAoT01YX1MzMikgMHg4MDAwMTAxRCwKLQotICAvKiogQ29tcG9uZW50IHN1c3BlbmRlZCBkdWUgdG8gYW4gaW5hYmlsaXR5IHRvIGFjcXVpcmUgZHluYW1pYyByZXNvdXJjZXMgKi8KLSAgT01YX0Vycm9yRHluYW1pY1Jlc291cmNlc1VuYXZhaWxhYmxlID0gKE9NWF9TMzIpIDB4ODAwMDEwMUUsCi0KLSAgLyoqIFdoZW4gdGhlIG1hY3JvYmxvY2sgZXJyb3IgcmVwb3J0aW5nIGlzIGVuYWJsZWQgdGhlIGNvbXBvbmVudCByZXR1cm5zIG5ldyBlcnJvciAKLSAgZm9yIGV2ZXJ5IGZyYW1lIHRoYXQgaGFzIGVycm9ycyAqLwotICBPTVhfRXJyb3JNYkVycm9yc0luRnJhbWUgPSAoT01YX1MzMikgMHg4MDAwMTAxRiwKLQotICAvKiogQSBjb21wb25lbnQgcmVwb3J0cyB0aGlzIGVycm9yIHdoZW4gaXQgY2Fubm90IHBhcnNlIG9yIGRldGVybWluZSB0aGUgZm9ybWF0IG9mIGFuIGlucHV0IHN0cmVhbS4gKi8KLSAgT01YX0Vycm9yRm9ybWF0Tm90RGV0ZWN0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMCwgCi0KLSAgLyoqIFRoZSBjb250ZW50IG9wZW4gb3BlcmF0aW9uIGZhaWxlZC4gKi8KLSAgT01YX0Vycm9yQ29udGVudFBpcGVPcGVuRmFpbGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjEsCi0KLSAgLyoqIFRoZSBjb250ZW50IGNyZWF0aW9uIG9wZXJhdGlvbiBmYWlsZWQuICovCi0gIE9NWF9FcnJvckNvbnRlbnRQaXBlQ3JlYXRpb25GYWlsZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMiwKLQotICAvKiogU2VwYXJhdGUgdGFibGUgaW5mb3JtYXRpb24gaXMgYmVpbmcgdXNlZCAqLwotICBPTVhfRXJyb3JTZXBlcmF0ZVRhYmxlc1VzZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMywKLQotICAvKiogVHVubmVsaW5nIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQqLwotICBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDI0LAotCi0gIE9NWF9FcnJvcktocm9ub3NFeHRlbnNpb25zID0gKE9NWF9TMzIpMHg4RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgT01YX0Vycm9yVmVuZG9yU3RhcnRVbnVzZWQgPSAoT01YX1MzMikweDkwMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0Vycm9yTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRVJST1JUWVBFOwotCi0vKiogQGluZ3JvdXAgY29yZSAqLwotdHlwZWRlZiBPTVhfRVJST1JUWVBFICgqIE9NWF9DT01QT05FTlRJTklUVFlQRSkoT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKLQotLyoqIEBpbmdyb3VwIGNvcmUgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEUKLXsKLSAgY29uc3QgY2hhciAgICAgICAgICAqIHBOYW1lOyAgICAgICAvKiBDb21wb25lbnQgbmFtZSwgMTI4IGJ5dGUgbGltaXQgKGluY2x1ZGluZyAnXDAnKSBhcHBsaWVzICovCi0gIE9NWF9DT01QT05FTlRJTklUVFlQRSBwSW5pdGlhbGl6ZTsgLyogQ29tcG9uZW50IGluc3RhbmNlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCi19IE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEU7Ci0KLS8qKiBAaW5ncm91cCBjb3JlICovCi1leHRlcm4gT01YX0NPTVBPTkVOVFJFR0lTVEVSVFlQRSBPTVhfQ29tcG9uZW50UmVnaXN0ZXJlZFtdOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUFJJT1JJVFlNR01UVFlQRSB7Ci0gT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSBPTVhfVTMyIG5Hcm91cFByaW9yaXR5OyAgICAgICAgICAgIC8qKjwgUHJpb3JpdHkgb2YgdGhlIGNvbXBvbmVudCBncm91cCAqLwotIE9NWF9VMzIgbkdyb3VwSUQ7ICAgICAgICAgICAgICAgICAgLyoqPCBJRCBvZiB0aGUgY29tcG9uZW50IGdyb3VwICovCi19IE9NWF9QUklPUklUWU1HTVRUWVBFOwotCi0vKiBDb21wb25lbnQgbmFtZSBhbmQgUm9sZSBuYW1lcyBhcmUgbGltaXRlZCB0byAxMjggY2hhcmFjdGVycyBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nICdcMCcuICovCi0jZGVmaW5lIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIDEyOAotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1U4IGNSb2xlW09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsgIC8qKjwgbmFtZSBvZiBzdGFuZGFyZCBjb21wb25lbnQgd2hpY2ggZGVmaW5lcyBjb21wb25lbnQgcm9sZSAqLwotfSBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEU7Ci0KLS8qKiBFbmQgb2YgU3RyZWFtIEJ1ZmZlciBGbGFnOiAKLSAgKgotICAqIEEgY29tcG9uZW50IHNldHMgRU9TIHdoZW4gaXQgaGFzIG5vIG1vcmUgZGF0YSB0byBlbWl0IG9uIGEgcGFydGljdWxhciAKLSAgKiBvdXRwdXQgcG9ydC4gVGh1cyBhbiBvdXRwdXQgcG9ydCBzaGFsbCBzZXQgRU9TIG9uIHRoZSBsYXN0IGJ1ZmZlciBpdCAKLSAgKiBlbWl0cy4gQSBjb21wb25lbnQncyBkZXRlcm1pbmF0aW9uIG9mIHdoZW4gYW4gb3V0cHV0IHBvcnQgc2hvdWxkIAotICAqIGNlYXNlIHNlbmRpbmcgZGF0YSBpcyBpbXBsZW1lbmF0aW9uIHNwZWNpZmljLgotICAqIEBpbmdyb3VwIGJ1ZgotICAqLwotCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VPUyAweDAwMDAwMDAxIAotCi0vKiogU3RhcnQgVGltZSBCdWZmZXIgRmxhZzogCi0gKgotICogVGhlIHNvdXJjZSBvZiBhIHN0cmVhbSAoZS5nLiBhIGRlbXV4IGNvbXBvbmVudCkgc2V0cyB0aGUgU1RBUlRUSU1FCi0gKiBmbGFnIG9uIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgc3RhcnRpbmcgdGltZXN0YW1wIGZvciB0aGUKLSAqIHN0cmVhbS4gVGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgZGF0YSB0aGF0Ci0gKiBzaG91bGQgYmUgZGlzcGxheWVkIGF0IHN0YXJ0dXAgb3IgYWZ0ZXIgYSBzZWVrLgotICogVGhlIGZpcnN0IHRpbWVzdGFtcCBvZiB0aGUgc3RyZWFtIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc3RhcnQgdGltZS4KLSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGNhc2Ugb2YgYSBzZWVrIHRvIGEgcGFydGljdWxhciB2aWRlbyBmcmFtZSwgCi0gKiB0aGUgdGFyZ2V0IGZyYW1lIG1heSBiZSBhbiBpbnRlcmZyYW1lLiBUaHVzIHRoZSBmaXJzdCBidWZmZXIgb2YgCi0gKiB0aGUgc3RyZWFtIHdpbGwgYmUgdGhlIGludHJhLWZyYW1lIHByZWNlZGluZyB0aGUgdGFyZ2V0IGZyYW1lIGFuZAotICogdGhlIHN0YXJ0dGltZSB3aWxsIG9jY3VyIHdpdGggdGhlIHRhcmdldCBmcmFtZSAod2l0aCBhbnkgb3RoZXIKLSAqIHJlcXVpcmVkIGZyYW1lcyByZXF1aXJlZCB0byByZWNvbnN0cnVjdCB0aGUgdGFyZ2V0IGludGVydmVuaW5nKS4KLSAqCi0gKiBUaGUgU1RBUlRUSU1FIGZsYWcgaXMgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIncyAKLSAqIHRpbWVzdGFtcCAnIHRodXMgaXRzIGFzc29jaWF0aW9uIHRvIGJ1ZmZlciBkYXRhIGFuZCBpdHMgCi0gKiBwcm9wYWdhdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIHRpbWVzdGFtcCdzLgotICoKLSAqIFdoZW4gYSBTeW5jIENvbXBvbmVudCBjbGllbnQgcmVjZWl2ZXMgYSBidWZmZXIgd2l0aCB0aGUgCi0gKiBTVEFSVFRJTUUgZmxhZyBpdCBzaGFsbCBwZXJmb3JtIGEgU2V0Q29uZmlnIG9uIGl0cyBzeW5jIHBvcnQgCi0gKiB1c2luZyBPTVhfQ29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSBhbmQgcGFzc2luZyB0aGUgYnVmZmVyJ3MKLSAqIHRpbWVzdGFtcC4KLSAqIAotICogQGluZ3JvdXAgYnVmCi0gKi8KLQotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19TVEFSVFRJTUUgMHgwMDAwMDAwMgotCi0gCi0KLS8qKiBEZWNvZGUgT25seSBCdWZmZXIgRmxhZzogCi0gKgotICogVGhlIHNvdXJjZSBvZiBhIHN0cmVhbSAoZS5nLiBhIGRlbXV4IGNvbXBvbmVudCkgc2V0cyB0aGUgREVDT0RFT05MWQotICogZmxhZyBvbiBhbnkgYnVmZmVyIHRoYXQgc2hvdWxkIHNoYWxsIGJlIGRlY29kZWQgYnV0IHNob3VsZCBub3QgYmUKLSAqIGRpc3BsYXllZC4gVGhpcyBmbGFnIGlzIHVzZWQsIGZvciBpbnN0YW5jZSwgd2hlbiBhIHNvdXJjZSBzZWVrcyB0byAKLSAqIGEgdGFyZ2V0IGludGVyZnJhbWUgdGhhdCByZXF1aXJlcyB0aGUgZGVjb2RlIG9mIGZyYW1lcyBwcmVjZWRpbmcgdGhlIAotICogdGFyZ2V0IHRvIGZhY2lsaXRhdGUgdGhlIHRhcmdldCdzIHJlY29uc3RydWN0aW9uLiBJbiB0aGlzIGNhc2UgdGhlIAotICogc291cmNlIHdvdWxkIGVtaXQgdGhlIGZyYW1lcyBwcmVjZWRpbmcgdGhlIHRhcmdldCBkb3duc3RyZWFtIAotICogYnV0IG1hcmsgdGhlbSBhcyBkZWNvZGUgb25seS4KLSAqCi0gKiBUaGUgREVDT0RFT05MWSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyIGRhdGEgYW5kIHByb3BhZ2F0ZWQgaW4gYSAKLSAqIG1hbm5lciBpZGVudGljYWwgdG8gdGhlIGJ1ZmZlciB0aW1lc3RhbXAuCi0gKgotICogQSBjb21wb25lbnQgdGhhdCByZW5kZXJzIGRhdGEgc2hvdWxkIGlnbm9yZSBhbGwgYnVmZmVycyB3aXRoIAotICogdGhlIERFQ09ERU9OTFkgZmxhZyBzZXQuCi0gKiAKLSAqIEBpbmdyb3VwIGJ1ZgotICovCi0KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfREVDT0RFT05MWSAweDAwMDAwMDA0Ci0KLQotLyogRGF0YSBDb3JydXB0IEZsYWc6IFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB0aGUgSUwgY2xpZW50IGJlbGlldmVzIHRoZSBkYXRhIGluIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBpcyBjb3JydXB0IAotICogQGluZ3JvdXAgYnVmCi0gKi8KLQotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19EQVRBQ09SUlVQVCAweDAwMDAwMDA4Ci0KLS8qIEVuZCBvZiBGcmFtZTogVGhlIGJ1ZmZlciBjb250YWlucyBleGFjdGx5IG9uZSBlbmQgb2YgZnJhbWUgYW5kIG5vIGRhdGEKLSAqICBvY2N1cnMgYWZ0ZXIgdGhlIGVuZCBvZiBmcmFtZS4gVGhpcyBmbGFnIGlzIGFuIG9wdGlvbmFsIGhpbnQuIFRoZSBhYnNlbmNlCi0gKiAgb2YgdGhpcyBmbGFnIGRvZXMgbm90IGltcGx5IHRoZSBhYnNlbmNlIG9mIGFuIGVuZCBvZiBmcmFtZSB3aXRoaW4gdGhlIGJ1ZmZlci4gCi0gKiBAaW5ncm91cCBidWYKLSovCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUgMHgwMDAwMDAxMAotCi0vKiBTeW5jIEZyYW1lIEZsYWc6IFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB0aGUgYnVmZmVyIGNvbnRlbnQgY29udGFpbnMgYSBjb2RlZCBzeW5jIGZyYW1lICcgCi0gKiAgYSBmcmFtZSB0aGF0IGhhcyBubyBkZXBlbmRlbmN5IG9uIGFueSBvdGhlciBmcmFtZSBpbmZvcm1hdGlvbiAKLSAqICBAaW5ncm91cCBidWYKLSAqLwotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUUgMHgwMDAwMDAyMAotCi0vKiBFeHRyYSBkYXRhIHByZXNlbnQgZmxhZzogdGhlcmUgaXMgZXh0cmEgZGF0YSBhcHBlbmRlZCB0byB0aGUgZGF0YSBzdHJlYW0KLSAqIHJlc2lkaW5nIGluIHRoZSBidWZmZXIgCi0gKiBAaW5ncm91cCBidWYgIAotICovCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VYVFJBREFUQSAweDAwMDAwMDQwCi0KLS8qKiBDb2RlYyBDb25maWcgQnVmZmVyIEZsYWc6IAotKiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyBpcyBhbiBvcHRpb25hbCBmbGFnIHRoYXQgaXMgc2V0IGJ5IGFuCi0qIG91dHB1dCBwb3J0IHdoZW4gYWxsIGJ5dGVzIGluIHRoZSBidWZmZXIgZm9ybSBwYXJ0IG9yIGFsbCBvZiBhIHNldCBvZgotKiBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRhdGEuICBFeGFtcGxlcyBpbmNsdWRlIFNQUy9QUFMgbmFsIHVuaXRzCi0qIGZvciBPTVhfVklERU9fQ29kaW5nQVZDIG9yIEF1ZGlvU3BlY2lmaWNDb25maWcgZGF0YSBmb3IKLSogT01YX0FVRElPX0NvZGluZ0FBQy4gIEFueSBjb21wb25lbnQgdGhhdCBmb3IgYSBnaXZlbiBzdHJlYW0gc2V0cyAKLSogT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgc2hhbGwgbm90IG1peCBjb2RlYyBjb25maWd1cmF0aW9uIGJ5dGVzCi0qIHdpdGggZnJhbWUgZGF0YSBpbiB0aGUgc2FtZSBidWZmZXIsIGFuZCBzaGFsbCBzZW5kIGFsbCBidWZmZXJzCi0qIGNvbnRhaW5pbmcgY29kZWMgY29uZmlndXJhdGlvbiBieXRlcyBiZWZvcmUgYW55IGJ1ZmZlcnMgY29udGFpbmluZwotKiBmcmFtZSBkYXRhIHRoYXQgdGhvc2UgY29uZmlndXJhdGlvbnMgYnl0ZXMgZGVzY3JpYmUuCi0qIElmIHRoZSBzdHJlYW0gZm9ybWF0IGZvciBhIHBhcnRpY3VsYXIgY29kZWMgaGFzIGEgZnJhbWUgc3BlY2lmaWMKLSogaGVhZGVyIGF0IHRoZSBzdGFydCBvZiBlYWNoIGZyYW1lLCBmb3IgZXhhbXBsZSBPTVhfQVVESU9fQ29kaW5nTVAzIG9yCi0qIE9NWF9BVURJT19Db2RpbmdBQUMgaW4gQURUUyBtb2RlLCB0aGVuIHRoZXNlIHNoYWxsIGJlIHByZXNlbnRlZCBhcwotKiBub3JtYWwgd2l0aG91dCBzZXR0aW5nIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHLgotICogQGluZ3JvdXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgMHgwMDAwMDA4MAotCi0KLQotLyoqIEBpbmdyb3VwIGJ1ZiAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0JVRkZFUkhFQURFUlRZUEUKLXsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1U4KiBwQnVmZmVyOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byBhY3R1YWwgYmxvY2sgb2YgbWVtb3J5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaXMgYWN0aW5nIGFzIHRoZSBidWZmZXIgKi8KLSAgICBPTVhfVTMyIG5BbGxvY0xlbjsgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBidWZmZXIgYWxsb2NhdGVkLCBpbiBieXRlcyAqLwotICAgIE9NWF9VMzIgbkZpbGxlZExlbjsgICAgICAgICAvKio8IG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgaW4gdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAqLwotICAgIE9NWF9VMzIgbk9mZnNldDsgICAgICAgICAgICAvKio8IHN0YXJ0IG9mZnNldCBvZiB2YWxpZCBkYXRhIGluIGJ5dGVzIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICAgIE9NWF9QVFIgcEFwcFByaXZhdGU7ICAgICAgICAvKio8IHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KLSAgICBPTVhfUFRSIHBQbGF0Zm9ybVByaXZhdGU7ICAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovIAotICAgIE9NWF9QVFIgcElucHV0UG9ydFByaXZhdGU7ICAvKio8IHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIGlucHV0IHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLwotICAgIE9NWF9QVFIgcE91dHB1dFBvcnRQcml2YXRlOyAvKio8IHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIG91dHB1dCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KLSAgICBPTVhfSEFORExFVFlQRSBoTWFya1RhcmdldENvbXBvbmVudDsgLyoqPCBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCBnZW5lcmF0ZSBhIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmsgZXZlbnQgdXBvbiBwcm9jZXNzaW5nIHRoaXMgYnVmZmVyLiAqLwotICAgIE9NWF9QVFIgcE1hcmtEYXRhOyAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgYXNzb2NpYXRlZCB3aXRoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrIHNlbnQgb24gYSBtYXJrIGV2ZW50IHRvIGRpc2FtYmlndWF0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hcmsgZnJvbSBvdGhlcnMuICovCi0gICAgT01YX1UzMiBuVGlja0NvdW50OyAgICAgICAgIC8qKjwgT3B0aW9uYWwgZW50cnkgdGhhdCB0aGUgY29tcG9uZW50IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNhbiB1cGRhdGUgd2l0aCBhIHRpY2sgY291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZXkgYWNjZXNzIHRoZSBjb21wb25lbnQuICBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIGluIG1pY3Jvc2Vjb25kcy4gIFNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBhIHZhbHVlIHJlbGF0aXZlIHRvIGFuIGFyYml0cmFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIHBvaW50LCB0aGlzIHZhbHVlIGNhbm5vdCBiZSB1c2VkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRldGVybWluZSBhYnNvbHV0ZSB0aW1lLiAgVGhpcyBpcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGVudHJ5IGFuZCBub3QgYWxsIGNvbXBvbmVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHVwZGF0ZSBpdC4qLwotIE9NWF9USUNLUyBuVGltZVN0YW1wOyAgICAgICAgICAvKio8IFRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1wbGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGxvZ2ljYWwgc2FtcGxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5IGluIHRoZSBidWZmZXIuIFRpbWVzdGFtcHMgb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZSBzYW1wbGVzIHdpdGhpbiB0aGUgYnVmZmVyIG1heQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGluZmVycmVkIGJ5IGFkZGluZyB0aGUgZHVyYXRpb24gb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcmVjZWRpbmcgYnVmZmVyIHRvIHRoZSB0aW1lc3RhbXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJlY2VkaW5nIGJ1ZmZlci4qLwotICBPTVhfVTMyICAgICBuRmxhZ3M7ICAgICAgICAgICAvKio8IGJ1ZmZlciBzcGVjaWZpYyBmbGFncyAqLwotICBPTVhfVTMyIG5PdXRwdXRQb3J0SW5kZXg7ICAgICAvKio8IFRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IHBvcnQgKGlmIGFueSkgdXNpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIgKi8KLSAgT01YX1UzMiBuSW5wdXRQb3J0SW5kZXg7ICAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIGlucHV0IHBvcnQgKGlmIGFueSkgdXNpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJ1ZmZlciAqLwotfSBPTVhfQlVGRkVSSEVBREVSVFlQRTsKLQotLyoqIFRoZSBPTVhfRVhUUkFEQVRBVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGRlZmluZSB0aGUgCi0gKiBwb3NzaWJsZSBleHRyYSBkYXRhIHBheWxvYWQgdHlwZXMuCi0gKiBOQjogdGhpcyBlbnVtIGlzIGJpbmFyeSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcmV2aW91cwotICogT01YX0VYVFJBREFUQV9RVUFOVCBkZWZpbmUuICBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoCi0gKiBPTVhfRXh0cmFEYXRhUXVhbnRpemF0aW9uLgotICovCi10eXBlZGVmIGVudW0gT01YX0VYVFJBREFUQVRZUEUKLXsKLSAgIE9NWF9FeHRyYURhdGFOb25lID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHRoYXQgbm8gbW9yZSBleHRyYSBkYXRhIHNlY3Rpb25zIGZvbGxvdyAqLyAgICAgICAgCi0gICBPTVhfRXh0cmFEYXRhUXVhbnRpemF0aW9uLCAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBkYXRhIHBheWxvYWQgY29udGFpbnMgcXVhbnRpemF0aW9uIGRhdGEgKi8KLSAgIE9NWF9FeHRyYURhdGFLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICBPTVhfRXh0cmFEYXRhVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgIE9NWF9FeHRyYURhdGFNYXggPSAweDdGRkZGRkZGCi19IE9NWF9FWFRSQURBVEFUWVBFOwotCi0KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9FWFRSQURBVEFUWVBFIGVUeXBlOyAgICAgICAvKiBFeHRyYSBEYXRhIHR5cGUgKi8KLSAgICBPTVhfVTMyIG5EYXRhU2l6ZTsgICAvKiBTaXplIG9mIHRoZSBzdXBwb3J0aW5nIGRhdGEgdG8gZm9sbG93ICovCi0gICAgT01YX1U4ICBkYXRhWzFdOyAgICAgLyogU3VwcG9ydGluZyBkYXRhIGhpbnQgICovCi19IE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFOwotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BPUlRfUEFSQU1fVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcG9ydHMgZm9yIHRoaXMgY29tcG9uZW50ICovCi0gICAgT01YX1UzMiBuU3RhcnRQb3J0TnVtYmVyOyAgIC8qKiBmaXJzdCBwb3J0IG51bWJlciBmb3IgdGhpcyB0eXBlIG9mIHBvcnQgKi8KLX0gT01YX1BPUlRfUEFSQU1fVFlQRTsgCi0KLS8qKiBAaW5ncm91cCBjb21wICovCi10eXBlZGVmIGVudW0gT01YX0VWRU5UVFlQRQotewotICAgIE9NWF9FdmVudENtZENvbXBsZXRlLCAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBzdWNlc3NmdWxseSBjb21wbGV0ZWQgYSBjb21tYW5kICovCi0gICAgT01YX0V2ZW50RXJyb3IsICAgICAgICAgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIGFuIGVycm9yIGNvbmRpdGlvbiAqLwotICAgIE9NWF9FdmVudE1hcmssICAgICAgICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhIGJ1ZmZlciBtYXJrICovCi0gICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyoqPCBjb21wb25lbnQgaXMgcmVwb3J0ZWQgYSBwb3J0IHNldHRpbmdzIGNoYW5nZSAqLwotICAgIE9NWF9FdmVudEJ1ZmZlckZsYWcsICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhbiBFT1MgKi8gCi0gICAgT01YX0V2ZW50UmVzb3VyY2VzQWNxdWlyZWQsICAgLyoqPCBjb21wb25lbnQgaGFzIGJlZW4gZ3JhbnRlZCByZXNvdXJjZXMgYW5kIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHN0YXJ0aW5nIHRoZSBzdGF0ZSBjaGFuZ2UgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0YXRlV2FpdEZvclJlc291cmNlcyB0byBPTVhfU3RhdGVJZGxlLiAqLwotICAgT01YX0V2ZW50Q29tcG9uZW50UmVzdW1lZCwgICAgIC8qKjwgQ29tcG9uZW50IHJlc3VtZWQgZHVlIHRvIHJlYWNxdWlzaXRpb24gb2YgcmVzb3VyY2VzICovCi0gICBPTVhfRXZlbnREeW5hbWljUmVzb3VyY2VzQXZhaWxhYmxlLCAvKio8IENvbXBvbmVudCBoYXMgYWNxdWlyZWQgcHJldmlvdXNseSB1bmF2YWlsYWJsZSBkeW5hbWljIHJlc291cmNlcyAqLwotICAgT01YX0V2ZW50UG9ydEZvcm1hdERldGVjdGVkLCAgICAgIC8qKjwgQ29tcG9uZW50IGhhcyBkZXRlY3RlZCBhIHN1cHBvcnRlZCBmb3JtYXQuICovCi0gICBPTVhfRXZlbnRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICBPTVhfRXZlbnRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgT01YX0V2ZW50TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRVZFTlRUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ0FMTEJBQ0tUWVBFCi17Ci0gICAgLyoqIFRoZSBFdmVudEhhbmRsZXIgbWV0aG9kIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiB3aGVuIGFuCi0gICAgICAgIGV2ZW50IG9mIGludGVyZXN0IG9jY3Vycy4gIEV2ZW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgT01YX0VWRU5UVFlQRQotICAgICAgICBlbnVtZXJhdGlvbi4gIFBsZWFzZSBzZWUgdGhhdCBlbnVtZXJhdGlvbiBmb3IgZGV0YWlscyBvZiB3aGF0IHdpbGwKLSAgICAgICAgYmUgcmV0dXJuZWQgZm9yIGVhY2ggdHlwZSBvZiBldmVudC4gQ2FsbGJhY2tzIHNob3VsZCBub3QgcmV0dXJuCi0gICAgICAgIGFuIGVycm9yIHRvIHRoZSBjb21wb25lbnQsIHNvIGlmIGFuIGVycm9yIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIAotICAgICAgICBzaGFsbCBoYW5kbGUgaXQgaW50ZXJuYWxseS4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgotCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMgdG8gYXZvaWQKLSAgICAgICAgYmxvY2tpbmcgdGhlIGNvbXBvbmVudCBmb3IgYW4gZXhjZXNzaXZlbHkgbG9uZyBwZXJpb2Qgb2YgdGltZS4KLQotICAgICAgICBAcGFyYW0gaENvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICAgICAgQHBhcmFtIHBBcHBEYXRhCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAotICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgICAgIGNhbiBoYXZlIGEgY29tcG9uZW50IHNwZWNpZmljIGNvbnRleHQgd2hlbiByZWNlaXZpbmcgdGhlIGNhbGxiYWNrLgotICAgICAgICBAcGFyYW0gZUV2ZW50Ci0gICAgICAgICAgICBFdmVudCB0aGF0IHRoZSBjb21wb25lbnQgd2FudHMgdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiBhYm91dC4KLSAgICAgICAgQHBhcmFtIG5EYXRhMQotICAgICAgICAgICAgbkRhdGEgd2lsbCBiZSB0aGUgT01YX0VSUk9SVFlQRSBmb3IgYW4gZXJyb3IgZXZlbnQgYW5kIHdpbGwgYmUgCi0gICAgICAgICAgICBhbiBPTVhfQ09NTUFORFRZUEUgZm9yIGEgY29tbWFuZCBjb21wbGV0ZSBldmVudCBhbmQgT01YX0lOREVYVFlQRSBmb3IgYSBPTVhfUG9ydFNldHRpbmdzQ2hhbmdlZCBldmVudC4KLSAgICAgICAgIEBwYXJhbSBuRGF0YTIKLSAgICAgICAgICAgIG5EYXRhMiB3aWxsIGhvbGQgZnVydGhlciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBldmVudC4gQ2FuIGJlIE9NWF9TVEFURVRZUEUgZm9yCi0gICAgICAgICAgICBhIE9NWF9Db21tYW5kU3RhdGVTZXQgY29tbWFuZCBvciBwb3J0IGluZGV4IGZvciBhIE9NWF9Qb3J0U2V0dGluZ3NDaGFuZ2VkIGV2ZW50LgotICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyAwIGlmIG5vdCB1c2VkLiApCi0gICAgICAgIEBwYXJhbSBwRXZlbnREYXRhCi0gICAgICAgICAgICBQb2ludGVyIHRvIGFkZGl0aW9uYWwgZXZlbnQtc3BlY2lmaWMgZGF0YSAoc2VlIHNwZWMgZm9yIG1lYW5pbmcpLgotICAgICAgKi8KLQotICAgT01YX0VSUk9SVFlQRSAoKkV2ZW50SGFuZGxlcikoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKLSAgICAgICAgT01YX0lOIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAotICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCi0gICAgICAgIE9NWF9JTiBPTVhfVTMyIG5EYXRhMiwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgcEV2ZW50RGF0YSk7Ci0KLSAgICAvKiogVGhlIEVtcHR5QnVmZmVyRG9uZSBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gZW1wdGllZCBidWZmZXJzIGZyb20gYW4KLSAgICAgICAgaW5wdXQgcG9ydCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3IgcmV1c2UuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbCAKLSAgICAgICAgc28gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byByZWZpbGwgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMKLSAgICAgICAgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGVtIGFuZCByZWZpbGwgdGhlbSBpbiBhbm90aGVyIHRocmVhZC4gIFRoZXJlCi0gICAgICAgIGlzIG5vIGVycm9yIHJldHVybiwgc28gdGhlIGFwcGxpY2F0aW9uIHNoYWxsIGhhbmRsZSBhbnkgZXJyb3JzIGdlbmVyYXRlZAotICAgICAgICBpbnRlcm5hbGx5LiAgCi0gICAgICAgIAotICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgICAgICAKLSAgICAgICAgQHBhcmFtIGhDb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGFjY2Vzcy4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgICAgIEBwYXJhbSBwQXBwRGF0YQotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZSAKLSAgICAgICAgICAgIHBBcHBEYXRhIHBhcmFtZXRlciB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gCi0gICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KLSAgICAgICAgQHBhcmFtIHBCdWZmZXIKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgotICAgICAgICAgICAgb3IgQWxsb2NhdGVCdWZmZXIgaW5kaWNhdGluZyB0aGUgYnVmZmVyIHRoYXQgd2FzIGVtcHRpZWQuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpFbXB0eUJ1ZmZlckRvbmUpKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCi0gICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLSAgICAvKiogVGhlIEZpbGxCdWZmZXJEb25lIG1ldGhvZCBpcyB1c2VkIHRvIHJldHVybiBmaWxsZWQgYnVmZmVycyBmcm9tIGFuCi0gICAgICAgIG91dHB1dCBwb3J0IGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uIGZvciBlbXB0eWluZyBhbmQgdGhlbiByZXVzZS4gIAotICAgICAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbCBzbyB0aGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhdHRlbXB0IHRvIAotICAgICAgICBlbXB0eSB0aGUgYnVmZmVycyBkdXJpbmcgdGhpcyBjYWxsLCBidXQgc2hvdWxkIHF1ZXVlIHRoZSBidWZmZXJzIAotICAgICAgICBhbmQgZW1wdHkgdGhlbSBpbiBhbm90aGVyIHRocmVhZC4gIFRoZXJlIGlzIG5vIGVycm9yIHJldHVybiwgc28gCi0gICAgICAgIHRoZSBhcHBsaWNhdGlvbiBzaGFsbCBoYW5kbGUgYW55IGVycm9ycyBnZW5lcmF0ZWQgaW50ZXJuYWxseS4gIFRoZSAKLSAgICAgICAgYXBwbGljYXRpb24gc2hhbGwgYWxzbyB1cGRhdGUgdGhlIGJ1ZmZlciBoZWFkZXIgdG8gaW5kaWNhdGUgdGhlCi0gICAgICAgIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW50byB0aGUgYnVmZmVyLiAgCi0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAgICAgCi0gICAgICAgIEBwYXJhbSBoQ29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgICAgICBAcGFyYW0gcEFwcERhdGEKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCi0gICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAotICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCi0gICAgICAgIEBwYXJhbSBwQnVmZmVyCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKLSAgICAgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyIGluZGljYXRpbmcgdGhlIGJ1ZmZlciB0aGF0IHdhcyBmaWxsZWQuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpGaWxsQnVmZmVyRG9uZSkoCi0gICAgICAgIE9NWF9PVVQgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgT01YX09VVCBPTVhfUFRSIHBBcHBEYXRhLAotICAgICAgICBPTVhfT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKLQotfSBPTVhfQ0FMTEJBQ0tUWVBFOwotCi0vKiogVGhlIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBkaWN0YXRlIHBvcnQgc3VwcGxpZXIKLSAgICBwcmVmZXJlbmNlIHdoZW4gdHVubmVsaW5nIGJldHdlZW4gdHdvIHBvcnRzLgotICAgIEBpbmdyb3VwIHR1biBidWYKLSovCi10eXBlZGVmIGVudW0gT01YX0JVRkZFUlNVUFBMSUVSVFlQRQotewotICAgIE9NWF9CdWZmZXJTdXBwbHlVbnNwZWNpZmllZCA9IDB4MCwgLyoqPCBwb3J0IHN1cHBseWluZyB0aGUgYnVmZmVycyBpcyB1bnNwZWNpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkb24ndCBjYXJlICovCi0gICAgT01YX0J1ZmZlclN1cHBseUlucHV0LCAgICAgICAgICAgICAvKio8IGlucHV0IHBvcnQgc3VwcGxpZXMgdGhlIGJ1ZmZlcnMgKi8KLSAgICBPTVhfQnVmZmVyU3VwcGx5T3V0cHV0LCAgICAgICAgICAgIC8qKjwgb3V0cHV0IHBvcnQgc3VwcGxpZXMgdGhlIGJ1ZmZlcnMgKi8KLSAgICBPTVhfQnVmZmVyU3VwcGx5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9CdWZmZXJTdXBwbHlWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9CdWZmZXJTdXBwbHlNYXggPSAweDdGRkZGRkZGCi19IE9NWF9CVUZGRVJTVVBQTElFUlRZUEU7Ci0KLQotLyoqIGJ1ZmZlciBzdXBwbGllciBwYXJhbWV0ZXIgCi0gKiBAaW5ncm91cCB0dW4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZUJ1ZmZlclN1cHBsaWVyOyAvKio8IGJ1ZmZlciBzdXBwbGllciAqLwotfSBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFOwotCi0KLS8qKjwgaW5kaWNhdGVzIHRoYXQgYnVmZmVycyByZWNlaXZlZCBieSBhbiBpbnB1dCBwb3J0IG9mIGEgdHVubmVsIAotICAgICBtYXkgbm90IG1vZGlmeSB0aGUgZGF0YSBpbiB0aGUgYnVmZmVycyAKLSAgICAgQGluZ3JvdXAgdHVuCi0gKi8KLSNkZWZpbmUgT01YX1BPUlRUVU5ORUxGTEFHX1JFQURPTkxZIDB4MDAwMDAwMDEgCi0KLQotLyoqIFRoZSBPTVhfVFVOTkVMU0VUVVBUWVBFIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgZGF0YSBmcm9tIGFuIG91dHB1dAotICAgIHBvcnQgdG8gYW4gaW5wdXQgcG9ydCBhcyBwYXJ0IHRoZSB0d28gQ29tcG9uZW50VHVubmVsUmVxdWVzdCBjYWxscwotICAgIHJlc3VsdGluZyBmcm9tIGEgT01YX1NldHVwVHVubmVsIGNhbGwgZnJvbSB0aGUgSUwgQ2xpZW50LiAKLSAgICBAaW5ncm91cCB0dW4KLSAqLyAgIAotdHlwZWRlZiBzdHJ1Y3QgT01YX1RVTk5FTFNFVFVQVFlQRQotewotICAgIE9NWF9VMzIgblR1bm5lbEZsYWdzOyAgICAgICAgICAgICAvKio8IGJpdCBmbGFncyBmb3IgdHVubmVsaW5nICovCi0gICAgT01YX0JVRkZFUlNVUFBMSUVSVFlQRSBlU3VwcGxpZXI7IC8qKjwgc3VwcGxpZXIgcHJlZmVyZW5jZSAqLwotfSBPTVhfVFVOTkVMU0VUVVBUWVBFOyAKLQotLyogT01YIENvbXBvbmVudCBoZWFkZXJzIGlzIGluY2x1ZGVkIHRvIGVuYWJsZSB0aGUgY29yZSB0byB1c2UKLSAgIG1hY3JvcyBmb3IgZnVuY3Rpb25zIGludG8gdGhlIGNvbXBvbmVudCBmb3IgT01YIHJlbGVhc2UgMS4wLiAgCi0gICBEZXZlbG9wZXJzIHNob3VsZCBub3QgYWNjZXNzIGFueSBzdHJ1Y3R1cmVzIG9yIGRhdGEgZnJvbSB3aXRoaW4KLSAgIHRoZSBjb21wb25lbnQgaGVhZGVyIGRpcmVjdGx5ICovCi0vKiBUTyBCRSBSRU1PVkVEIC0gI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4gKi8KLQotLyoqIEdldENvbXBvbmVudFZlcnNpb24gd2lsbCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBvbmVudC4gIAotICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlCi0gICAgYXBwbGljYXRpb24gdG8gdGhlIGNvbXBvbmVudCAodmlhIGEgY29yZSBtYWNybykuICBUaGUKLSAgICBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSBvZiBjb21wb25lbnQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZAotICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50TmFtZQotICAgICAgICBwb2ludGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvZiBsZW5ndGggMTI4IGJ5dGVzLiAgVGhlIGNvbXBvbmVudCAKLSAgICAgICAgd2lsbCB3cml0ZSBpdHMgbmFtZSBpbnRvIHRoaXMgc3RyaW5nLiAgVGhlIG5hbWUgd2lsbCBiZSAKLSAgICAgICAgdGVybWluYXRlZCBieSBhIHNpbmdsZSB6ZXJvIGJ5dGUuICBUaGUgbmFtZSBvZiBhIGNvbXBvbmVudCB3aWxsIAotICAgICAgICBiZSAxMjcgYnl0ZXMgb3IgbGVzcyB0byBsZWF2ZSByb29tIGZvciB0aGUgdHJhaWxpbmcgemVybyBieXRlLiAgCi0gICAgICAgIEFuIGV4YW1wbGUgb2YgYSB2YWxpZCBjb21wb25lbnQgbmFtZSBpcyAiT01YLkFCQy5DaGFubmVsTWl4ZXJcMCIuCi0gICAgQHBhcmFtIFtvdXRdIHBDb21wb25lbnRWZXJzaW9uCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YIFZlcnNpb24gc3RydWN0dXJlIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgCi0gICAgICAgIGluLiAgVGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgaW4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgCi0gICAgICAgIGNvbXBvbmVudCB2ZXJzaW9uLiAgTk9URTogdGhlIGNvbXBvbmVudCB2ZXJzaW9uIGlzIE5PVCB0aGUgc2FtZSAKLSAgICAgICAgYXMgdGhlIE9NWCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gKGZvdW5kIGluIGFsbCBzdHJ1Y3R1cmVzKS4gIFRoZSAKLSAgICAgICAgY29tcG9uZW50IHZlcnNpb24gaXMgZGVmaW5lZCBieSB0aGUgdmVuZG9yIG9mIHRoZSBjb21wb25lbnQgYW5kIAotICAgICAgICBpdHMgdmFsdWUgaXMgZW50aXJlbHkgdXAgdG8gdGhlIGNvbXBvbmVudCB2ZW5kb3IuCi0gICAgQHBhcmFtIFtvdXRdIHBTcGVjVmVyc2lvbgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWCBWZXJzaW9uIHN0cnVjdHVyZSB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCBmaWxsIAotICAgICAgICBpbi4gIFRoZSBTcGVjVmVyc2lvbiBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSAKLSAgICAgICAgY29tcG9uZW50IHdhcyBidWlsdCBhZ2FpbnN0LiAgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIG1heSBvciAKLSAgICAgICAgbWF5IG5vdCBtYXRjaCB0aGUgc3RydWN0dXJlJ3MgdmVyc2lvbi4gIEZvciBleGFtcGxlLCBpZiB0aGUgCi0gICAgICAgIGNvbXBvbmVudCB3YXMgYnVpbHQgYWdhaW5zdCB0aGUgMi4wIHNwZWNpZmljYXRpb24sIGJ1dCB0aGUgCi0gICAgICAgIGFwcGxpY2F0aW9uICh3aGljaCBjcmVhdGVzIHRoZSBzdHJ1Y3R1cmUgaXMgYnVpbHQgYWdhaW5zdCB0aGUgCi0gICAgICAgIDEuMCBzcGVjaWZpY2F0aW9uIHRoZSB2ZXJzaW9ucyB3b3VsZCBiZSBkaWZmZXJlbnQuCi0gICAgQHBhcmFtIFtvdXRdIHBDb21wb25lbnRVVUlECi0gICAgICAgIHBvaW50ZXIgdG8gdGhlIFVVSUQgb2YgdGhlIGNvbXBvbmVudCB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiBieSAKLSAgICAgICAgdGhlIGNvbXBvbmVudC4gIFRoZSBVVUlEIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBpcyBzZXQgYXQgCi0gICAgICAgIFJVTiB0aW1lIGZvciB0aGUgY29tcG9uZW50IGFuZCBpcyB1bmlxdWUgdG8gZWFjaCBpbnN0YW50aW9uIG9mIAotICAgICAgICB0aGUgY29tcG9uZW50LgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfR2V0Q29tcG9uZW50VmVyc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50TmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50VmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwU3BlY1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50VVVJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRDb21wb25lbnRWZXJzaW9uKCAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50TmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50VmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwU3BlY1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50VVVJRCkgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgY29tcG9uZW50LiAgVGhpcyBjYWxsIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwuCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgY2hlY2sgdGhlIHBhcmFtZXRlcnMgYW5kIHRoZW4gcXVldWUgdGhlIGNvbW1hbmQKLSAgICB0byB0aGUgY29tcG9uZW50IHRocmVhZCB0byBiZSBleGVjdXRlZC4gIFRoZSBjb21wb25lbnQgdGhyZWFkIHNoYWxsIAotICAgIHNlbmQgdGhlIEV2ZW50SGFuZGxlcigpIGNhbGxiYWNrIGF0IHRoZSBjb25jbHVzaW9uIG9mIHRoZSBjb21tYW5kLiAKLSAgICBUaGlzIG1hY3JvIHdpbGwgZ28gZGlyZWN0bHkgZnJvbSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIGNvbXBvbmVudCAodmlhCi0gICAgYSBjb3JlIG1hY3JvKS4gIFRoZSBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFN0YXRlU2V0IiB0aGUgY29tcG9uZW50IHdpbGwgcXVldWUgYQotICAgIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBzdGF0ZSBpZGVuZmllZCBpbiBuUGFyYW0uCi0gICAgCi0gICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRGbHVzaCIsIHRvIGZsdXNoIGEgcG9ydCdzIGJ1ZmZlciBxdWV1ZXMsCi0gICAgdGhlIGNvbW1hbmQgd2lsbCBmb3JjZSB0aGUgY29tcG9uZW50IHRvIHJldHVybiBhbGwgYnVmZmVycyBOT1QgQ1VSUkVOVExZIAotICAgIEJFSU5HIFBST0NFU1NFRCB0byB0aGUgYXBwbGljYXRpb24sIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYnVmZmVycyAKLSAgICB3ZXJlIHJlY2VpdmVkLgotICAgIAotICAgIFdoZW4gdGhlIGNvbW1hbmQgaXMgIk9NWF9Db21tYW5kUG9ydERpc2FibGUiIG9yIAotICAgICJPTVhfQ29tbWFuZFBvcnRFbmFibGUiLCB0aGUgY29tcG9uZW50J3MgcG9ydCAoZ2l2ZW4gYnkgdGhlIHZhbHVlIG9mCi0gICAgblBhcmFtKSB3aWxsIGJlIHN0b3BwZWQgb3IgcmVzdGFydGVkLiAKLSAgICAKLSAgICBXaGVuIHRoZSBjb21tYW5kICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiIGlzIHVzZWQgdG8gbWFyayBhIGJ1ZmZlciwgdGhlCi0gICAgcENtZERhdGEgd2lsbCBwb2ludCB0byBhIE9NWF9NQVJLVFlQRSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgY29tcG9uZW50Ci0gICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gZXhhbWluZSB0aGUgYnVmZmVyIGNoYWluIGZvciB0aGUgbWFyay4gIG5QYXJhbTEKLSAgICBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlIHBvcnQgb24gd2hpY2ggdGhlIGJ1ZmZlciBtYXJrIGlzIGFwcGxpZWQuCi0KLSAgICBTcGVjaWZpY2F0aW9uIHRleHQgZm9yIG1vcmUgZGV0YWlscy4gCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBoYW5kbGUgb2YgY29tcG9uZW50IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICBAcGFyYW0gW2luXSBDbWQKLSAgICAgICAgQ29tbWFuZCBmb3IgdGhlIGNvbXBvbmVudCB0byBleGVjdXRlCi0gICAgQHBhcmFtIFtpbl0gblBhcmFtCi0gICAgICAgIFBhcmFtZXRlciBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlIAotICAgICAgICBPTVhfQ29tbWFuZFN0YXRlU2V0LCB2YWx1ZSBpcyBhIG1lbWJlciBvZiBPTVhfU1RBVEVUWVBFLiAgV2hlbiBDbWQgaGFzIAotICAgICAgICB0aGUgdmFsdWUgT01YX0NvbW1hbmRGbHVzaCwgdmFsdWUgb2YgblBhcmFtIGluZGljYXRlcyB3aGljaCBwb3J0KHMpIAotICAgICAgICB0byBmbHVzaC4gLTEgaXMgdXNlZCB0byBmbHVzaCBhbGwgcG9ydHMgYSBzaW5nbGUgcG9ydCBpbmRleCB3aWxsIAotICAgICAgICBvbmx5IGZsdXNoIHRoYXQgcG9ydC4gIFdoZW4gQ21kIGhhcyB0aGUgdmFsdWUgIk9NWF9Db21tYW5kUG9ydERpc2FibGUiCi0gICAgICAgIG9yICJPTVhfQ29tbWFuZFBvcnRFbmFibGUiLCB0aGUgY29tcG9uZW50J3MgcG9ydCBpcyBnaXZlbiBieSAKLSAgICAgICAgdGhlIHZhbHVlIG9mIG5QYXJhbS4gIFdoZW4gQ21kIGhhcyB0aGUgdmFsdWUgIk9NWF9Db21tYW5kTWFya0J1ZmZlciIKLSAgICAgICAgdGhlIGNvbXBvbmVudHMgcG90IGlzIGdpdmVuIGJ5IHRoZSB2YWx1ZSBvZiBuUGFyYW0uCi0gICAgQHBhcmFtIFtpbl0gcENtZERhdGEKLSAgICAgICAgUGFyYW1ldGVyIHBvaW50aW5nIHRvIHRoZSBPTVhfTUFSS1RZUEUgc3RydWN0dXJlIHdoZW4gQ21kIGhhcyB0aGUgdmFsdWUKLSAgICAgICAgIk9NWF9Db21tYW5kTWFya0J1ZmZlciIuICAgICAKLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wCi0gKi8KLSNkZWZpbmUgT01YX1NlbmRDb21tYW5kKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIENtZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIG5QYXJhbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIHBDbWREYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlNlbmRDb21tYW5kKCAgICAgICAgIFwKLSAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIENtZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIG5QYXJhbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIHBDbWREYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfR2V0UGFyYW1ldGVyIG1hY3JvIHdpbGwgZ2V0IG9uZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIgCi0gICAgc2V0dGluZ3MgZnJvbSB0aGUgY29tcG9uZW50LiAgVGhpcyBtYWNybyBjYW5ub3Qgb25seSBiZSBpbnZva2VkIHdoZW4gCi0gICAgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgT01YX1N0YXRlSW52YWxpZCBzdGF0ZS4gIFRoZSBuUGFyYW1JbmRleAotICAgIHBhcmFtZXRlciBpcyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIHN0cnVjdHVyZSBpcyBiZWluZyByZXF1ZXN0ZWQgZnJvbQotICAgIHRoZSBjb21wb25lbnQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIAotICAgIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiBiZWZvcmUgCi0gICAgaW52b2tpbmcgdGhpcyBtYWNyby4gIFdoZW4gdGhlIHBhcmFtZXRlciBhcHBsaWVzIHRvIGEgcG9ydCwgdGhlCi0gICAgY2FsbGVyIHNoYWxsIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIG5Qb3J0SW5kZXggdmFsdWUgaW5kaWNhdGluZyB0aGUKLSAgICBwb3J0IG9uIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXBwbGllcy4gSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZCAKLSAgICBhbnkgc2V0dGluZ3MgY2hhbmdlZCwgdGhlbiB0aGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gYSBzZXQgb2YgCi0gICAgdmFsaWQgREVGQVVMVCAgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZyAKLSAgICBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbaW5dIG5QYXJhbUluZGV4Ci0gICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkLiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQotICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgotICAgIEBwYXJhbSBbaW4sb3V0XSBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlCi0gICAgICAgIFBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlIAotICAgICAgICBjb21wb25lbnQuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9HZXRQYXJhbWV0ZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5QYXJhbUluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRQYXJhbWV0ZXIoICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9TZXRQYXJhbWV0ZXIgbWFjcm8gd2lsbCBzZW5kIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcgotICAgIHN0cnVjdHVyZSB0byBhIGNvbXBvbmVudC4gIEVhY2ggc3RydWN0dXJlIHNoYWxsIGJlIHNlbnQgb25lIGF0IGEgdGltZSwKLSAgICBpbiBhIHNlcGFyYXRlIGludm9jYXRpb24gb2YgdGhlIG1hY3JvLiAgVGhpcyBtYWNybyBjYW4gb25seSBiZQotICAgIGludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGluIHRoZSBPTVhfU3RhdGVMb2FkZWQgc3RhdGUsIG9yIHRoZQotICAgIHBvcnQgaXMgZGlzYWJsZWQgKHdoZW4gdGhlIHBhcmFtZXRlciBhcHBsaWVzIHRvIGEgcG9ydCkuIFRoZSAKLSAgICBuUGFyYW1JbmRleCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcKLSAgICBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudC4gIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgCi0gICAgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIAotICAgIGluZm9ybWF0aW9uIChhcyB3ZWxsIGFzIHRoZSBhY3R1YWwgZGF0YSkgYmVmb3JlIGludm9raW5nIHRoaXMgbWFjcm8uCi0gICAgVGhlIGFwcGxpY2F0aW9uIGlzIGZyZWUgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBhZnRlciB0aGUgY2FsbAotICAgIGFzIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQgdG8gY29weSBhbnkgZGF0YSBpdCBzaGFsbCByZXRhaW4uICBUaGlzIAotICAgIGlzIGEgYmxvY2tpbmcgY2FsbC4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuSW5kZXgKLSAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBzZW50LiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQotICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgotICAgIEBwYXJhbSBbaW5dIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUKLSAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIHVzZWQgZm9yCi0gICAgICAgIGluaXRpYWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9TZXRQYXJhbWV0ZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5QYXJhbUluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZXRQYXJhbWV0ZXIoICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9HZXRDb25maWcgbWFjcm8gd2lsbCBnZXQgb25lIG9mIHRoZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMgCi0gICAgZnJvbSBhIGNvbXBvbmVudC4gIFRoaXMgbWFjcm8gY2FuIGJlIGludm9rZWQgYW55dGltZSBhZnRlciB0aGUgCi0gICAgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZC4gIFRoZSBuUGFyYW1JbmRleCBjYWxsIHBhcmFtZXRlciBpcyB1c2VkIHRvIAotICAgIGluZGljYXRlIHdoaWNoIHN0cnVjdHVyZSBpcyBiZWluZyByZXF1ZXN0ZWQgZnJvbSB0aGUgY29tcG9uZW50LiAgVGhlIAotICAgIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgCi0gICAgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gYmVmb3JlIGludm9raW5nIHRoaXMgbWFjcm8uICAKLSAgICBJZiB0aGUgY29tcG9uZW50IGhhcyBub3QgaGFkIHRoaXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgc2VudCBiZWZvcmUsIAotICAgIHRoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGEgc2V0IG9mIHZhbGlkIERFRkFVTFQgdmFsdWVzIGZvciB0aGUgCi0gICAgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuSW5kZXgKLSAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICBUaGlzIHZhbHVlIGlzIGZyb20gdGhlCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24uCi0gICAgQHBhcmFtIFtpbixvdXRdIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUKLSAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBieSB0aGUgCi0gICAgICAgIGNvbXBvbmVudC4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wCi0qLyAgICAgICAgCi0jZGVmaW5lIE9NWF9HZXRDb25maWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRDb25maWcoICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9TZXRDb25maWcgbWFjcm8gd2lsbCBzZW5kIG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbiAKLSAgICBzdHJ1Y3R1cmVzIHRvIGEgY29tcG9uZW50LiAgRWFjaCBzdHJ1Y3R1cmUgc2hhbGwgYmUgc2VudCBvbmUgYXQgYSB0aW1lLAotICAgIGVhY2ggaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIG9mIHRoZSBtYWNyby4gIFRoaXMgbWFjcm8gY2FuIGJlIGludm9rZWQgCi0gICAgYW55dGltZSBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZC4gIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCAKLSAgICBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSBzaXplIAotICAgIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIChhcyB3ZWxsIGFzIHRoZSBhY3R1YWwgZGF0YSkgYmVmb3JlIGludm9raW5nIAotICAgIHRoaXMgbWFjcm8uICBUaGUgYXBwbGljYXRpb24gaXMgZnJlZSB0byBkaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlIGFmdGVyIAotICAgIHRoZSBjYWxsIGFzIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQgdG8gY29weSBhbnkgZGF0YSBpdCBzaGFsbCByZXRhaW4uICAKLSAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbaW5dIG5Db25maWdJbmRleAotICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIHNlbnQuICBUaGlzIHZhbHVlIGlzIGZyb20gdGhlCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24gYWJvdmUuCi0gICAgQHBhcmFtIFtpbl0gcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZQotICAgICAgICBwb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCBmb3IKLSAgICAgICAgaW5pdGlhbGl6YXRpb24gYnkgdGhlIGNvbXBvbmVudC4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wCi0gKi8KLSNkZWZpbmUgT01YX1NldENvbmZpZyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlNldENvbmZpZyggICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX0dldEV4dGVuc2lvbkluZGV4IG1hY3JvIHdpbGwgaW52b2tlIGEgY29tcG9uZW50IHRvIHRyYW5zbGF0ZSAKLSAgICBhIHZlbmRvciBzcGVjaWZpYyBjb25maWd1cmF0aW9uIG9yIHBhcmFtZXRlciBzdHJpbmcgaW50byBhbiBPTVggCi0gICAgc3RydWN0dXJlIGluZGV4LiAgVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgZm9yIHRoZSB2ZW5kb3IgdG8gc3VwcG9ydCAKLSAgICB0aGlzIGNvbW1hbmQgZm9yIHRoZSBpbmRleGVzIGFscmVhZHkgZm91bmQgaW4gdGhlIE9NWF9JTkRFWFRZUEUgCi0gICAgZW51bWVyYXRpb24gKHRoaXMgaXMgZG9uZSB0byBzYXZlIHNwYWNlIGluIHNtYWxsIGNvbXBvbmVudHMpLiAgVGhlIAotICAgIGNvbXBvbmVudCBzaGFsbCBzdXBwb3J0IGFsbCB2ZW5kb3Igc3VwcGxpZWQgZXh0ZW5zaW9uIGluZGV4ZXMgbm90IGZvdW5kCi0gICAgaW4gdGhlIG1hc3RlciBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbaW5dIGNQYXJhbWV0ZXJOYW1lCi0gICAgICAgIE9NWF9TVFJJTkcgdGhhdCBzaGFsbCBiZSBsZXNzIHRoYW4gMTI4IGNoYXJhY3RlcnMgbG9uZyBpbmNsdWRpbmcKLSAgICAgICAgdGhlIHRyYWlsaW5nIG51bGwgYnl0ZS4gIFRoaXMgaXMgdGhlIHN0cmluZyB0aGF0IHdpbGwgZ2V0IAotICAgICAgICB0cmFuc2xhdGVkIGJ5IHRoZSBjb21wb25lbnQgaW50byBhIGNvbmZpZ3VyYXRpb24gaW5kZXguCi0gICAgQHBhcmFtIFtvdXRdIHBJbmRleFR5cGUKLSAgICAgICAgYSBwb2ludGVyIHRvIGEgT01YX0lOREVYVFlQRSB0byByZWNlaXZlIHRoZSBpbmRleCB2YWx1ZS4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wCi0gKi8KLSNkZWZpbmUgT01YX0dldEV4dGVuc2lvbkluZGV4KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY1BhcmFtZXRlck5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEluZGV4VHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0RXh0ZW5zaW9uSW5kZXgoICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY1BhcmFtZXRlck5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEluZGV4VHlwZSkgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9HZXRTdGF0ZSBtYWNybyB3aWxsIGludm9rZSB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgY3VycmVudCAKLSAgICBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IGFuZCBwbGFjZSB0aGUgc3RhdGUgdmFsdWUgaW50byB0aGUgbG9jYXRpb24KLSAgICBwb2ludGVkIHRvIGJ5IHBTdGF0ZS4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbb3V0XSBwU3RhdGUKLSAgICAgICAgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gdG8gcmVjZWl2ZSB0aGUgc3RhdGUuICBUaGUgdmFsdWUgcmV0dXJuZWQKLSAgICAgICAgaXMgb25lIG9mIHRoZSBPTVhfU1RBVEVUWVBFIG1lbWJlcnMgCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9HZXRTdGF0ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBTdGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldFN0YXRlKCAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBTdGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfVXNlQnVmZmVyIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgdXNlCi0gICAgYSBidWZmZXIgKGFuZCBhbGxvY2F0ZSBpdHMgb3duIGJ1ZmZlciBoZWFkZXIpIGFscmVhZHkgYWxsb2NhdGVkIAotICAgIGJ5IGFub3RoZXIgY29tcG9uZW50LCBvciBieSB0aGUgSUwgQ2xpZW50LiBUaGlzIGlzIGEgYmxvY2tpbmcgCi0gICAgY2FsbC4KLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtvdXRdIHBwQnVmZmVyCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIHVzZWQgdG8gcmVjZWl2ZSB0aGUgCi0gICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBoZWFkZXIKLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wIGJ1ZgotICovCi0KLSNkZWZpbmUgT01YX1VzZUJ1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblNpemVCeXRlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+VXNlQnVmZmVyKCAgICAgICAgICAgIFwKLSAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblNpemVCeXRlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEJ1ZmZlcikKLQotCi0vKiogVGhlIE9NWF9BbGxvY2F0ZUJ1ZmZlciBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IGFsbG9jYXRlIAotICAgIGEgbmV3IGJ1ZmZlciBhbmQgYnVmZmVyIGhlYWRlci4gIFRoZSBjb21wb25lbnQgd2lsbCBhbGxvY2F0ZSB0aGUgCi0gICAgYnVmZmVyIGFuZCB0aGUgYnVmZmVyIGhlYWRlciBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIAotICAgIGhlYWRlci4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgCi0gICAgICAgIHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyCi0gICAgQHBhcmFtIFtpbl0gblBvcnRJbmRleAotICAgICAgICBuUG9ydEluZGV4IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBwb3J0IG9uIHRoZSBjb21wb25lbnQgdGhlIGJ1ZmZlciB3aWxsCi0gICAgICAgIGJlIHVzZWQgd2l0aC4gIFRoZSBwb3J0IGNhbiBiZSBmb3VuZCBieSB1c2luZyB0aGUgblBvcnRJbmRleAotICAgICAgICB2YWx1ZSBhcyBhbiBpbmRleCBpbnRvIHRoZSBQb3J0IERlZmluaXRpb24gYXJyYXkgb2YgdGhlIGNvbXBvbmVudC4KLSAgICBAcGFyYW0gW2luXSBwQXBwUHJpdmF0ZQotICAgICAgICBwQXBwUHJpdmF0ZSBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHBBcHBQcml2YXRlIG1lbWJlciBvZiB0aGUgCi0gICAgICAgIGJ1ZmZlciBoZWFkZXIgc3RydWN0dXJlLgotICAgIEBwYXJhbSBbaW5dIG5TaXplQnl0ZXMKLSAgICAgICAgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlLiAgVXNlZCB3aGVuIGJBbGxvY2F0ZU5ldyBpcyB0cnVlLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8gICAgCi0jZGVmaW5lIE9NWF9BbGxvY2F0ZUJ1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBwQnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5TaXplQnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkFsbG9jYXRlQnVmZmVyKCAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBwQnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5TaXplQnl0ZXMpICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfRnJlZUJ1ZmZlciBtYWNybyB3aWxsIHJlbGVhc2UgYSBidWZmZXIgaGVhZGVyIGZyb20gdGhlIGNvbXBvbmVudAotICAgIHdoaWNoIHdhcyBhbGxvY2F0ZWQgdXNpbmcgZWl0aGVyIE9NWF9BbGxvY2F0ZUJ1ZmZlciBvciBPTVhfVXNlQnVmZmVyLiBJZiAgCi0gICAgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZWQgdGhlIGJ1ZmZlciAoc2VlIHRoZSBPTVhfVXNlQnVmZmVyIG1hY3JvKSB0aGVuIAotICAgIHRoZSBjb21wb25lbnQgc2hhbGwgZnJlZSB0aGUgYnVmZmVyIGFuZCBidWZmZXIgaGVhZGVyLiBUaGlzIGlzIGEgCi0gICAgYmxvY2tpbmcgY2FsbC4gCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKLSAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAotICAgICAgICBiZSB1c2VkIHdpdGguCi0gICAgQHBhcmFtIFtpbl0gcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKLSAgICAgICAgb3IgQWxsb2NhdGVCdWZmZXIuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcCBidWYKLSAqLwotI2RlZmluZSBPTVhfRnJlZUJ1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5GcmVlQnVmZmVyKCAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX0VtcHR5VGhpc0J1ZmZlciBtYWNybyB3aWxsIHNlbmQgYSBidWZmZXIgZnVsbCBvZiBkYXRhIHRvIGFuIAotICAgIGlucHV0IHBvcnQgb2YgYSBjb21wb25lbnQuICBUaGUgYnVmZmVyIHdpbGwgYmUgZW1wdGllZCBieSB0aGUgY29tcG9uZW50Ci0gICAgYW5kIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgdGhlIEVtcHR5QnVmZmVyRG9uZSBjYWxsIGJhY2suCi0gICAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsIGluIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCB0aGUgYnVmZmVyCi0gICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBlbXB0eSB0aGUgYnVmZmVyLCBsYXRlciwgYXQgdGhlIHByb3BlciAKLSAgICB0aW1lLiAgQXMgZXhwZWN0ZWQsIHRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgb25seSB3aGlsZSB0aGUgY29tcG9uZW50IAotICAgIGlzIGluIHRoZSBPTVhfU3RhdGVFeGVjdXRpbmcuICBJZiBuUG9ydEluZGV4IGRvZXMgbm90IHNwZWNpZnkgYW4gaW5wdXQKLSAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0VtcHR5VGhpc0J1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RW1wdHlUaGlzQnVmZmVyKCAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9GaWxsVGhpc0J1ZmZlciBtYWNybyB3aWxsIHNlbmQgYW4gZW1wdHkgYnVmZmVyIHRvIGFuIAotICAgIG91dHB1dCBwb3J0IG9mIGEgY29tcG9uZW50LiAgVGhlIGJ1ZmZlciB3aWxsIGJlIGZpbGxlZCBieSB0aGUgY29tcG9uZW50Ci0gICAgYW5kIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgdGhlIEZpbGxCdWZmZXJEb25lIGNhbGwgYmFjay4KLSAgICBUaGlzIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwgaW4gdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgcmVjb3JkIHRoZSBidWZmZXIKLSAgICBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IGFuZCB0aGVuIGZpbGwgdGhlIGJ1ZmZlciwgbGF0ZXIsIGF0IHRoZSBwcm9wZXIgCi0gICAgdGltZS4gIEFzIGV4cGVjdGVkLCB0aGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIG9ubHkgd2hpbGUgdGhlIGNvbXBvbmVudCAKLSAgICBpcyBpbiB0aGUgT01YX0V4ZWN1dGluZ1N0YXRlLiAgSWYgblBvcnRJbmRleCBkb2VzIG5vdCBzcGVjaWZ5IGFuIG91dHB1dAotICAgIHBvcnQsIHRoZSBjb21wb25lbnQgc2hhbGwgcmV0dXJuIGFuIGVycm9yLiAgCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtpbl0gcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKLSAgICAgICAgb3IgQWxsb2NhdGVCdWZmZXIuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcCBidWYKLSAqLwotI2RlZmluZSBPTVhfRmlsbFRoaXNCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5GaWxsVGhpc0J1ZmZlciggICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLQotLyoqIFRoZSBPTVhfVXNlRUdMSW1hZ2UgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCB1c2UKLSAgICBhIEVHTEltYWdlIHByb3ZpZGVkIGJ5IEVHTCAoYW5kIGFsbG9jYXRlIGl0cyBvd24gYnVmZmVyIGhlYWRlcikKLSAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtvdXRdIHBwQnVmZmVyCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIHVzZWQgdG8gcmVjZWl2ZSB0aGUgCi0gICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBoZWFkZXIuICBOb3RlIHRoYXQgdGhlIG1lbW9yeSBsb2NhdGlvbiB1c2VkCi0gICAgICAgIGZvciB0aGlzIGJ1ZmZlciBpcyBOT1QgdmlzaWJsZSB0byB0aGUgSUwgQ2xpZW50LgotICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKLSAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAotICAgICAgICBiZSB1c2VkIHdpdGguICBUaGUgcG9ydCBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIG5Qb3J0SW5kZXgKLSAgICAgICAgdmFsdWUgYXMgYW4gaW5kZXggaW50byB0aGUgUG9ydCBEZWZpbml0aW9uIGFycmF5IG9mIHRoZSBjb21wb25lbnQuCi0gICAgQHBhcmFtIFtpbl0gcEFwcFByaXZhdGUKLSAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlIAotICAgICAgICBidWZmZXIgaGVhZGVyIHN0cnVjdHVyZS4KLSAgICBAcGFyYW0gW2luXSBlZ2xJbWFnZQotICAgICAgICBlZ2xJbWFnZSBjb250YWlucyB0aGUgaGFuZGxlIG9mIHRoZSBFR0xJbWFnZSB0byB1c2UgYXMgYSBidWZmZXIgb24gdGhlCi0gICAgICAgIHNwZWNpZmllZCBwb3J0LiAgVGhlIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byB2YWxpZGF0ZSBwcm9wZXJ0aWVzIG9mIAotICAgICAgICB0aGUgRUdMSW1hZ2UgYWdhaW5zdCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcG9ydCB0byBlbnN1cmUgdGhlIGNvbXBvbmVudAotICAgICAgICBjYW4gdXNlIHRoZSBFR0xJbWFnZSBhcyBhIGJ1ZmZlci4gICAgICAgICAgCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcCBidWYKLSAqLwotI2RlZmluZSBPTVhfVXNlRUdMSW1hZ2UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBwcEJ1ZmZlckhkciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBlZ2xJbWFnZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5Vc2VFR0xJbWFnZSggICAgICAgICAgXAotICAgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBwcEJ1ZmZlckhkciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBlZ2xJbWFnZSkKLQotLyoqIFRoZSBPTVhfSW5pdCBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBPTVggY29yZS4gIEl0IHNoYWxsIGJlIHRoZQotICAgIGZpcnN0IGNhbGwgbWFkZSBpbnRvIE9NWCBhbmQgaXQgc2hvdWxkIG9ubHkgYmUgZXhlY3V0ZWQgb25lIHRpbWUgd2l0aG91dAotICAgIGFuIGludGVydmllbmluZyBPTVhfRGVpbml0IGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9Jbml0KHZvaWQpOwotCi0KLS8qKiBUaGUgT01YX0RlaW5pdCBtZXRob2QgaXMgdXNlZCB0byBkZWluaXRpYWxpemUgdGhlIE9NWCBjb3JlLiAgSXQgc2hhbGwgYmUgCi0gICAgdGhlIGxhc3QgY2FsbCBtYWRlIGludG8gT01YLiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29yZSBkZXRlcm1pbmVzIHRoYXQgCi0gICAgdGhhcmUgYXJlIGNvbXBvbmVudHMgbG9hZGVkIHdoZW4gdGhpcyBjYWxsIGlzIG1hZGUsIHRoZSBjb3JlIG1heSByZXR1cm4gCi0gICAgd2l0aCBhbiBlcnJvciByYXRoZXIgdGhhbiB0cnkgdG8gdW5sb2FkIHRoZSBjb21wb25lbnRzLgotICAgICAgICAKLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfRGVpbml0KHZvaWQpOwotCi0KLS8qKiBUaGUgT01YX0NvbXBvbmVudE5hbWVFbnVtIG1ldGhvZCB3aWxsIGVudW1lcmF0ZSB0aHJvdWdoIGFsbCB0aGUgbmFtZXMgb2YKLSAgICByZWNvZ25pc2VkIHZhbGlkIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbS4gVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZAotICAgIGFzIGEgbWVhbnMgdG8gZGV0ZWN0IGFsbCB0aGUgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtIHJ1bi10aW1lLiBUaGVyZSBpcwotICAgIG5vIHN0cmljdCBvcmRlcmluZyB0byB0aGUgZW51bWVyYXRpb24gb3JkZXIgb2YgY29tcG9uZW50IG5hbWVzLCBhbHRob3VnaAotICAgIGVhY2ggbmFtZSB3aWxsIG9ubHkgYmUgZW51bWVyYXRlZCBvbmNlLiAgSWYgdGhlIE9NWCBjb3JlIHN1cHBvcnRzIHJ1bi10aW1lCi0gICAgaW5zdGFsbGF0aW9uIG9mIG5ldyBjb21wb25lbnRzLCBpdCBpcyBvbmx5IHJlcXVyaWVkIHRvIGRldGVjdCBuZXdseQotICAgIGluc3RhbGxlZCBjb21wb25lbnRzIHdoZW4gdGhlIGZpcnN0IGNhbGwgdG8gZW51bWVyYXRlIGNvbXBvbmVudCBuYW1lcwotICAgIGlzIG1hZGUgKGkuZS4gd2hlbiBuSW5kZXggaXMgMHgwKS4KLSAgICAKLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtvdXRdIGNDb21wb25lbnROYW1lCi0gICAgICAgIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiAgVGhlCi0gICAgICAgIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzIGFyZSBzdHJpbmdzIGxlc3MgdGhhbiAxMjcgYnl0ZXMgaW4gbGVuZ3RoCi0gICAgICAgIHBsdXMgdGhlIHRyYWlsaW5nIG51bGwgZm9yIGEgbWF4aW11bSBzaXplIG9mIDEyOCBieXRlcy4gIEFuIGV4YW1wbGUgCi0gICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUgCi0gICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlIAotICAgICAgICB0aGUgVmVuZG9yIGRlc2lnbmF0aW9uIG5leHQuCi0gICAgQHBhcmFtIFtpbl0gbk5hbWVMZW5ndGgKLSAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNDb21wb25lbnROYW1lIHN0cmluZy4gIFdpdGggYWxsIAotICAgICAgICBjb21wb25lbnQgbmFtZSBzdHJpbmdzIHJlc3RyaWN0ZWQgdG8gbGVzcyB0aGFuIDEyOCBjaGFyYWN0ZXJzIAotICAgICAgICAoaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsKSBpdCBpcyByZWNvbWVuZGVkIHRoYXQgdGhlIGNhbGxlcgotICAgICAgICBwcm92aWRlIGEgaW5wdXQgc3RyaW5nIGZvciB0aGUgY0NvbXBvbmVudE5hbWUgb2YgMTI4IGNoYXJhY3RlcnMuCi0gICAgQHBhcmFtIFtpbl0gbkluZGV4Ci0gICAgICAgIG51bWJlciBjb250YWluaW5nIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGNvbXBvbmVudC4gCi0gICAgICAgIE11bHRpcGxlIGNhbGxzIHRvIE9NWF9Db21wb25lbnROYW1lRW51bSB3aXRoIGluY3JlYXNpbmcgdmFsdWVzCi0gICAgICAgIG9mIG5JbmRleCB3aWxsIGVudW1lcmF0ZSB0aHJvdWdoIHRoZSBjb21wb25lbnQgbmFtZXMgaW4gdGhlCi0gICAgICAgIHN5c3RlbSB1bnRpbCBPTVhfRXJyb3JOb01vcmUgaXMgcmV0dXJuZWQuICBUaGUgdmFsdWUgb2YgbkluZGV4Ci0gICAgICAgIGlzIDAgdG8gKE4tMSksIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiB2YWxpZCBpbnN0YWxsZWQgY29tcG9uZW50cwotICAgICAgICBpbiB0aGUgc3lzdGVtLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBXaGVuIHRoZSB2YWx1ZSBvZiBuSW5kZXggZXhjZWVkcyB0aGUgbnVtYmVyIG9mIAotICAgICAgICBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0gbWludXMgMSwgT01YX0Vycm9yTm9Nb3JlIHdpbGwgYmUKLSAgICAgICAgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9Db21wb25lbnROYW1lRW51bSgKLSAgICBPTVhfT1VUIE9NWF9TVFJJTkcgY0NvbXBvbmVudE5hbWUsCi0gICAgT01YX0lOICBPTVhfVTMyIG5OYW1lTGVuZ3RoLAotICAgIE9NWF9JTiAgT01YX1UzMiBuSW5kZXgpOwotCi0KLS8qKiBUaGUgT01YX0dldEhhbmRsZSBtZXRob2Qgd2lsbCBsb2NhdGUgdGhlIGNvbXBvbmVudCBzcGVjaWZpZWQgYnkgdGhlCi0gICAgY29tcG9uZW50IG5hbWUgZ2l2ZW4sIGxvYWQgdGhhdCBjb21wb25lbnQgaW50byBtZW1vcnkgYW5kIHRoZW4gaW52b2tlCi0gICAgdGhlIGNvbXBvbmVudCdzIG1ldGhvZHMgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQuICAKLSAgICAKLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbb3V0XSBwSGFuZGxlCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0hBTkRMRVRZUEUgcG9pbnRlciB0byBiZSBmaWxsZWQgaW4gYnkgdGhpcyBtZXRob2QuCi0gICAgQHBhcmFtIFtpbl0gY0NvbXBvbmVudE5hbWUKLSAgICAgICAgcG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IG5hbWUuICBUaGUKLSAgICAgICAgbmFtZXMgb2YgdGhlIGNvbXBvbmVudHMgYXJlIHN0cmluZ3MgbGVzcyB0aGFuIDEyNyBieXRlcyBpbiBsZW5ndGgKLSAgICAgICAgcGx1cyB0aGUgdHJhaWxpbmcgbnVsbCBmb3IgYSBtYXhpbXVtIHNpemUgb2YgMTI4IGJ5dGVzLiAgQW4gZXhhbXBsZSAKLSAgICAgICAgb2YgYSB2YWxpZCBjb21wb25lbnQgbmFtZSBpcyAiT01YLlRJLkFVRElPLkRTUC5NSVhFUlwwIi4gIE5hbWVzIGFyZSAKLSAgICAgICAgYXNzaWduZWQgYnkgdGhlIHZlbmRvciwgYnV0IHNoYWxsIHN0YXJ0IHdpdGggIk9NWC4iIGFuZCB0aGVuIGhhdmUgCi0gICAgICAgIHRoZSBWZW5kb3IgZGVzaWduYXRpb24gbmV4dC4KLSAgICBAcGFyYW0gW2luXSBwQXBwRGF0YQotICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3aWxsIGJlIHJldHVybmVkCi0gICAgICAgIGR1cmluZyBjYWxsYmFja3Mgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIGlkZW50aWZ5IHRoZSBzb3VyY2UKLSAgICAgICAgb2YgdGhlIGNhbGxiYWNrLgotICAgIEBwYXJhbSBbaW5dIHBDYWxsQmFja3MKLSAgICAgICAgcG9pbnRlciB0byBhIE9NWF9DQUxMQkFDS1RZUEUgc3RydWN0dXJlIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCi0gICAgICAgIGNvbXBvbmVudCB0byBpbml0aWFsaXplIGl0IHdpdGguICAKLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb3JlCi0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0dldEhhbmRsZSgKLSAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFKiBwSGFuZGxlLCAKLSAgICBPTVhfSU4gIE9NWF9TVFJJTkcgY0NvbXBvbmVudE5hbWUsCi0gICAgT01YX0lOICBPTVhfUFRSIHBBcHBEYXRhLAotICAgIE9NWF9JTiAgT01YX0NBTExCQUNLVFlQRSogcENhbGxCYWNrcyk7Ci0KLQotLyoqIFRoZSBPTVhfRnJlZUhhbmRsZSBtZXRob2Qgd2lsbCBmcmVlIGEgaGFuZGxlIGFsbG9jYXRlZCBieSB0aGUgT01YX0dldEhhbmRsZSAKLSAgICBtZXRob2QuICBJZiB0aGUgY29tcG9uZW50IHJlZmVyZW5jZSBjb3VudCBnb2VzIHRvIHplcm8sIHRoZSBjb21wb25lbnQgd2lsbAotICAgIGJlIHVubG9hZGVkIGZyb20gbWVtb3J5LiAgCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYyB3aGVuIHRoZSBjb21wb25lbnQgaXMgCi0gICAgaW4gdGhlIE9NWF9TdGF0ZUxvYWRlZCBzdGF0ZS4KLQotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9GcmVlSGFuZGxlKAotICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7Ci0KLQotCi0vKiogVGhlIE9NWF9TZXR1cFR1bm5lbCBtZXRob2Qgd2lsbCBoYW5kbGUgdGhlIG5lY2Vzc2FyeSBjYWxscyB0byB0aGUgY29tcG9uZW50cwotICAgIHRvIHNldHVwIHRoZSBzcGVjaWZpZWQgdHVubmVsIHRoZSB0d28gY29tcG9uZW50cy4gIE5PVEU6IFRoaXMgaXMKLSAgICBhbiBhY3R1YWwgbWV0aG9kIChub3QgYSAjZGVmaW5lIG1hY3JvKS4gIFRoaXMgbWV0aG9kIHdpbGwgbWFrZSBjYWxscyBpbnRvCi0gICAgdGhlIGNvbXBvbmVudCBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHR1bm5lbCAKLSAgICBjb25uZWN0aW9uLiAgCi0KLSAgICBUaGUgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2Qgb24gYm90aCBjb21wb25lbnRzIHdpbGwgYmUgY2FsbGVkLiAKLSAgICBUaGlzIG1ldGhvZCBzaGFsbCBub3QgYmUgY2FsbGVkIHVubGVzcyB0aGUgY29tcG9uZW50IGlzIGluIHRoZSAKLSAgICBPTVhfU3RhdGVMb2FkZWQgc3RhdGUgZXhjZXB0IHdoZW4gdGhlIHBvcnRzIHVzZWQgZm9yIHRoZSB0dW5uZWwgYXJlCi0gICAgZGlzYWJsZWQuIEluIHRoaXMgY2FzZSwgdGhlIGNvbXBvbmVudCBtYXkgYmUgaW4gdGhlIE9NWF9TdGF0ZUV4ZWN1dGluZywKLSAgICBPTVhfU3RhdGVQYXVzZSwgb3IgT01YX1N0YXRlSWRsZSBzdGF0ZXMuIAotCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoT3V0cHV0Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgQWxzbyB0aGlzIGlzIHRoZSBoYW5kbGUKLSAgICAgICAgb2YgdGhlIGNvbXBvbmVudCB3aG9zZSBwb3J0LCBzcGVjaWZpZWQgaW4gdGhlIG5Qb3J0T3V0cHV0IHBhcmFtZXRlcgotICAgICAgICB3aWxsIGJlIHVzZWQgdGhlIHNvdXJjZSBmb3IgdGhlIHR1bm5lbC4gVGhpcyBpcyB0aGUgY29tcG9uZW50IGhhbmRsZQotICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEgCi0gICAgICAgIHJlcXVpcmVtZW50IHRoYXQgaE91dHB1dCBiZSB0aGUgc291cmNlIGZvciB0aGUgZGF0YSB3aGVuCi0gICAgICAgIHR1bmVsbGluZyAoaS5lLiBuUG9ydE91dHB1dCBpcyBhbiBvdXRwdXQgcG9ydCkuICBJZiAweDAsIHRoZSBjb21wb25lbnQKLSAgICAgICAgc3BlY2lmaWVkIGluIGhJbnB1dCB3aWxsIGhhdmUgaXQncyBwb3J0IHNwZWNpZmllZCBpbiBuUG9ydElucHV0Ci0gICAgICAgIHNldHVwIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgY2xpZW50LgotICAgIEBwYXJhbSBbaW5dIG5Qb3J0T3V0cHV0Ci0gICAgICAgIG5Qb3J0T3V0cHV0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBzb3VyY2UgcG9ydCBvbiBjb21wb25lbnQgdG8gYmUKLSAgICAgICAgdXNlZCBpbiB0aGUgdHVubmVsLiAKLSAgICBAcGFyYW0gW2luXSBoSW5wdXQKLSAgICAgICAgVGhpcyBpcyB0aGUgY29tcG9uZW50IHRvIHNldHVwIHRoZSB0dW5uZWwgd2l0aC4gVGhpcyBpcyB0aGUgaGFuZGxlCi0gICAgICAgIG9mIHRoZSBjb21wb25lbnQgd2hvc2UgcG9ydCwgc3BlY2lmaWVkIGluIHRoZSBuUG9ydElucHV0IHBhcmFtZXRlcgotICAgICAgICB3aWxsIGJlIHVzZWQgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgdHVubmVsLiBUaGlzIGlzIHRoZSBjb21wb25lbnQgaGFuZGxlCi0gICAgICAgIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLiAgVGhlcmUgaXMgYSAKLSAgICAgICAgcmVxdWlyZW1lbnQgdGhhdCBoSW5wdXQgYmUgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgZGF0YSB3aGVuCi0gICAgICAgIHR1bmVsbGluZyAoaS5lLiBuUG9ydEludXQgaXMgYW4gaW5wdXQgcG9ydCkuICAgSWYgMHgwLCB0aGUgY29tcG9uZW50Ci0gICAgICAgIHNwZWNpZmllZCBpbiBoT3V0cHV0IHdpbGwgaGF2ZSBpdCdzIHBvcnQgc3BlY2lmaWVkIGluIG5Qb3J0UE91dHB1dAotICAgICAgICBzZXR1cCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIGNsaWVudC4KLSAgICBAcGFyYW0gW2luXSBuUG9ydElucHV0Ci0gICAgICAgIG5Qb3J0SW5wdXQgaXMgdXNlZCB0byBzZWxlY3QgdGhlIGRlc3RpbmF0aW9uIHBvcnQgb24gY29tcG9uZW50IHRvIGJlCi0gICAgICAgIHVzZWQgaW4gdGhlIHR1bm5lbC4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgICAgV2hlbiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCBpcyByZXR1cm5lZCwgb25lIG9yIGJvdGggY29tcG9uZW50cyBpcyAKLSAgICAgICAgYSBub24taW50ZXJvcCBjb21wb25lbnQgYW5kIGRvZXMgbm90IHN1cHBvcnQgdHVubmVsaW5nLgotICAgICAgICAKLSAgICAgICAgT24gZmFpbHVyZSwgdGhlIHBvcnRzIG9mIGJvdGggY29tcG9uZW50cyBhcmUgc2V0dXAgZm9yIGNvbW11bmljYXRpb24KLSAgICAgICAgd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBDbGllbnQuCi0gICAgQGluZ3JvdXAgY29yZSB0dW4KLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfU2V0dXBUdW5uZWwoCi0gICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoT3V0cHV0LAotICAgIE9NWF9JTiAgT01YX1UzMiBuUG9ydE91dHB1dCwKLSAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhJbnB1dCwKLSAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRJbnB1dCk7Ci0gICAgCi0vKiogQGluZ3JvdXAgY3AgKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSAgIE9NWF9HZXRDb250ZW50UGlwZSgKLSAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFICpoUGlwZSwKLSAgICBPTVhfSU4gT01YX1NUUklORyBzelVSSSk7Ci0KLS8qKiBUaGUgT01YX0dldENvbXBvbmVudHNPZlJvbGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuCi0gICAgcm9sZSBhbmQgKGlmIHRoZSBjb21wTmFtZXMgZmllbGQgaXMgbm9uLU5VTEwpIHRoZSBuYW1lcyBvZiB0aG9zZSBjb21wb25lbnRzLiBUaGUgY2FsbCB3aWxsIGZhaWwgaWYgCi0gICAgYW4gaW5zdWZmaWNpZW50bHkgc2l6ZWQgYXJyYXkgb2YgbmFtZXMgaXMgc3VwcGxpZWQuIFRvIGVuc3VyZSB0aGUgYXJyYXkgaXMgc3VmZmljaWVudGx5IHNpemVkIHRoZQotICAgIGNsaWVudCBzaG91bGQ6Ci0gICAgICAgICogZmlyc3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNvbXBOYW1lcyBmaWVsZCBOVUxMIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudCBuYW1lcwotICAgICAgICAqIHNlY29uZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgY29tcE5hbWVzIGZpZWxkIHBvaW50aW5nIHRvIGFuIGFycmF5IG9mIG5hbWVzIGFsbG9jYXRlZCAKLSAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUgZmlyc3QgY2FsbC4KLQotICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSByb2xlCi0gICAgICAgIFRoaXMgaXMgZ2VuZXJpYyBzdGFuZGFyZCBjb21wb25lbnQgbmFtZSBjb25zaXN0aW5nIG9ubHkgb2YgY29tcG9uZW50IGNsYXNzIAotICAgICAgICBuYW1lIGFuZCB0aGUgdHlwZSB3aXRoaW4gdGhhdCBjbGFzcyAoZS5nLiAnYXVkaW9fZGVjb2Rlci5hYWMnKS4KLSAgICBAcGFyYW0gW2lub3V0XSBwTnVtQ29tcHMKLSAgICAgICAgVGhpcyBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dC4gCi0gCi0gICAgICAgIElmIGNvbXBOYW1lcyBpcyBOVUxMLCB0aGUgaW5wdXQgaXMgaWdub3JlZCBhbmQgdGhlIG91dHB1dCBzcGVjaWZpZXMgaG93IG1hbnkgY29tcG9uZW50cyBzdXBwb3J0Ci0gICAgICAgIHRoZSBnaXZlbiByb2xlLgotICAgICAKLSAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQgCi0gICAgICAgIG9uIG91dHB1dCwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBzdHJpbmcgbmFtZXMgbGlzdGVkIHdpdGhpbiB0aGUgY29tcE5hbWVzIHBhcmFtZXRlci4KLSAgICBAcGFyYW0gW2lub3V0XSBjb21wTmFtZXMKLSAgICAgICAgSWYgTlVMTCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIElmIG5vbi1OVUxMIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIDEyOC1ieXRlIHN0cmluZ3Mgd2hpY2ggYWNjZXB0cyAKLSAgICAgICAgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgcGh5c2ljYWwgY29tcG9uZW50cyB0aGF0IGltcGxlbWVudCB0aGUgc3BlY2lmaWVkIHN0YW5kYXJkIGNvbXBvbmVudCBuYW1lLiAKLSAgICAgICAgRWFjaCBuYW1lIGlzIE5VTEwgdGVybWluYXRlZC4gbnVtQ29tcHMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbmFtZXMuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldENvbXBvbmVudHNPZlJvbGUgKCAKLQlPTVhfSU4gICAgICBPTVhfU1RSSU5HIHJvbGUsCi0gICAgT01YX0lOT1VUICAgT01YX1UzMiAqcE51bUNvbXBzLAotICAgIE9NWF9JTk9VVCAgIE9NWF9VOCAgKipjb21wTmFtZXMpOwotCi0vKiogVGhlIE9NWF9HZXRSb2xlc09mQ29tcG9uZW50IG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHJvbGVzIHN1cHBvcnRlZCBieSB0aGUgZ2l2ZW4KLSAgICBjb21wb25lbnQgYW5kIChpZiB0aGUgcm9sZXMgZmllbGQgaXMgbm9uLU5VTEwpIHRoZSBuYW1lcyBvZiB0aG9zZSByb2xlcy4gVGhlIGNhbGwgd2lsbCBmYWlsIGlmIAotICAgIGFuIGluc3VmZmljaWVudGx5IHNpemVkIGFycmF5IG9mIG5hbWVzIGlzIHN1cHBsaWVkLiBUbyBlbnN1cmUgdGhlIGFycmF5IGlzIHN1ZmZpY2llbnRseSBzaXplZCB0aGUKLSAgICBjbGllbnQgc2hvdWxkOgotICAgICAgICAqIGZpcnN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByb2xlcyBmaWVsZCBOVUxMIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHJvbGUgbmFtZXMKLSAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIHJvbGVzIGZpZWxkIHBvaW50aW5nIHRvIGFuIGFycmF5IG9mIG5hbWVzIGFsbG9jYXRlZCAKLSAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUgZmlyc3QgY2FsbC4KLQotICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLQotICAgIEBwYXJhbSBbaW5dIGNvbXBOYW1lCi0gICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBiZWluZyBxdWVyaWVkIGFib3V0LgotICAgIEBwYXJhbSBbaW5vdXRdIHBOdW1Sb2xlcwotICAgICAgICBUaGlzIGlzIHVzZWQgYm90aCBhcyBpbnB1dCBhbmQgb3V0cHV0LiAKLSAKLSAgICAgICAgSWYgcm9sZXMgaXMgTlVMTCwgdGhlIGlucHV0IGlzIGlnbm9yZWQgYW5kIHRoZSBvdXRwdXQgc3BlY2lmaWVzIGhvdyBtYW55IHJvbGVzIHRoZSBjb21wb25lbnQgc3VwcG9ydHMuCi0gICAgIAotICAgICAgICBJZiBjb21wTmFtZXMgaXMgbm90IE5VTEwsIG9uIGlucHV0IGl0IGJvdW5kcyB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RydWN0dXJlIGFuZCAKLSAgICAgICAgb24gb3V0cHV0LCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiByb2xlcyBzdHJpbmcgbmFtZXMgbGlzdGVkIHdpdGhpbiB0aGUgcm9sZXMgcGFyYW1ldGVyLgotICAgIEBwYXJhbSBbb3V0XSByb2xlcwotICAgICAgICBJZiBOVUxMIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gSWYgbm9uLU5VTEwgdGhpcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgMTI4LWJ5dGUgc3RyaW5ncyAKLSAgICAgICAgd2hpY2ggYWNjZXB0cyBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGFsbCBzdGFuZGFyZCBjb21wb25lbnRzIHJvbGVzIGltcGxlbWVudGVkIG9uIHRoZSAKLSAgICAgICAgc3BlY2lmaWVkIGNvbXBvbmVudCBuYW1lLiBudW1Db21wcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBuYW1lcy4KLSAgICBAaW5ncm91cCBjb3JlCi0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfR2V0Um9sZXNPZkNvbXBvbmVudCAoIAotCU9NWF9JTiAgICAgIE9NWF9TVFJJTkcgY29tcE5hbWUsIAotICAgIE9NWF9JTk9VVCAgIE9NWF9VMzIgKnBOdW1Sb2xlcywKLSAgICBPTVhfT1VUICAgICBPTVhfVTggKipyb2xlcyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmI0ZGVkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDk0NyArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotLyoqCi0gKiBAZmlsZSBPTVhfSVZDb21tb24uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBWaWRlbyBhbmQgSW1hZ2UgY29tcG9uZW50cyB0byBleGNoYW5nZQotICogIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbnRzLgotICovCi0jaWZuZGVmIE9NWF9JVkNvbW1vbl9oCi0jZGVmaW5lIE9NWF9JVkNvbW1vbl9oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyoqCi0gKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlIGhlYWRlcgotICogdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgaGVhZGVyCi0gKiBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5Ci0gKi8KLQotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0KLS8qKiBAZGVmZ3JvdXAgaXYgT3Blbk1BWCBJTCBJbWFnaW5nIGFuZCBWaWRlbyBEb21haW4KLSAqIENvbW1vbiBzdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIEltYWdpbmcgYW5kIFZpZGVvIGRvbWFpbnMKLSAqIEB7Ci0gKi8KLQotCi0vKioKLSAqIEVudW1lcmF0aW9uIGRlZmluaW5nIHBvc3NpYmxlIHVuY29tcHJlc3NlZCBpbWFnZS92aWRlbyBmb3JtYXRzLgotICoKLSAqIEVOVU1TOgotICogIFVudXNlZCAgICAgICAgICAgICAgICAgOiBQbGFjZWhvbGRlciB2YWx1ZSB3aGVuIGZvcm1hdCBpcyBOL0EKLSAqICBNb25vY2hyb21lICAgICAgICAgICAgIDogYmxhY2sgYW5kIHdoaXRlCi0gKiAgOGJpdFJHQjMzMiAgICAgICAgICAgICA6IFJlZCA3OjUsIEdyZWVuIDQ6MiwgQmx1ZSAxOjAKLSAqICAxMmJpdFJHQjQ0NCAgICAgICAgICAgIDogUmVkIDExOjgsIEdyZWVuIDc6NCwgQmx1ZSAzOjAKLSAqICAxNmJpdEFSR0I0NDQ0ICAgICAgICAgIDogQWxwaGEgMTU6MTIsIFJlZCAxMTo4LCBHcmVlbiA3OjQsIEJsdWUgMzowCi0gKiAgMTZiaXRBUkdCMTU1NSAgICAgICAgICA6IEFscGhhIDE1LCBSZWQgMTQ6MTAsIEdyZWVuIDk6NSwgQmx1ZSA0OjAKLSAqICAxNmJpdFJHQjU2NSAgICAgICAgICAgIDogUmVkIDE1OjExLCBHcmVlbiAxMDo1LCBCbHVlIDQ6MAotICogIDE2Yml0QkdSNTY1ICAgICAgICAgICAgOiBCbHVlIDE1OjExLCBHcmVlbiAxMDo1LCBSZWQgNDowCi0gKiAgMThiaXRSR0I2NjYgICAgICAgICAgICA6IFJlZCAxNzoxMiwgR3JlZW4gMTE6NiwgQmx1ZSA1OjAKLSAqICAxOGJpdEFSR0IxNjY1ICAgICAgICAgIDogQWxwaGEgMTcsIFJlZCAxNjoxMSwgR3JlZW4gMTA6NSwgQmx1ZSA0OjAKLSAqICAxOWJpdEFSR0IxNjY2ICAgICAgICAgIDogQWxwaGEgMTgsIFJlZCAxNzoxMiwgR3JlZW4gMTE6NiwgQmx1ZSA1OjAKLSAqICAyNGJpdFJHQjg4OCAgICAgICAgICAgIDogUmVkIDI0OjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAotICogIDI0Yml0QkdSODg4ICAgICAgICAgICAgOiBCbHVlIDI0OjE2LCBHcmVlbiAxNTo4LCBSZWQgNzowCi0gKiAgMjRiaXRBUkdCMTg4NyAgICAgICAgICA6IEFscGhhIDIzLCBSZWQgMjI6MTUsIEdyZWVuIDE0OjcsIEJsdWUgNjowCi0gKiAgMjViaXRBUkdCMTg4OCAgICAgICAgICA6IEFscGhhIDI0LCBSZWQgMjM6MTYsIEdyZWVuIDE1OjgsIEJsdWUgNzowCi0gKiAgMzJiaXRCR1JBODg4OCAgICAgICAgICA6IEJsdWUgMzE6MjQsIEdyZWVuIDIzOjE2LCBSZWQgMTU6OCwgQWxwaGEgNzowCi0gKiAgMzJiaXRBUkdCODg4OCAgICAgICAgICA6IEFscGhhIDMxOjI0LCBSZWQgMjM6MTYsIEdyZWVuIDE1OjgsIEJsdWUgNzowCi0gKiAgWVVWNDExUGxhbmFyICAgICAgICAgICA6IFUsWSBhcmUgc3Vic2FtcGxlZCBieSBhIGZhY3RvciBvZiA0IGhvcml6b250YWxseQotICogIFlVVjQxMVBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcwotICogIFlVVjQyMFBsYW5hciAgICAgICAgICAgOiBUaHJlZSBhcnJheXMgWSxVLFYuCi0gKiAgWVVWNDIwUGFja2VkUGxhbmFyICAgICA6IHBhY2tlZCBwZXIgcGF5bG9hZCBpbiBwbGFuYXIgc2xpY2VzCi0gKiAgWVVWNDIwU2VtaVBsYW5hciAgICAgICA6IFR3byBhcnJheXMsIG9uZSBpcyBhbGwgWSwgdGhlIG90aGVyIGlzIFUgYW5kIFYKLSAqICBZVVY0MjJQbGFuYXIgICAgICAgICAgIDogVGhyZWUgYXJyYXlzIFksVSxWLgotICogIFlVVjQyMlBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcwotICogIFlVVjQyMlNlbWlQbGFuYXIgICAgICAgOiBUd28gYXJyYXlzLCBvbmUgaXMgYWxsIFksIHRoZSBvdGhlciBpcyBVIGFuZCBWCi0gKiAgWUNiWUNyICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBZVVlWIChpLmUuIFlDYllDcikKLSAqICBZQ3JZQ2IgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFlWWVUgKGkuZS4gWUNyWUNiKQotICogIENiWUNyWSAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgVVlWWSAoaS5lLiBDYllDclkpCi0gKiAgQ3JZQ2JZICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBWWVVZIChpLmUuIENyWUNiWSkKLSAqICBZVVY0NDRJbnRlcmxlYXZlZCAgICAgIDogRWFjaCBwaXhlbCBjb250YWlucyBlcXVhbCBwYXJ0cyBZVVYKLSAqICBSYXdCYXllcjhiaXQgICAgICAgICAgIDogU01JQSBjYW1lcmEgb3V0cHV0IGZvcm1hdAotICogIFJhd0JheWVyMTBiaXQgICAgICAgICAgOiBTTUlBIGNhbWVyYSBvdXRwdXQgZm9ybWF0Ci0gKiAgUmF3QmF5ZXI4Yml0Y29tcHJlc3NlZCA6IFNNSUEgY2FtZXJhIG91dHB1dCBmb3JtYXQKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHsKLSAgICBPTVhfQ09MT1JfRm9ybWF0VW51c2VkLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRNb25vY2hyb21lLAotICAgIE9NWF9DT0xPUl9Gb3JtYXQ4Yml0UkdCMzMyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRBUkdCNDQ0NCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRBUkdCMTU1NSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QkdSNTY1LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MThiaXRBUkdCMTY2NSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTliaXRBUkdCMTY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODgsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0QkdSODg4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdEFSR0IxODg3LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNWJpdEFSR0IxODg4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MTFQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQxMVBhY2tlZFBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZQ2JZQ3IsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlDcllDYiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRDcllDYlksCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NEludGVybGVhdmVkLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyMTBiaXQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdGNvbXByZXNzZWQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdEwyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMNCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TDgsCi0gICAgT01YX0NPTE9SX0Zvcm1hdEwxNiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TDI0LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMzIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE4Qml0QkdSNjY2LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFCR1I2NjY2LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQ09MT1JfRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICAvKio8UmVzZXJ2ZWQgYW5kcm9pZCBvcGFxdWUgY29sb3Jmb3JtYXQuIFRlbGxzIHRoZSBlbmNvZGVyIHRoYXQKLSAgICAgKiB0aGUgYWN0dWFsIGNvbG9yZm9ybWF0IHdpbGwgYmUgIHJlbGF5ZWQgYnkgdGhlCi0gICAgICogR3JhbGxvYyBCdWZmZXJzLgotICAgICAqIEZJWE1FOiBJbiB0aGUgcHJvY2VzcyBvZiByZXNlcnZpbmcgc29tZSBlbnVtIHZhbHVlcyBmb3IKLSAgICAgKiBBbmRyb2lkLXNwZWNpZmljIE9NWCBJTCBjb2xvcmZvcm1hdHMuIENoYW5nZSB0aGlzIGVudW0gdG8KLSAgICAgKiBhbiBhY2NlcHRhYmxlIHJhbmdlIG9uY2UgdGhhdCBpcyBkb25lLgotICAgICAqICovCi0gICAgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUgPSAweDdGMDAwNzg5LAotICAgIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyID0gMHg3RjAwMDEwMCwKLSAgICBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyID0gMHg3RkEzMEMwMCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQ09MT1JfRk9STUFUVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgdGhlIG1hdHJpeCBmb3IgY29udmVyc2lvbiBmcm9tIFJHQiB0byBZVVYgb3IgdmljZSB2ZXJzYS4KLSAqIGlDb2xvck1hdHJpeCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZml4ZWQgcG9pbnQgdmFsdWVzCi0gKiB1c2VkIGluIGNvbnZlcnRpbmcgYmV0d2VlbiBmb3JtYXRzLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvICovCi0gICAgT01YX1MzMiB4Q29sb3JNYXRyaXhbM11bM107IC8qKjwgU3RvcmVkIGluIHNpZ25lZCBRMTYgZm9ybWF0ICovCi0gICAgT01YX1MzMiB4Q29sb3JPZmZzZXRbNF07ICAgIC8qKjwgU3RvcmVkIGluIHNpZ25lZCBRMTYgZm9ybWF0ICovCi19T01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFOwotCi0KLS8qKgotICogU3RydWN0dXJlIGRlZmluaW5nIHBlcmNlbnQgdG8gc2NhbGUgZWFjaCBmcmFtZSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZToKLSAqIFRvIG1ha2UgdGhlIHdpZHRoIDUwJSBsYXJnZXIsIHVzZSBmV2lkdGggPSAxLjUgYW5kIHRvIG1ha2UgdGhlIHdpZHRoCi0gKiAxLzIgdGhlIG9yaWdpbmFsIHNpemUsIHVzZSBmV2lkdGggPSAwLjUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvICovCi0gICAgT01YX1MzMiB4V2lkdGg7ICAgICAgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KLSAgICBPTVhfUzMyIHhIZWlnaHQ7ICAgICAgICAgIC8qKjwgRml4ZWQgcG9pbnQgdmFsdWUgc3RvcmVkIGFzIFExNiAqLwotfU9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFOwotCi0KLS8qKgotICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgaW1hZ2UgZmlsdGVyIHR5cGVzCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfSU1BR0VGSUxURVJUWVBFIHsKLSAgICBPTVhfSW1hZ2VGaWx0ZXJOb25lLAotICAgIE9NWF9JbWFnZUZpbHRlck5vaXNlLAotICAgIE9NWF9JbWFnZUZpbHRlckVtYm9zcywKLSAgICBPTVhfSW1hZ2VGaWx0ZXJOZWdhdGl2ZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJTa2V0Y2gsCi0gICAgT01YX0ltYWdlRmlsdGVyT2lsUGFpbnQsCi0gICAgT01YX0ltYWdlRmlsdGVySGF0Y2gsCi0gICAgT01YX0ltYWdlRmlsdGVyR3BlbiwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJBbnRpYWxpYXMsCi0gICAgT01YX0ltYWdlRmlsdGVyRGVSaW5nLAotICAgIE9NWF9JbWFnZUZpbHRlclNvbGFyaXplLAotICAgIE9NWF9JbWFnZUZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JbWFnZUZpbHRlclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0ltYWdlRmlsdGVyTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfSU1BR0VGSUxURVJUWVBFOwotCi0KLS8qKgotICogSW1hZ2UgZmlsdGVyIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlSW1hZ2VGaWx0ZXIgOiBJbWFnZSBmaWx0ZXIgdHlwZSBlbnVtZXJhdGlvbgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9JTUFHRUZJTFRFUlRZUEUgZUltYWdlRmlsdGVyOwotfSBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRTsKLQotCi0vKioKLSAqIEN1c3RvbWl6ZWQgVSBhbmQgViBmb3IgY29sb3IgZW5oYW5jZW1lbnQKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiQ29sb3JFbmhhbmNlbWVudCA6IEVuYWJsZS9kaXNhYmxlIGNvbG9yIGVuaGFuY2VtZW50Ci0gKiAgbkN1c3RvbWl6ZWRVICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvcgotICogICAgICAgICAgICAgICAgICAgICAgVSBjb21wb25lbnQKLSAqICBuQ3VzdG9taXplZFYgICAgICA6IFByYWN0aWNhbCB2YWx1ZXM6IDE2LTI0MCwgcmFuZ2U6IDAtMjU1LCB2YWx1ZSBzZXQgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICBWIGNvbXBvbmVudAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkNvbG9yRW5oYW5jZW1lbnQ7Ci0gICAgT01YX1U4IG5DdXN0b21pemVkVTsKLSAgICBPTVhfVTggbkN1c3RvbWl6ZWRWOwotfSBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFOwotCi0KLS8qKgotICogRGVmaW5lIGNvbG9yIGtleSBhbmQgY29sb3Iga2V5IG1hc2sKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuQVJHQkNvbG9yIDogMzJiaXQgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgQ29sb3IKLSAqICBuQVJHQk1hc2sgIDogMzJiaXQgTWFzayBmb3IgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgY2hhbm5lbHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUktFWVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5BUkdCQ29sb3I7Ci0gICAgT01YX1UzMiBuQVJHQk1hc2s7Ci19IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFOwotCi0KLS8qKgotICogTGlzdCBvZiBjb2xvciBibGVuZCB0eXBlcyBmb3IgcHJlL3Bvc3QgcHJvY2Vzc2luZwotICoKLSAqIEVOVU1TOgotICogIE5vbmUgICAgICAgICAgOiBObyBjb2xvciBibGVuZGluZyBwcmVzZW50Ci0gKiAgQWxwaGFDb25zdGFudCA6IEZ1bmN0aW9uIGlzIChhbHBoYV9jb25zdGFudCAqIHNyYykgKwotICogICAgICAgICAgICAgICAgICAoMSAtIGFscGhhX2NvbnN0YW50KSAqIGRzdCkKLSAqICBBbHBoYVBlclBpeGVsIDogRnVuY3Rpb24gaXMgKGFscGhhICogc3JjKSArICgxIC0gYWxwaGEpICogZHN0KQotICogIEFsdGVybmF0ZSAgICAgOiBGdW5jdGlvbiBpcyBhbHRlcm5hdGluZyBwaXhlbHMgZnJvbSBzcmMgYW5kIGRzdAotICogIEFuZCAgICAgICAgICAgOiBGdW5jdGlvbiBpcyAoc3JjICYgZHN0KQotICogIE9yICAgICAgICAgICAgOiBGdW5jdGlvbiBpcyAoc3JjIHwgZHN0KQotICogIEludmVydCAgICAgICAgOiBGdW5jdGlvbiBpcyB+c3JjCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQ09MT1JCTEVORFRZUEUgewotICAgIE9NWF9Db2xvckJsZW5kTm9uZSwKLSAgICBPTVhfQ29sb3JCbGVuZEFscGhhQ29uc3RhbnQsCi0gICAgT01YX0NvbG9yQmxlbmRBbHBoYVBlclBpeGVsLAotICAgIE9NWF9Db2xvckJsZW5kQWx0ZXJuYXRlLAotICAgIE9NWF9Db2xvckJsZW5kQW5kLAotICAgIE9NWF9Db2xvckJsZW5kT3IsCi0gICAgT01YX0NvbG9yQmxlbmRJbnZlcnQsCi0gICAgT01YX0NvbG9yQmxlbmRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQ29sb3JCbGVuZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0NvbG9yQmxlbmRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9DT0xPUkJMRU5EVFlQRTsKLQotCi0vKioKLSAqIENvbG9yIGJsZW5kIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUkdCQWxwaGFDb25zdGFudCA6IENvbnN0YW50IGdsb2JhbCBhbHBoYSB2YWx1ZXMgd2hlbiBnbG9iYWwgYWxwaGEgaXMgdXNlZAotICogIGVDb2xvckJsZW5kICAgICAgIDogQ29sb3IgYmxlbmQgdHlwZSBlbnVtZXJhdGlvbgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuUkdCQWxwaGFDb25zdGFudDsKLSAgICBPTVhfQ09MT1JCTEVORFRZUEUgIGVDb2xvckJsZW5kOwotfSBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFOwotCi0KLS8qKgotICogSG9sZCBmcmFtZSBkaW1lbnNpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuV2lkdGggICAgIDogRnJhbWUgd2lkdGggaW4gcGl4ZWxzCi0gKiAgbkhlaWdodCAgICA6IEZyYW1lIGhlaWdodCBpbiBwaXhlbHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0ZSQU1FU0laRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5XaWR0aDsKLSAgICBPTVhfVTMyIG5IZWlnaHQ7Ci19IE9NWF9GUkFNRVNJWkVUWVBFOwotCi0KLS8qKgotICogUm90YXRpb24gY29uZmlndXJhdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5Sb3RhdGlvbiAgOiArLy0gaW50ZWdlciByb3RhdGlvbiB2YWx1ZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgblJvdGF0aW9uOwotfSBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRTsKLQotCi0vKioKLSAqIFBvc3NpYmxlIG1pcnJvcmluZyBkaXJlY3Rpb25zIGZvciBwcmUvcG9zdCBwcm9jZXNzaW5nCi0gKgotICogRU5VTVM6Ci0gKiAgTm9uZSAgICAgICA6IE5vIG1pcnJvcmluZwotICogIFZlcnRpY2FsICAgOiBWZXJ0aWNhbCBtaXJyb3JpbmcsIGZsaXAgb24gWCBheGlzCi0gKiAgSG9yaXpvbnRhbCA6IEhvcml6b250YWwgbWlycm9yaW5nLCBmbGlwIG9uIFkgYXhpcwotICogIEJvdGggICAgICAgOiBCb3RoIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIG1pcnJvcmluZwotICovCi10eXBlZGVmIGVudW0gT01YX01JUlJPUlRZUEUgewotICAgIE9NWF9NaXJyb3JOb25lID0gMCwKLSAgICBPTVhfTWlycm9yVmVydGljYWwsCi0gICAgT01YX01pcnJvckhvcml6b250YWwsCi0gICAgT01YX01pcnJvckJvdGgsCi0gICAgT01YX01pcnJvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9NaXJyb3JWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9NaXJyb3JNYXggPSAweDdGRkZGRkZGCi19IE9NWF9NSVJST1JUWVBFOwotCi0KLS8qKgotICogTWlycm9yaW5nIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlTWlycm9yICAgIDogTWlycm9yIHR5cGUgZW51bWVyYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NSVJST1JUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX01JUlJPUlRZUEUgIGVNaXJyb3I7Ci19IE9NWF9DT05GSUdfTUlSUk9SVFlQRTsKLQotCi0vKioKLSAqIFBvc2l0aW9uIGluZm9ybWF0aW9uIG9ubHkKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuWCAgICAgICAgIDogWCBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQKLSAqICBuWSAgICAgICAgIDogWSBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19QT0lOVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5YOwotICAgIE9NWF9TMzIgblk7Ci19IE9NWF9DT05GSUdfUE9JTlRUWVBFOwotCi0KLS8qKgotICogRnJhbWUgc2l6ZSBwbHVzIHBvc2l0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkxlZnQgICAgICA6IFggQ29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKLSAqICBuVG9wICAgICAgIDogWSBDb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQotICogIG5XaWR0aCAgICAgOiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlCi0gKiAgbkhlaWdodCAgICA6IEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUkVDVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5MZWZ0OwotICAgIE9NWF9TMzIgblRvcDsKLSAgICBPTVhfVTMyIG5XaWR0aDsKLSAgICBPTVhfVTMyIG5IZWlnaHQ7Ci19IE9NWF9DT05GSUdfUkVDVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWJsb2NraW5nIHN0YXRlOyBpdCBpcyByZXF1aXJlZCB0byBiZSBzZXQgdXAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb2RlYwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJEZWJsb2NraW5nIDogRW5hYmxlL2Rpc2FibGUgZGVibG9ja2luZyBtb2RlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJEZWJsb2NraW5nOwotfSBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEU7Ci0KLQotLyoqCi0gKiBTdGFiaWxpemF0aW9uIHN0YXRlCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgYlN0YWIgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZyYW1lIHN0YWJpbGl6YXRpb24gc3RhdGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GUkFNRVNUQUJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYlN0YWI7Ci19IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRTsKLQotCi0vKioKLSAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCB0eXBlCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgU3VuTGlnaHQgOiBSZWZlcmVuY2VkIGluIEpTUi0yMzQKLSAqICBGbGFzaCAgICA6IE9wdGltYWwgZm9yIGRldmljZSdzIGludGVncmF0ZWQgZmxhc2gKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9XSElURUJBTENPTlRST0xUWVBFIHsKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sT2ZmID0gMCwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sQXV0bywKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sU3VuTGlnaHQsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbENsb3VkeSwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sU2hhZGUsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbFR1bmdzdGVuLAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xGbHVvcmVzY2VudCwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sSW5jYW5kZXNjZW50LAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xGbGFzaCwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sSG9yaXpvbiwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX1doaXRlQmFsQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1doaXRlQmFsQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1dISVRFQkFMQ09OVFJPTFRZUEU7Ci0KLQotLyoqCi0gKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgY29uZmlndXJhdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVXaGl0ZUJhbENvbnRyb2wgOiBXaGl0ZSBiYWxhbmNlIGVudW1lcmF0aW9uCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9XSElURUJBTENPTlRST0xUWVBFIGVXaGl0ZUJhbENvbnRyb2w7Ci19IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRTsKLQotCi0vKioKLSAqIEV4cG9zdXJlIGNvbnRyb2wgdHlwZQotICovCi10eXBlZGVmIGVudW0gT01YX0VYUE9TVVJFQ09OVFJPTFRZUEUgewotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xPZmYgPSAwLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xBdXRvLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xOaWdodCwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sQmFja0xpZ2h0LAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTcG90TGlnaHQsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbFNwb3J0cywKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sU25vdywKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sQmVhY2gsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbExhcmdlQXBlcnR1cmUsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbFNtYWxsQXBwZXJ0dXJlLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRXhwb3N1cmVDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRXhwb3N1cmVDb250cm9sTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRVhQT1NVUkVDT05UUk9MVFlQRTsKLQotCi0vKioKLSAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCBjb25maWd1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUV4cG9zdXJlQ29udHJvbCA6IEV4cG9zdXJlIGNvbnRyb2wgZW51bWVyYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0VYUE9TVVJFQ09OVFJPTFRZUEUgZUV4cG9zdXJlQ29udHJvbDsKLX0gT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFOwotCi0KLS8qKgotICogRGVmaW5lcyBzZW5zb3Igc3VwcG9ydGVkIG1vZGUuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkZyYW1lUmF0ZSA6IFNpbmdsZSBzaG90IG1vZGUgaXMgaW5kaWNhdGVkIGJ5IGEgMAotICogIGJPbmVTaG90ICAgOiBFbmFibGUgZm9yIHNpbmdsZSBzaG90LCBkaXNhYmxlIGZvciBzdHJlYW1pbmcKLSAqICBzRnJhbWVTaXplIDogRnJhbWVzaXplCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TRU5TT1JNT0RFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkZyYW1lUmF0ZTsKLSAgICBPTVhfQk9PTCBiT25lU2hvdDsKLSAgICBPTVhfRlJBTUVTSVpFVFlQRSBzRnJhbWVTaXplOwotfSBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGNvbnRyYXN0IGxldmVsCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkNvbnRyYXN0ICA6IFZhbHVlcyBhbGxvd2VkIGZvciBjb250cmFzdCAtMTAwIHRvIDEwMCwgemVybyBtZWFucyBubyBjaGFuZ2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UUkFTVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5Db250cmFzdDsKLX0gT01YX0NPTkZJR19DT05UUkFTVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGJyaWdodG5lc3MgbGV2ZWwKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuQnJpZ2h0bmVzcyA6IDAtMTAwJQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JSSUdIVE5FU1NUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuQnJpZ2h0bmVzczsKLX0gT01YX0NPTkZJR19CUklHSFRORVNTVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgYmFja2xpZ2h0IGxldmVsIGNvbmZpZ3VyYXRpb24gZm9yIGEgdmlkZW8gc2luaywgZS5nLiBMQ0QgcGFuZWwKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuQmFja2xpZ2h0IDogVmFsdWVzIGFsbG93ZWQgZm9yIGJhY2tsaWdodCAwLTEwMCUKLSAqICBuVGltZW91dCAgIDogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYmFja2xpZ2h0IGF1dG9tYXRpY2FsbHkgdHVybnMKLSAqICAgICAgICAgICAgICAgb2ZmLiAgQSB2YWx1ZSBvZiAweDAgZGlzYWJsZXMgYmFja2lnaHQgdGltZW91dAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JBQ0tMSUdIVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5CYWNrbGlnaHQ7Ci0gICAgT01YX1UzMiBuVGltZW91dDsKLX0gT01YX0NPTkZJR19CQUNLTElHSFRUWVBFOwotCi0KLS8qKgotICogRGVmaW5lcyBzZXR0aW5nIGZvciBHYW1tYQotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5HYW1tYSAgICAgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgZ2FtbWEgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gY2hhbmdlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfR0FNTUFUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1MzMiBuR2FtbWE7Ci19IE9NWF9DT05GSUdfR0FNTUFUWVBFOwotCi0KLS8qKgotICogRGVmaW5lIGZvciBzZXR0aW5nIHNhdHVyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuU2F0dXJhdGlvbiA6IFZhbHVlcyBhbGxvd2VkIGZvciBzYXR1cmF0aW9uIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zCi0gKiAgICAgICAgICAgICAgICBubyBjaGFuZ2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19TQVRVUkFUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgblNhdHVyYXRpb247Ci19IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmUgZm9yIHNldHRpbmcgTGlnaHRuZXNzCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkxpZ2h0bmVzcyA6IFZhbHVlcyBhbGxvd2VkIGZvciBsaWdodG5lc3MgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8KLSAqICAgICAgICAgICAgICAgY2hhbmdlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgbkxpZ2h0bmVzczsKLX0gT01YX0NPTkZJR19MSUdIVE5FU1NUWVBFOwotCi0KLS8qKgotICogUGxhbmUgYmxlbmQgY29uZmlndXJhdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBJbmRleCBvZiBpbnB1dCBwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGxhbmUuCi0gKiAgbkRlcHRoICAgICA6IERlcHRoIG9mIHRoZSBwbGFuZSBpbiByZWxhdGlvbiB0byB0aGUgc2NyZWVuLiBIaWdoZXIKLSAqICAgICAgICAgICAgICAgbnVtYmVyZWQgZGVwdGhzIGFyZSAiYmVoaW5kIiBsb3dlciBudW1iZXIgZGVwdGhzLgotICogICAgICAgICAgICAgICBUaGlzIG51bWJlciBkZWZhdWx0cyB0byB0aGUgUG9ydCBJbmRleCBudW1iZXIuCi0gKiAgbkFscGhhICAgICA6IFRyYW5zcGFyZW5jeSBibGVuZGluZyBjb21wb25lbnQgZm9yIHRoZSBlbnRpcmUgcGxhbmUuCi0gKiAgICAgICAgICAgICAgIFNlZSBibGVuZGluZyBtb2RlcyBmb3IgbW9yZSBkZXRhaWwuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5EZXB0aDsKLSAgICBPTVhfVTMyIG5BbHBoYTsKLX0gT01YX0NPTkZJR19QTEFORUJMRU5EVFlQRTsKLQotCi0vKioKLSAqIERlZmluZSBpbnRlcmxhY2UgdHlwZQotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJFbmFibGUgICAgICAgICAgICAgICA6IEVuYWJsZSBjb250cm9sIHZhcmlhYmxlIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGJlbG93KQotICogIG5JbnRlcmxlYXZlUG9ydEluZGV4ICA6IEluZGV4IG9mIGlucHV0IG9yIG91dHB1dCBwb3J0IGFzc29jaWF0ZWQgd2l0aAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcmxlYXZlZCBwbGFuZS4KLSAqICBwUGxhbmFyUG9ydEluZGV4ZXNbNF0gOiBJbmRleCBvZiBpbnB1dCBvciBvdXRwdXQgcGxhbmFyIHBvcnRzLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlOwotICAgIE9NWF9VMzIgbkludGVybGVhdmVQb3J0SW5kZXg7Ci19IE9NWF9QQVJBTV9JTlRFUkxFQVZFVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgdGhlIHBpY3R1cmUgZWZmZWN0IHVzZWQgZm9yIGFuIGlucHV0IHBpY3R1cmUKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRSB7Ci0gICAgT01YX0VmZmVjdE5vbmUsCi0gICAgT01YX0VmZmVjdEZhZGVGcm9tQmxhY2ssCi0gICAgT01YX0VmZmVjdEZhZGVUb0JsYWNrLAotICAgIE9NWF9FZmZlY3RVbnNwZWNpZmllZFRocm91Z2hDb25zdGFudENvbG9yLAotICAgIE9NWF9FZmZlY3REaXNzb2x2ZSwKLSAgICBPTVhfRWZmZWN0V2lwZSwKLSAgICBPTVhfRWZmZWN0VW5zcGVjaWZpZWRNaXhPZlR3b1NjZW5lcywKLSAgICBPTVhfRWZmZWN0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0VmZmVjdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0VmZmVjdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1RSQU5TSVRJT05FRkZFQ1RUWVBFOwotCi0KLS8qKgotICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIGN1cnJlbnQgdHJhbnNpdGlvbiBlZmZlY3QKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqIGVFZmZlY3QgICAgOiBFZmZlY3QgdG8gZW5hYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVFJBTlNJVElPTkVGRkVDVFRZUEUgZUVmZmVjdDsKLX0gT01YX0NPTkZJR19UUkFOU0lUSU9ORUZGRUNUVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgcG9zc2libGUgZGF0YSB1bml0IHR5cGVzIGZvciBlbmNvZGVkIHZpZGVvIGRhdGEuIFRoZSBkYXRhIHVuaXQKLSAqIHR5cGVzIGFyZSB1c2VkIGJvdGggZm9yIGVuY29kZWQgdmlkZW8gaW5wdXQgZm9yIHBsYXliYWNrIGFzIHdlbGwgYXMKLSAqIGVuY29kZWQgdmlkZW8gb3V0cHV0IGZyb20gcmVjb3JkaW5nLgotICovCi10eXBlZGVmIGVudW0gT01YX0RBVEFVTklUVFlQRSB7Ci0gICAgT01YX0RhdGFVbml0Q29kZWRQaWN0dXJlLAotICAgIE9NWF9EYXRhVW5pdFZpZGVvU2VnbWVudCwKLSAgICBPTVhfRGF0YVVuaXRTZXZlcmFsU2VnbWVudHMsCi0gICAgT01YX0RhdGFVbml0QXJiaXRyYXJ5U3RyZWFtU2VjdGlvbiwKLSAgICBPTVhfRGF0YVVuaXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGF0YVVuaXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9EYXRhVW5pdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0RBVEFVTklUVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgcG9zc2libGUgZW5jYXBzdWxhdGlvbiB0eXBlcyBmb3IgY29kZWQgdmlkZW8gZGF0YSB1bml0LiBUaGUKLSAqIGVuY2Fwc3VsYXRpb24gaW5mb3JtYXRpb24gaXMgdXNlZCBib3RoIGZvciBlbmNvZGVkIHZpZGVvIGlucHV0IGZvcgotICogcGxheWJhY2sgYXMgd2VsbCBhcyBlbmNvZGVkIHZpZGVvIG91dHB1dCBmcm9tIHJlY29yZGluZy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFIHsKLSAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25FbGVtZW50YXJ5U3RyZWFtLAotICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbkdlbmVyaWNQYXlsb2FkLAotICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblJ0cFBheWxvYWQsCi0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25NYXggPSAweDdGRkZGRkZGCi19IE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFOwotCi0KLS8qKgotICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0eXBlIG9mIGJlaW5nIGRlY29kZWQvZW5jb2RlZAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fREFUQVVOSVRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfREFUQVVOSVRUWVBFIGVVbml0VHlwZTsKLSAgICBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRSBlRW5jYXBzdWxhdGlvblR5cGU7Ci19IE9NWF9QQVJBTV9EQVRBVU5JVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGRpdGhlciB0eXBlcwotICovCi10eXBlZGVmIGVudW0gT01YX0RJVEhFUlRZUEUgewotICAgIE9NWF9EaXRoZXJOb25lLAotICAgIE9NWF9EaXRoZXJPcmRlcmVkLAotICAgIE9NWF9EaXRoZXJFcnJvckRpZmZ1c2lvbiwKLSAgICBPTVhfRGl0aGVyT3RoZXIsCi0gICAgT01YX0RpdGhlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9EaXRoZXJWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9EaXRoZXJNYXggPSAweDdGRkZGRkZGCi19IE9NWF9ESVRIRVJUWVBFOwotCi0KLS8qKgotICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIGN1cnJlbnQgdHlwZSBvZiBkaXRoZXJpbmcKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19ESVRIRVJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfRElUSEVSVFlQRSBlRGl0aGVyOyAgIC8qKjwgVHlwZSBvZiBkaXRoZXJpbmcgdG8gdXNlICovCi19IE9NWF9DT05GSUdfRElUSEVSVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQk9PTCBiQ29udGludW91czsgICAvKio8IElmIHRydWUgdGhlbiBpZ25vcmUgZnJhbWUgcmF0ZSBhbmQgZW1pdCBjYXB0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkYXRhIGFzIGZhc3QgYXMgcG9zc2libGUgKG90aGVyd2lzZSBvYmV5IHBvcnQncyBmcmFtZSByYXRlKS4gKi8KLSAgICBPTVhfQk9PTCBiRnJhbWVMaW1pdGVkOyAvKio8IElmIHRydWUgdGhlbiB0ZXJtaW5hdGUgY2FwdHVyZSBhZnRlciB0aGUgcG9ydCBlbWl0cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNwZWNpZmllZCBudW1iZXIgb2YgZnJhbWVzIChvdGhlcndpc2UgdGhlIHBvcnQgZG9lcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRlcm1pbmF0ZSB0aGUgY2FwdHVyZSB1bnRpbCBpbnN0cnVjdGVkIHRvIGRvIHNvIGJ5IHRoZSBjbGllbnQpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRXZlbiBpZiBzZXQsIHRoZSBjbGllbnQgbWF5IG1hbnVhbGx5IHRlcm1pbmF0ZSB0aGUgY2FwdHVyZSBwcmlvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdG8gcmVhY2hpbmcgdGhlIGxpbWl0LiAqLwotICAgIE9NWF9VMzIgbkZyYW1lTGltaXQ7ICAgICAgLyoqPCBMaW1pdCBvbiBudW1iZXIgb2YgZnJhbWVzIGVtaXR0ZWQgZHVyaW5nIGEgY2FwdHVyZSAob25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWxpZCBpZiBiRnJhbWVMaW1pdGVkIGlzIHNldCkuICovCi19IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFOwotCi10eXBlZGVmIGVudW0gT01YX01FVEVSSU5HVFlQRSB7Ci0KLSAgICBPTVhfTWV0ZXJpbmdNb2RlQXZlcmFnZSwgICAgIC8qKjwgQ2VudGVyLXdlaWdodGVkIGF2ZXJhZ2UgbWV0ZXJpbmcuICovCi0gICAgT01YX01ldGVyaW5nTW9kZVNwb3QsICAJICAgICAgLyoqPCBTcG90IChwYXJ0aWFsKSBtZXRlcmluZy4gKi8KLSAgICBPTVhfTWV0ZXJpbmdNb2RlTWF0cml4LCAgICAgIC8qKjwgTWF0cml4IG9yIGV2YWx1YXRpdmUgbWV0ZXJpbmcuICovCi0KLSAgICBPTVhfTWV0ZXJpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWV0ZXJpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9FVk1vZGVNYXggPSAweDdmZmZmZmZmCi19IE9NWF9NRVRFUklOR1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfTUVURVJJTkdUWVBFIGVNZXRlcmluZzsKLSAgICBPTVhfUzMyIHhFVkNvbXBlbnNhdGlvbjsgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KLSAgICBPTVhfVTMyIG5BcGVydHVyZUZOdW1iZXI7ICAgICAvKio8IGUuZy4gbkFwZXJ0dXJlRk51bWJlciA9IDIgaW1wbGllcyAiZi8yIiAtIFExNiBmb3JtYXQgKi8KLSAgICBPTVhfQk9PTCBiQXV0b0FwZXJ0dXJlOwkJLyoqPCBXaGV0aGVyIGFwZXJ0dXJlIG51bWJlciBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KLSAgICBPTVhfVTMyIG5TaHV0dGVyU3BlZWRNc2VjOyAgICAvKio8IFNodXR0ZXJzcGVlZCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQk9PTCBiQXV0b1NodXR0ZXJTcGVlZDsJLyoqPCBXaGV0aGVyIHNodXR0ZXIgc3BlZWQgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCi0gICAgT01YX1UzMiBuU2Vuc2l0aXZpdHk7ICAgICAgICAgLyoqPCBlLmcuIG5TZW5zaXRpdml0eSA9IDEwMCBpbXBsaWVzICJJU08gMTAwIiAqLwotICAgIE9NWF9CT09MIGJBdXRvU2Vuc2l0aXZpdHk7CS8qKjwgV2hldGhlciBzZW5zaXRpdml0eSBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KLX0gT01YX0NPTkZJR19FWFBPU1VSRVZBTFVFVFlQRTsKLQotLyoqCi0gKiBGb2N1cyByZWdpb24gY29uZmlndXJhdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJDZW50ZXIgICAgICAgICA6IFVzZSBjZW50ZXIgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJMZWZ0ICAgICAgICAgICA6IFVzZSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiUmlnaHQgICAgICAgICAgOiBVc2UgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3AgICAgICAgICAgICA6IFVzZSB0b3AgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJCb3R0b20gICAgICAgICA6IFVzZSBib3R0b20gcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BMZWZ0ICAgICAgICA6IFVzZSB0b3AgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYlRvcFJpZ2h0ICAgICAgIDogVXNlIHRvcCByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkJvdHRvbUxlZnQgICAgIDogVXNlIGJvdHRvbSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tUmlnaHQgICAgOiBVc2UgYm90dG9tIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiQ2VudGVyOwotICAgIE9NWF9CT09MIGJMZWZ0OwotICAgIE9NWF9CT09MIGJSaWdodDsKLSAgICBPTVhfQk9PTCBiVG9wOwotICAgIE9NWF9CT09MIGJCb3R0b207Ci0gICAgT01YX0JPT0wgYlRvcExlZnQ7Ci0gICAgT01YX0JPT0wgYlRvcFJpZ2h0OwotICAgIE9NWF9CT09MIGJCb3R0b21MZWZ0OwotICAgIE9NWF9CT09MIGJCb3R0b21SaWdodDsKLX0gT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEU7Ci0KLS8qKgotICogRm9jdXMgU3RhdHVzIHR5cGUKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9GT0NVU1NUQVRVU1RZUEUgewotICAgIE9NWF9Gb2N1c1N0YXR1c09mZiA9IDAsCi0gICAgT01YX0ZvY3VzU3RhdHVzUmVxdWVzdCwKLSAgICBPTVhfRm9jdXNTdGF0dXNSZWFjaGVkLAotICAgIE9NWF9Gb2N1c1N0YXR1c1VuYWJsZVRvUmVhY2gsCi0gICAgT01YX0ZvY3VzU3RhdHVzTG9zdCwKLSAgICBPTVhfRm9jdXNTdGF0dXNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRm9jdXNTdGF0dXNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9Gb2N1c1N0YXR1c01heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0ZPQ1VTU1RBVFVTVFlQRTsKLQotLyoqCi0gKiBGb2N1cyBzdGF0dXMgY29uZmlndXJhdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGb2N1c1N0YXR1cyAgICAgICAgOiBTcGVjaWZpZXMgdGhlIGZvY3VzIHN0YXR1cwotICogIGJDZW50ZXJTdGF0dXMgICAgICAgOiBVc2UgY2VudGVyIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiTGVmdFN0YXR1cyAgICAgICAgIDogVXNlIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJSaWdodFN0YXR1cyAgICAgICAgOiBVc2UgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BTdGF0dXMgICAgICAgICAgOiBVc2UgdG9wIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tU3RhdHVzICAgICAgIDogVXNlIGJvdHRvbSByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYlRvcExlZnRTdGF0dXMgICAgICA6IFVzZSB0b3AgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYlRvcFJpZ2h0U3RhdHVzICAgICA6IFVzZSB0b3AgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJCb3R0b21MZWZ0U3RhdHVzICAgOiBVc2UgYm90dG9tIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJCb3R0b21SaWdodFN0YXR1cyAgOiBVc2UgYm90dG9tIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0ZPQ1VTU1RBVFVTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9GT0NVU1NUQVRVU1RZUEUgZUZvY3VzU3RhdHVzOwotICAgIE9NWF9CT09MIGJDZW50ZXJTdGF0dXM7Ci0gICAgT01YX0JPT0wgYkxlZnRTdGF0dXM7Ci0gICAgT01YX0JPT0wgYlJpZ2h0U3RhdHVzOwotICAgIE9NWF9CT09MIGJUb3BTdGF0dXM7Ci0gICAgT01YX0JPT0wgYkJvdHRvbVN0YXR1czsKLSAgICBPTVhfQk9PTCBiVG9wTGVmdFN0YXR1czsKLSAgICBPTVhfQk9PTCBiVG9wUmlnaHRTdGF0dXM7Ci0gICAgT01YX0JPT0wgYkJvdHRvbUxlZnRTdGF0dXM7Ci0gICAgT01YX0JPT0wgYkJvdHRvbVJpZ2h0U3RhdHVzOwotfSBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFOwotCi0vKiogQH0gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbWFnZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmUzOWVjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqLwotCi0vKiogCi0gKiBAZmlsZSBPTVhfSW1hZ2UuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IEltYWdlIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UgcGFyYW1ldGVycyBhbmQgCi0gKiBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KLSAqLwotI2lmbmRlZiBPTVhfSW1hZ2VfaAotI2RlZmluZSBPTVhfSW1hZ2VfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqCi0gKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlIAotICogaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkICAKLSAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KLQotLyoqIEBkZWZncm91cCBpbWFnaW5nIE9wZW5NQVggSUwgSW1hZ2luZyBEb21haW4KLSAqIEBpbmdyb3VwIGl2Ci0gKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIEltYWdpbmcgZG9tYWluCi0gKiBAewotICovCi0KLS8qKiAKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSBpbWFnZSBjb21wcmVzc2lvbiBjb2RpbmcuIAotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFX0NPRElOR1RZUEUgewotICAgIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQsICAgICAgLyoqPCBWYWx1ZSB3aGVuIGZvcm1hdCBpcyBOL0EgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nQXV0b0RldGVjdCwgIC8qKjwgQXV0byBkZXRlY3Rpb24gb2YgaW1hZ2UgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0pQRUcsICAgICAgICAvKio8IEpQRUcvSkZJRiBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nSlBFRzJLLCAgICAgIC8qKjwgSlBFRyAyMDAwIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdFWElGLCAgICAgICAgLyoqPCBFWElGIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdUSUZGLCAgICAgICAgLyoqPCBUSUZGIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdHSUYsICAgICAgICAgLyoqPCBHcmFwaGljcyBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nUE5HLCAgICAgICAgIC8qKjwgUE5HIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdMWlcsICAgICAgICAgLyoqPCBMWlcgaW1hZ2UgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0JNUCwgICAgICAgICAvKio8IFdpbmRvd3MgQml0bWFwIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0lNQUdFX0NvZGluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0lNQUdFX0NvZGluZ01heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lNQUdFX0NPRElOR1RZUEU7Ci0KLQotLyoqCi0gKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGRlZmluZSBhbiBpbWFnZSBwYXRoLiBUaGUgbnVtYmVyIG9mIGltYWdlIHBhdGhzIAotICogZm9yIGlucHV0IGFuZCBvdXRwdXQgd2lsbCB2YXJ5IGJ5IHR5cGUgb2YgdGhlIGltYWdlIGNvbXBvbmVudC4gIAotICogCi0gKiAgSW5wdXQgKGFrYSBTb3VyY2UpIDogWmVybyBJbnB1dHMsIG9uZSBPdXRwdXQsCi0gKiAgU3BsaXR0ZXIgICAgICAgICAgIDogT25lIElucHV0LCAyIG9yIG1vcmUgT3V0cHV0cywKLSAqICBQcm9jZXNzaW5nIEVsZW1lbnQgOiBPbmUgSW5wdXQsIG9uZSBvdXRwdXQsCi0gKiAgTWl4ZXIgICAgICAgICAgICAgIDogMiBvciBtb3JlIGlucHV0cywgb25lIG91dHB1dCwKLSAqICBPdXRwdXQgKGFrYSBTaW5rKSAgOiBPbmUgSW5wdXQsIHplcm8gb3V0cHV0cy4KLSAqIAotICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCi0gKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCAgCi0gKiBpbWFnZSBwYXRoLiAgSWYgYWRkaXRpb25hbCB2ZW5kb3Igc3BlY2lmaWMgZGF0YSBpcyByZXF1aXJlZCwgaXQgc2hvdWxkICAKLSAqIGJlIHRyYW5zbWl0dGVkIHRvIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIEN1c3RvbUNvbW1hbmQgZnVuY3Rpb24uICAgCi0gKiBDb21wbGlhbnQgY29tcG9uZW50cyB3aWxsIHByZXBvcHVsYXRlIHRoaXMgc3RydWN0dXJlIHdpdGggb3B0aW1hbCAgCi0gKiB2YWx1ZXMgZHVyaW5nIHRoZSBPTVhfR2V0UGFyYW1ldGVyKCkgY29tbWFuZC4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBjTUlNRVR5cGUgICAgICAgICAgICAgOiBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQKLSAqICBwTmF0aXZlUmVuZGVyICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgZGlzcGxheSBpZiBhIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAKLSAqICBuRnJhbWVXaWR0aCAgICAgICAgICAgOiBXaWR0aCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIHBvcnQgaWYgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiAgVXNlIDAgZm9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24sIGRvbid0IGNhcmUgb3IgdmFyaWFibGUKLSAqICBuRnJhbWVIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBwb3J0IGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24sIGRvbid0IGNhcmUgb3IgdmFyaWFibGUKLSAqICBuU3RyaWRlICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNwYW4gb2YgYW4gaW1hZ2UgKGkuZS4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2V0IGZyb20KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuIE4gdG8gc3BhbiBOKzEsIHdoZXJlIG5lZ2F0aXZlIHN0cmlkZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGltYWdlIGlzIGJvdHRvbSB1cAotICogIG5TbGljZUhlaWdodCAgICAgICAgICA6IEhlaWdodCB1c2VkIHdoZW4gZW5jb2RpbmcgaW4gc2xpY2VzCi0gKiAgYkZsYWdFcnJvckNvbmNlYWxtZW50IDogVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMgc3VwcG9ydGVkIGJ5IAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBPTVggY29tcG9uZW50Ci0gKiAgZUNvbXByZXNzaW9uRm9ybWF0ICAgIDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudC4gV2hlbiBPTVhfSU1BR0VfQ29kaW5nVW51c2VkIGlzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgZUNvbG9yRm9ybWF0IGlzIHZhbGlkCi0gKiAgZUNvbG9yRm9ybWF0ICAgICAgICAgIDogRGVjb21wcmVzc2VkIGZvcm1hdCB1c2VkIGJ5IHRoaXMgY29tcG9uZW50Ci0gKiAgcE5hdGl2ZVdpbmRvdyAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIHdpbmRvdyBvYmplY3QgaWYgYSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHNpbmsgLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAweDAuIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUE9SVERFRklOSVRJT05UWVBFIHsKLSAgICBPTVhfU1RSSU5HIGNNSU1FVHlwZTsKLSAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsKLSAgICBPTVhfVTMyIG5GcmFtZVdpZHRoOyAKLSAgICBPTVhfVTMyIG5GcmFtZUhlaWdodDsKLSAgICBPTVhfUzMyIG5TdHJpZGU7ICAgICAKLSAgICBPTVhfVTMyIG5TbGljZUhlaWdodDsKLSAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7Ci0gICAgT01YX0lNQUdFX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKLSAgICBPTVhfTkFUSVZFX1dJTkRPV1RZUEUgcE5hdGl2ZVdpbmRvdzsKLX0gT01YX0lNQUdFX1BPUlRERUZJTklUSU9OVFlQRTsKLQotCi0vKiogIAotICogUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUgdGhlIHZhcmlvdXMgCi0gKiBkYXRhIGlucHV0L291dHB1dCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0LgotICogCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0Ci0gKiAgbkluZGV4ICAgICAgICAgICAgIDogSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIAotICogICAgICAgICAgICAgICAgICAgICAgIDB4MCB0byBOLTEKLSAqICBlQ29tcHJlc3Npb25Gb3JtYXQgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuIFdoZW4gT01YX0lNQUdFX0NvZGluZ1VudXNlZCBpcyBzcGVjaWZpZWQsIAotICogICAgICAgICAgICAgICAgICAgICAgIGVDb2xvckZvcm1hdCBpcyB2YWxpZAotICogIGVDb2xvckZvcm1hdCAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fUE9SVEZPUk1BVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5JbmRleDsKLSAgICBPTVhfSU1BR0VfQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7Ci0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OwotfSBPTVhfSU1BR0VfUEFSQU1fUE9SVEZPUk1BVFRZUEU7Ci0KLQotLyoqIAotICogRmxhc2ggY29udHJvbCB0eXBlIAotICoKLSAqIEVOVU1TCi0gKiAgVG9yY2ggOiBGbGFzaCBmb3JjZWQgY29uc3RhbnRseSBvbgotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFX0ZMQVNIQ09OVFJPTFRZUEUgewotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xPbiA9IDAsCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbE9mZiwKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sQXV0bywKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sUmVkRXllUmVkdWN0aW9uLAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xGaWxsaW4sCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbFRvcmNoLAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lNQUdFX0ZMQVNIQ09OVFJPTFRZUEU7Ci0KLQotLyoqIAotICogRmxhc2ggY29udHJvbCBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGbGFzaENvbnRyb2wgOiBGbGFzaCBjb250cm9sIHR5cGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfSU1BR0VfRkxBU0hDT05UUk9MVFlQRSBlRmxhc2hDb250cm9sOwotfSBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRTsKLQotCi0vKiogCi0gKiBGb2N1cyBjb250cm9sIHR5cGUgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRSB7Ci0gICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE9uID0gMCwKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sT2ZmLAotICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xBdXRvLAotICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xBdXRvTG9jaywKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xNYXggPSAweDdGRkZGRkZGCi19IE9NWF9JTUFHRV9GT0NVU0NPTlRST0xUWVBFOwotCi0gCi0vKiogCi0gKiBGb2N1cyBjb250cm9sIGNvbmZpZ3VyYXRpb24gCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUZvY3VzQ29udHJvbCAgIDogRm9jdXMgY29udHJvbAotICogIG5Gb2N1c1N0ZXBzICAgICA6IEZvY3VzIGNhbiB0YWtlIG9uIHZhbHVlcyBmcm9tIDAgbW0gdG8gaW5maW5pdHkuIAotICogICAgICAgICAgICAgICAgICAgIEludGVyZXN0IGlzIG9ubHkgaW4gbnVtYmVyIG9mIHN0ZXBzIG92ZXIgdGhpcyByYW5nZS4KLSAqICBuRm9jdXNTdGVwSW5kZXggOiBDdXJyZW50IGZvY3VzIHN0ZXAgaW5kZXgKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX0NPTkZJR19GT0NVU0NPTlRST0xUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFX0ZPQ1VTQ09OVFJPTFRZUEUgZUZvY3VzQ29udHJvbDsKLSAgICBPTVhfVTMyIG5Gb2N1c1N0ZXBzOwotICAgIE9NWF9VMzIgbkZvY3VzU3RlcEluZGV4OwotfSBPTVhfSU1BR0VfQ09ORklHX0ZPQ1VTQ09OVFJPTFRZUEU7Ci0KLQotLyoqIAotICogUSBGYWN0b3IgZm9yIEpQRUcgY29tcHJlc3Npb24sIHdoaWNoIGNvbnRyb2xzIHRoZSB0cmFkZW9mZiBiZXR3ZWVuIGltYWdlCi0gKiBxdWFsaXR5IGFuZCBzaXplLiAgUSBGYWN0b3IgcHJvdmlkZXMgYSBtb3JlIHNpbXBsZSBtZWFucyBvZiBjb250cm9sbGluZwotICogSlBFRyBjb21wcmVzc2lvbiBxdWFsaXR5LCB3aXRob3V0IGRpcmVjdGx5IHByb2dyYW1taW5nIFF1YW50aXphdGlvbgotICogdGFibGVzIGZvciBjaHJvbWEgYW5kIGx1bWEgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgIAotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKLSAqICBuUUZhY3RvciAgIDogSlBFRyBRIGZhY3RvciB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgMS0xMDAuIEEgZmFjdG9yIG9mIDEgCi0gKiAgICAgICAgICAgICAgIHByb2R1Y2VzIHRoZSBzbWFsbGVzdCwgd29yc3QgcXVhbGl0eSBpbWFnZXMsIGFuZCBhIGZhY3RvciAKLSAqICAgICAgICAgICAgICAgb2YgMTAwIHByb2R1Y2VzIHRoZSBsYXJnZXN0LCBiZXN0IHF1YWxpdHkgaW1hZ2VzLiAgQSAKLSAqICAgICAgICAgICAgICAgdHlwaWNhbCBkZWZhdWx0IGlzIDc1IGZvciBzbWFsbCBnb29kIHF1YWxpdHkgaW1hZ2VzICAgICAgICAgICAgICAgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9RRkFDVE9SVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgCi0gICAgT01YX1UzMiBuUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19IE9NWF9JTUFHRV9QQVJBTV9RRkFDVE9SVFlQRTsKLQotLyoqIAotICogUXVhbnRpemF0aW9uIHRhYmxlIHR5cGUgCi0gKi8KLQotdHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9RVUFOVElaQVRJT05UQUJMRVRZUEUgewotICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUx1bWEgPSAwLAotICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUNocm9tYSwKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVDaHJvbWFDYiwKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVDaHJvbWFDciwKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9JTUFHRV9RVUFOVElaQVRJT05UQUJMRVRZUEU7Ci0KLS8qKiAKLSAqIEpQRUcgcXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgRENUIGNvbXByZXNzaW9uIGZvcgotICogWVVWIGRhdGEsIGFzIGFuIGFsdGVybmF0aXZlIHRvIHNwZWNpZnlpbmcgUSBmYWN0b3IsIHByb3ZpZGluZyBleGFjdCAKLSAqIGNvbnRyb2wgb2YgY29tcHJlc3Npb24gCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVRdWFudGl6YXRpb25UYWJsZSAgICAgIDogUXVhbnRpemF0aW9uIHRhYmxlIHR5cGUKLSAqICBuUXVhbnRpemF0aW9uTWF0cml4WzY0XSA6IEpQRUcgcXVhbnRpemF0aW9uIHRhYmxlIG9mIGNvZWZmaWNpZW50cyBzdG9yZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbmNyZWFzaW5nIGNvbHVtbnMgdGhlbiBieSByb3dzIG9mIGRhdGEgKGkuZS4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgMSwgLi4uIHJvdyA4KS4gUXVhbnRpemF0aW9uIHZhbHVlcyBhcmUgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmFuZ2UgMC0yNTUgYW5kIHN0b3JlZCBpbiBsaW5lYXIgb3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIHRoZSBjb21wb25lbnQgd2lsbCB6aWctemFnIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiB0YWJsZSBkYXRhIGlmIHJlcXVpcmVkIGludGVybmFsbHkpIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fUVVBTlRJWkFUSU9OVEFCTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFX1FVQU5USVpBVElPTlRBQkxFVFlQRSBlUXVhbnRpemF0aW9uVGFibGU7Ci0gICAgT01YX1U4IG5RdWFudGl6YXRpb25NYXRyaXhbNjRdOwotfSBPTVhfSU1BR0VfUEFSQU1fUVVBTlRJWkFUSU9OVEFCTEVUWVBFOwotCi0KLS8qKiAKLSAqIEh1ZmZtYW4gdGFibGUgdHlwZSwgdGhlIHNhbWUgSHVmZm1hbiB0YWJsZSBpcyBhcHBsaWVkIGZvciBjaHJvbWEgYW5kIAotICogbHVtYSBjb21wb25lbnQgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfSU1BR0VfSFVGRk1BTlRBQkxFVFlQRSB7Ci0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUFDID0gMCwKLSAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlREMsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUFDTHVtYSwKLSAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlQUNDaHJvbWEsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDTHVtYSwKLSAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlRENDaHJvbWEsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfSU1BR0VfSFVGRk1BTlRBQkxFVFlQRTsKLQotLyoqIAotICogSlBFRyBIdWZmbWFuIHRhYmxlIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVIdWZmbWFuVGFibGUgICAgICAgICAgICAgICAgICAgIDogSHVmZm1hbiB0YWJsZSB0eXBlCi0gKiAgbk51bWJlck9mSHVmZm1hbkNvZGVPZkxlbmd0aFsxNl0gOiAwLTE2LCBudW1iZXIgb2YgSHVmZm1hbiBjb2RlcyBvZiBlYWNoIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgbGVuZ3RoCi0gKiAgbkh1ZmZtYW5UYWJsZVsyNTZdICAgICAgICAgICAgICAgOiAwLTI1NSwgdGhlIHNpemUgdXNlZCBmb3IgQUMgYW5kIERDIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlIGFyZSAxNiBhbmQgMTYyIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fSFVGRk1BTlRUQUJMRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfSU1BR0VfSFVGRk1BTlRBQkxFVFlQRSBlSHVmZm1hblRhYmxlOwotICAgIE9NWF9VOCBuTnVtYmVyT2ZIdWZmbWFuQ29kZU9mTGVuZ3RoWzE2XTsKLSAgICBPTVhfVTggbkh1ZmZtYW5UYWJsZVsyNTZdOwotfU9NWF9JTUFHRV9QQVJBTV9IVUZGTUFOVFRBQkxFVFlQRTsKLQotLyoqIEB9ICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0luZGV4LmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0luZGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYjhkOTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbmRleC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiBAZmlsZSBPTVhfSW5kZXguaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBPTVhfSW5kZXggaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciBib3RoIGFwcGxpY2F0aW9ucwotICogIGFuZCBjb21wb25lbnRzIC4KLSAqLwotCi0KLSNpZm5kZWYgT01YX0luZGV4X2gKLSNkZWZpbmUgT01YX0luZGV4X2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKLSAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotI2luY2x1ZGUgPE9NWF9UeXBlcy5oPgotCi0KLS8qKiBUaGUgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBhIHN0cnVjdHVyZSB3aGVuIGVpdGhlcgotICogIGdldHRpbmcgb3Igc2V0dGluZyBwYXJhbWV0ZXJzIGFuZC9vciBjb25maWd1cmF0aW9uIGRhdGEuICBFYWNoIGVudHJ5IGluIAotICogIHRoaXMgZW51bWVyYXRpb24gbWFwcyB0byBhbiBPTVggc3BlY2lmaWVkIHN0cnVjdHVyZS4gIFdoZW4gdGhlIAotICogIE9NWF9HZXRQYXJhbWV0ZXIsIE9NWF9TZXRQYXJhbWV0ZXIsIE9NWF9HZXRDb25maWcgb3IgT01YX1NldENvbmZpZyBtZXRob2RzCi0gKiAgYXJlIHVzZWQsIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdpbGwgYWx3YXlzIGJlIGFuIGVudHJ5IGZyb20gdGhpcyBlbnVtZXJhdGlvbgotICogIGFuZCB0aGUgdGhpcmQgZW50cnkgd2lsbCBiZSB0aGUgc3RydWN0dXJlIHNob3duIGluIHRoZSBjb21tZW50cyBmb3IgdGhlIGVudHJ5LgotICogIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6aW5nIGEgY3JvcHBpbmcgZnVuY3Rpb24sIHRoZSAKLSAqICBPTVhfU2V0Q29uZmlnIGNvbW1hbmQgd291bGQgaGF2ZSBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgCi0gKiAgYW5kIHdvdWxkIHNlbmQgYSBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIE9NWF9SRUNUVFlQRSBzdHJ1Y3R1cmUgYXMgdGhlIAotICogIHRoaXJkIHBhcmFtZXRlci4KLSAqICAKLSAqICBUaGUgZW51bWVyYXRpb24gZW50cmllcyBuYW1lZCB3aXRoIHRoZSBPTVhfQ29uZmlnIHByZWZpeCBhcmUgc2VudCB1c2luZwotICogIHRoZSBPTVhfU2V0Q29uZmlnIGNvbW1hbmQgYW5kIHRoZSBlbnVtZXJhdGlvbiBlbnRyaWVzIG5hbWVkIHdpdGggdGhlCi0gKiAgT01YX1BBUkFNXyBwcmVmaXggYXJlIHNlbnQgdXNpbmcgdGhlIE9NWF9TZXRQYXJhbWV0ZXIgY29tbWFuZC4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9JTkRFWFRZUEUgewotCi0gICAgT01YX0luZGV4Q29tcG9uZW50U3RhcnRVbnVzZWQgPSAweDAxMDAwMDAwLAotICAgIE9NWF9JbmRleFBhcmFtUHJpb3JpdHlNZ210LCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BSSU9SSVRZTUdNVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUltYWdlSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbU90aGVySW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbU51bUF2YWlsYWJsZVN0cmVhbXMsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9VMzJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BY3RpdmVTdHJlYW0sICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fVTMyVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtU3VzcGVuc2lvblBvbGljeSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21wb25lbnRTdXNwZW5kZWQsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDYXB0dXJpbmcsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8gCi0gICAgT01YX0luZGV4Q29uZmlnQ2FwdHVyZU1vZGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NBUFRVUkVNT0RFVFlQRSAqLyAKLSAgICBPTVhfSW5kZXhBdXRvUGF1c2VBZnRlckNhcHR1cmUsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8gCi0gICAgT01YX0luZGV4UGFyYW1Db250ZW50VVJJLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFVSSVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUN1c3RvbUNvbnRlbnRQaXBlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEUgKi8gCi0gICAgT01YX0luZGV4UGFyYW1EaXNhYmxlUmVzb3VyY2VDb25jZWFsbWVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ01ldGFkYXRhSXRlbUNvdW50LCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb250YWluZXJOb2RlQ291bnQsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ01ldGFkYXRhSXRlbSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ291bnRlck5vZGVJRCwgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbU1ldGFkYXRhRmlsdGVyVHlwZSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbU1ldGFkYXRhS2V5RmlsdGVyLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdQcmlvcml0eU1nbXQsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QUklPUklUWU1HTVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGUsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKi8KLQotICAgIE9NWF9JbmRleFBvcnRTdGFydFVudXNlZCA9IDB4MDIwMDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21wQnVmZmVyU3VwcGxpZXIsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFICovIAotICAgIE9NWF9JbmRleFJlc2VydmVkU3RhcnRVbnVzZWQgPSAweDAzMDAwMDAwLAotCi0gICAgLyogQXVkaW8gcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBPTVhfSW5kZXhBdWRpb1N0YXJ0VW51c2VkID0gMHgwNDAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUmEsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9SQVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0FkcGNtLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjMsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRzcyOSwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HNzI5VFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BbXIsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvV21hLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1NiYywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9NaWRpLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX01JRElUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9GUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNRlJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb01pZGlMb2FkVXNlclNvdW5kLCAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjYsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyNlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvR3NtX0VGUiwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9IUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNSFJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1BkY19GUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUERDRlJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1BkY19FRlIsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUERDRUZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfSFIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0hSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9UZG1hX0ZSLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1RETUFGUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVGRtYV9FRlIsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9RY2VscDgsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1FDRUxQOFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUWNlbHAxMywgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9FdnJjLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0VWUkNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1NtdiwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fU01WVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXMsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKi8KLQotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaUltbWVkaWF0ZUV2ZW50LCAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJSU1NRURJQVRFRVZFTlRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9NaWRpQ29udHJvbCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaVNvdW5kQmFua1Byb2dyYW0sIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaVN0YXR1cywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaU1ldGFFdmVudCwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaU1ldGFFdmVudERhdGEsICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UREFUQVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb1ZvbHVtZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQmFsYW5jZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hhbm5lbE11dGUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb011dGUsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0xvdWRuZXNzLCAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9FY2hvQ2FuY2VsYXRpb24sICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0VDSE9DQU5DRUxBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb05vaXNlUmVkdWN0aW9uLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9CYXNzLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9UcmVibGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1RSRUJMRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb1N0ZXJlb1dpZGVuaW5nLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9DaG9ydXMsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0NIT1JVU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0VxdWFsaXplciwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfRVFVQUxJWkVSVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvUmV2ZXJiZXJhdGlvbiwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19SRVZFUkJFUkFUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hhbm5lbFZvbHVtZSwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRSAqLwotCi0gICAgLyogSW1hZ2Ugc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBPTVhfSW5kZXhJbWFnZVN0YXJ0VW51c2VkID0gMHgwNTAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbUltYWdlUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtRmxhc2hDb250cm9sLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdGb2N1c0NvbnRyb2wsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtUUZhY3RvciwgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1RdWFudGl6YXRpb25UYWJsZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fUVVBTlRJWkFUSU9OVEFCTEVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1IdWZmbWFuVGFibGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fSFVGRk1BTlRUQUJMRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdGbGFzaENvbnRyb2wsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFICovCi0KLSAgICAvKiBWaWRlbyBzcGVjaWZpYyBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleFZpZGVvU3RhcnRVbnVzZWQgPSAweDA2MDAwMDAwLAotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb1F1YW50aXphdGlvbiwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9GYXN0VXBkYXRlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1ZJREVPRkFTVFVQREFURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Nb3Rpb25WZWN0b3IsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01PVElPTlZFQ1RPUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSW50cmFSZWZyZXNoLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9WQlNNQywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnMiwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNCwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9XbXYsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUnYsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9SVlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0gyNjMsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50LCAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYU1CUmVmcmVzaCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb01CRXJyb3JSZXBvcnRpbmcsICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTWFjcm9ibG9ja3NQZXJGcmFtZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NQUNST0JMT0NLU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb01hY3JvQmxvY2tFcnJvck1hcCwgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUFDUk9CTE9DS0VSUk9STUFQVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9TbGljZUZNTywgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1PICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9OYWxTaXplLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX05BTFNJWkUgKi8KLQotICAgIC8qIEltYWdlICYgVmlkZW8gY29tbW9uIENvbmZpZ3VyYXRpb25zICovCi0gICAgT01YX0luZGV4Q29tbW9uU3RhcnRVbnVzZWQgPSAweDA3MDAwMDAwLAotICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uRGVibG9ja2luZywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0RFQkxPQ0tJTkdUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21tb25TZW5zb3JNb2RlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUNvbW1vbkludGVybGVhdmUsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9JTlRFUkxFQVZFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yRm9ybWF0Q29udmVyc2lvbiwgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JDT05WRVJTSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblNjYWxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25JbWFnZUZpbHRlciwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfSU1BR0VGSUxURVJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JFbmhhbmNlbWVudCwgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JLZXksICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SS0VZVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yQmxlbmQsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkZyYW1lU3RhYmlsaXNhdGlvbiwvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19GUkFNRVNUQUJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk1pcnJvciwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NSVJST1JUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0UG9zaXRpb24sICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1BPSU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbklucHV0Q3JvcCwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkRpZ2l0YWxab29tLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25PcHRpY2FsWm9vbSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25XaGl0ZUJhbGFuY2UsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4cG9zdXJlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29udHJhc3QsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRSQVNUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkJyaWdodG5lc3MsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CUklHSFRORVNTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkJhY2tsaWdodCwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CQUNLTElHSFRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uR2FtbWEsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0dBTU1BVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblNhdHVyYXRpb24sICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQVRVUkFUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkxpZ2h0bmVzcywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19MSUdIVE5FU1NUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhjbHVzaW9uUmVjdCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1JFQ1RUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRGl0aGVyaW5nLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0RJVEhFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25QbGFuZUJsZW5kLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25FeHBvc3VyZVZhbHVlLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRTaXplLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9GUkFNRVNJWkVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21tb25FeHRyYVF1YW50RGF0YSwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkZvY3VzUmVnaW9uLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25Gb2N1c1N0YXR1cywgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9GT0NVU1NUQVRVU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25UcmFuc2l0aW9uRWZmZWN0LCAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEUgKi8KLQotICAgIC8qIFJlc2VydmVkIENvbmZpZ3VyYXRpb24gcmFuZ2UgKi8KLSAgICBPTVhfSW5kZXhPdGhlclN0YXJ0VW51c2VkID0gMHgwODAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbU90aGVyUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ090aGVyUG93ZXIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX0NPTkZJR19QT1dFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdPdGhlclN0YXRzLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFICovCi0KLQotICAgIC8qIFJlc2VydmVkIFRpbWUgcmFuZ2UgKi8KLSAgICBPTVhfSW5kZXhUaW1lU3RhcnRVbnVzZWQgPSAweDA5MDAwMDAwLAotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVTY2FsZSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1NDQUxFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDbG9ja1N0YXRlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZUFjdGl2ZVJlZkNsb2NrLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfQUNUSVZFUkVGQ0xPQ0tUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWUsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAocmVhZCBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWUsICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHJlYWQgb25seSkgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlLCAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHdyaXRlIG9ubHkpICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRWaWRlb1JlZmVyZW5jZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVNZWRpYVRpbWVSZXF1ZXN0LCAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFICh3cml0ZSBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWUsICAgICAvKio8cmVmZXJlbmNlOiAgT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHdyaXRlIG9ubHkpICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVTZWVrTW9kZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSAqLwotCi0KLSAgICBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgLyogVmVuZG9yIHNwZWNpZmljIGFyZWEgKi8KLSAgICBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgLyogVmVuZG9yIHNwZWNpZmljIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBvZiAweDdGMDAwMDAwIAotICAgICAgIHRvIDB4N0ZGRkZGRkUuICBUaGlzIHJhbmdlIGlzIG5vdCBicm9rZW4gb3V0IGJ5IHZlbmRvciwgc28KLSAgICAgICBwcml2YXRlIGluZGV4ZXMgYXJlIG5vdCBndWFyYW50ZWVkIHVuaXF1ZSBhbmQgdGhlcmVmb3JlIHNob3VsZAotICAgICAgIG9ubHkgYmUgc2VudCB0byB0aGUgYXBwcm9wcmlhdGUgY29tcG9uZW50LiAqLwotCi0gICAgT01YX0luZGV4TWF4ID0gMHg3RkZGRkZGRgotCi19IE9NWF9JTkRFWFRZUEU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfT3RoZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfT3RoZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiY2U4My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX090aGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIEBmaWxlIE9NWF9PdGhlci5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IE90aGVyIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKLSAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KLSAqLwotCi0jaWZuZGVmIE9NWF9PdGhlcl9oCi0jZGVmaW5lIE9NWF9PdGhlcl9oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLQotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0KLQotLyoqIAotICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgZGF0YSB0eXBlcyB3aGljaCBtYXRjaCB0byBtdWx0aXBsZSBkb21haW5zIG9yIG5vCi0gKiBkb21haW4gYXQgYWxsLiAgRm9yIHR5cGVzIHdoaWNoIGFyZSB2ZW5kb3Igc3BlY2lmaWMsIGEgdmFsdWUgYWJvdmUKLSAqIE9NWF9PVEhFUl9WRU5ET1JUU1RBUlQgc2hvdWxkIGJlIHVzZWQuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfT1RIRVJfRk9STUFUVFlQRSB7Ci0gICAgT01YX09USEVSX0Zvcm1hdFRpbWUgPSAwLCAvKio8IFRyYW5zbWlzc2lvbiBvZiB2YXJpb3VzIHRpbWVzdGFtcHMsIGVsYXBzZWQgdGltZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgZGVsdGFzLCBldGMgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0UG93ZXIsICAgIC8qKjwgUGVyaGFwcyB1c2VkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgcG93ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQsIHNldHRpbmcgY2xvY2tzPyAqLwotICAgIE9NWF9PVEhFUl9Gb3JtYXRTdGF0cywgICAgLyoqPCBDb3VsZCBiZSB0aGluZ3Mgc3VjaCBhcyBmcmFtZSByYXRlLCBmcmFtZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsIGV0YyAqLwotICAgIE9NWF9PVEhFUl9Gb3JtYXRCaW5hcnksICAgLyoqPCBBcmJpdHJhcnkgYmluYXJ5IGRhdGEgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0VmVuZG9yUmVzZXJ2ZWQgPSAxMDAwLCAvKio8IFN0YXJ0aW5nIHZhbHVlIGZvciB2ZW5kb3Igc3BlY2lmaWMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzICovCi0KLSAgICBPTVhfT1RIRVJfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9PVEhFUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9PVEhFUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9PVEhFUl9GT1JNQVRUWVBFOwotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBzZWVrIG1vZGVzLgotICovCi10eXBlZGVmIGVudW0gT01YX1RJTUVfU0VFS01PREVUWVBFIHsKLSAgICBPTVhfVElNRV9TZWVrTW9kZUZhc3QgPSAwLCAvKio8IFByZWZlciBzZWVraW5nIHRvIGFuIGFwcHJveGltYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gb3ZlciAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBhY3R1YWwgc2VlayBwb3NpdGlvbiBpZiBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdHMgaW4gYSBmYXN0ZXIgc2Vlay4gKi8KLSAgICBPTVhfVElNRV9TZWVrTW9kZUFjY3VyYXRlLCAvKio8IFByZWZlciBzZWVraW5nIHRvIHRoZSBhY3R1YWwgc2VlayAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb3NpdGlvbiBvdmVyIGFuIGFwcHJveGltYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gZXZlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIGl0IHJlc3VsdHMgaW4gYSBzbG93ZXIgc2Vlay4gKi8KLSAgICBPTVhfVElNRV9TZWVrTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVElNRV9TZWVrTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1RJTUVfU2Vla01vZGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9USU1FX1NFRUtNT0RFVFlQRTsKLQotLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgc2Vla21vZGUgb2YgdGhlIGNvbXBvbmVudCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1RJTUVfU0VFS01PREVUWVBFIGVUeXBlOyAgICAvKio8IFRoZSBzZWVrIG1vZGUgKi8KLX0gT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRTsKLQotLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSB0aW1lIHN0YW1wIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZ3MgCi0gKiBvbiB0aGUgQ2xvY2sgQ29tcG9uZW50IChDQyk6Ci0gKiAKLSAqIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgd2FsbCAgCi0gKiAgICAgdGltZQotICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgbWVkaWEKLSAqICAgICB0aW1lCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlIGFuZCAgCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlOiBhdWRpby92aWRlbyByZWZlcmVuY2UgCi0gKiAgICAgY2xvY2sgc2VuZGluZyBTQyBpdHMgcmVmZXJlbmNlIHRpbWUKLSAqIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWU6IGEgQ2xvY2sgQ29tcG9uZW50IGNsaWVudCBzZW5kcyAKLSAqICAgICB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZyBvbiBpdHMgCi0gKiAgICAgY2xpZW50IHBvcnQgd2hlbiBpdCByZWNlaXZlcyBhIGJ1ZmZlciB3aXRoCi0gKiAgICAgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIHNldC4gSXQgbXVzdCB1c2UgdGhlIHRpbWVzdGFtcAotICogICAgIHNwZWNpZmllZCBieSB0aGF0IGJ1ZmZlciBmb3IgblN0YXJ0VGltZXN0YW1wLiAKLSAqCi0gKiBJdJJzIGFsc28gdXNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29uZmlnIG9uIGNvbXBvbmVudHMgaW4gZ2VuZXJhbDoKLSAqCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lUG9zaXRpb246IElMIGNsaWVudCBxdWVyeWluZyBjb21wb25lbnQgcG9zaXRpb24gCi0gKiAoR2V0Q29uZmlnKSBvciBjb21tYW5kaW5nIGEgY29tcG9uZW50IHRvIHNlZWsgdG8gdGhlIGdpdmVuIGxvY2F0aW9uCi0gKiAoU2V0Q29uZmlnKQotICovCQotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVElDS1MgblRpbWVzdGFtcDsgIAkgICAgIC8qKjwgdGltZXN0YW1wIC4qLyAKLX0gT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEU7ICAKLQotLyoqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHJlZmVyZW5jZSBjbG9ja3MgdG8gdGhlIG1lZGlhIHRpbWUuICovCi10eXBlZGVmIGVudW0gT01YX1RJTUVfVVBEQVRFVFlQRSB7Ci0gICAgICBPTVhfVElNRV9VcGRhdGVSZXF1ZXN0RnVsZmlsbG1lbnQsICAgIC8qKjwgVXBkYXRlIGlzIHRoZSBmdWxmaWxsbWVudCBvZiBhIG1lZGlhIHRpbWUgcmVxdWVzdC4gKi8KLSAgICAgIE9NWF9USU1FX1VwZGF0ZVNjYWxlQ2hhbmdlZCwJICAgICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIHNjYWxlIGNoYWduZWQuICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVDbG9ja1N0YXRlQ2hhbmdlZCwgICAgIC8qKjwgVXBkYXRlIHdhcyBnZW5lcmF0ZWQgYmVjYXVzZSB0aGUgY2xvY2sgc3RhdGUgY2hhbmdlZC4gKi8KLSAgICAgIE9NWF9USU1FX1VwZGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICAgIE9NWF9USU1FX1VwZGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9USU1FX1VQREFURVRZUEU7Ci0KLS8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwotdHlwZWRlZiBlbnVtIE9NWF9USU1FX1JFRkNMT0NLVFlQRSB7Ci0gICAgICBPTVhfVElNRV9SZWZDbG9ja05vbmUsICAgIC8qKjwgVXNlIG5vIHJlZmVyZW5jZXMuICovCi0gICAgICBPTVhfVElNRV9SZWZDbG9ja0F1ZGlvLAkvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlICovCi0gICAgICBPTVhfVElNRV9SZWZDbG9ja1ZpZGVvLCAgIC8qKjwgVXNlIHJlZmVyZW5jZXMgc2VudCB0aHJvdWdoIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UgKi8KLSAgICAgIE9NWF9USU1FX1JlZkNsb2NrS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tNYXggPSAweDdGRkZGRkZGCi19IE9NWF9USU1FX1JFRkNMT0NLVFlQRTsKLQotLyoqIEVudW1lcmF0aW9uIG9mIGNsb2NrIHN0YXRlcy4gKi8KLXR5cGVkZWYgZW51bSBPTVhfVElNRV9DTE9DS1NUQVRFIHsKLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVSdW5uaW5nLCAgICAgICAgICAgICAvKio8IENsb2NrIHJ1bm5pbmcuICovCi0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlV2FpdGluZ0ZvclN0YXJ0VGltZSwgLyoqPCBDbG9jayB3YWl0aW5nIHVudGlsIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByZXNjcmliZWQgY2xpZW50cyBlbWl0IHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzdGFydCB0aW1lLiAqLwotICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVN0b3BwZWQsICAgICAgICAgICAgIC8qKjwgQ2xvY2sgc3RvcHBlZC4gKi8KLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9USU1FX0NMT0NLU1RBVEU7Ci0KLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgbWVkaWEgdGltZSByZXF1ZXN0IHRvIHRoZSBjbG9jayBjb21wb25lbnQuCi0gKgotICogIEEgY2xpZW50IGNvbXBvbmVudCBzZW5kcyB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZwotICogIG9uIGl0cyBjbGllbnQgcG9ydCB0byBzcGVjaWZ5IGEgbWVkaWEgdGltZXN0YW1wIHRoZSBDbG9jayBDb21wb25lbnQKLSAqICBzaG91bGQgZW1pdC4gIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIGZ1bGZpbGwgdGhlIHJlcXVlc3QgYnkgc2VuZGluZyBhCi0gKiAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB3aGVuIGl0cyBtZWRpYSBjbG9jayBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgCi0gKiAgdGltZXN0YW1wLgotICoKLSAqICBUaGUgY2xpZW50IG1heSByZXF1aXJlIGEgbWVkaWEgdGltZSByZXF1ZXN0IGJlIGZ1bGZpbGxlZCBzbGlnaHRseQotICogIGVhcmxpZXIgdGhhbiB0aGUgbWVkaWEgdGltZSBzcGVjaWZpZWQuIEluIHRoaXMgY2FzZSB0aGUgY2xpZW50IHNwZWNpZmllcyAKLSAqICBhbiBvZmZzZXQgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3YWxsIHRpbWUgY29ycmVzcG9uZGluZyAKLSAqICB0byB0aGUgcmVxdWVzdGVkIG1lZGlhIHRpbWUgYW5kIHRoZSB3YWxsIHRpbWUgd2hlbiBpdCB3aWxsIGJlIAotICogIGZ1bGZpbGxlZC4gCi0gKgotICogIEEgY2xpZW50IGNvbXBvbmVudCBtYXkgdXNlcyB0aGVzZSByZXF1ZXN0cyBhbmQgdGhlIE9NWF9USU1FX01FRElBVElNRVRZUEUgdG8KLSAqICB0aW1lIGV2ZW50cyBhY2NvcmRpbmcgdG8gdGltZXN0YW1wcy4gSWYgYSBjbGllbnQgbXVzdCBwZXJmb3JtIGFuIG9wZXJhdGlvbiBPIGF0Ci0gKiAgYSB0aW1lIFQgKGUuZy4gZGVsaXZlciBhIHZpZGVvIGZyYW1lIGF0IGl0cyBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcCksIGl0IG1ha2VzIGEgCi0gKiAgbWVkaWEgdGltZSByZXF1ZXN0IGF0IFQgKHBlcmhhcHMgc3BlY2lmeWluZyBhbiBvZmZzZXQgdG8gZW5zdXJlIHRoZSByZXF1ZXN0IGZ1bGZpbGxtZW50Ci0gKiAgaXMgYSBsaXR0bGUgZWFybHkpLiBXaGVuIHRoZSBjbG9jayBjb21wb25lbnQgcGFzc2VzIHRoZSByZXN1bHRpbmcgT01YX1RJTUVfTUVESUFUSU1FVFlQRQotICogIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBjbGllbnQgY29tcG9uZW50LCB0aGUgY2xpZW50IG1heSBwZXJmb3JtIG9wZXJhdGlvbiBPIChwZXJoYXBzIGhhdmluZwotICogIHRvIHdhaXQgYSBzbGlnaHQgYW1vdW50IG1vcmUgdGltZSBpdHNlbGYgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZXR1cm4gdmFsdWVzKS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfTUVESUFUSU1FUkVRVUVTVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9QVFIgcENsaWVudFByaXZhdGU7ICAgICAvKio8IENsaWVudCBwcml2YXRlIGRhdGEgdG8gZGlzYWJpZ3VhdGUgdGhpcyBtZWRpYSB0aW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzIChlLmcuIHRoZSBudW1iZXIgb2YgdGhlIGZyYW1lIHRvIGRlbGl2ZXIpLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBEdXBsaWNhdGVkIGluIHRoZSBtZWRpYSB0aW1lIHN0cnVjdHVyZSB0aGF0IGZ1bGZpbGxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMgcmVxdWVzdC4gQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHVwZGF0ZXMuICovCi0gICAgT01YX1RJQ0tTIG5NZWRpYVRpbWVzdGFtcDsgIC8qKjwgTWVkaWEgdGltZXN0YW1wIHJlcXVlc3RlZC4qLyAKLSAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHNob3VsZCBiZSBmdWxmaWxsZWQgZWFybHkgKi8KLX0gT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFOwotCi0vKio8IFN0cnVjdHVyZSBzZW50IGZyb20gdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgZWl0aGVyIHdoZW4gZnVsZmlsbGluZyAKLSAqICAgYSBtZWRpYSB0aW1lIHJlcXVlc3Qgb3Igd2hlbiB0aGUgdGltZSBzY2FsZSBoYXMgY2hhbmdlZC4gCi0gKgotICogICBJbiB0aGUgZm9ybWVyIGNhc2UgdGhlIENsb2NrIENvbXBvbmVudCBmaWxscyB0aGlzIHN0cnVjdHVyZSBhbmQgdGltZXMgaXRzIGVtaXNzaW9uIAotICogICB0byBhIGNsaWVudCBjb21wb25lbnQgKHZpYSB0aGUgY2xpZW50IHBvcnQpIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtZWRpYSAKLSAqICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgdGhlIGNsaWVudC4gVGhlIENsb2NrIENvbXBvbmVudCBzaG91bGQgdGltZSB0aGUgZW1pc3Npb24gdG8gb2NjdXIKLSAqICAgd2hlbiB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBtYXRjaGVzIHRoZSBDbG9jayBDb21wb25lbnQncyBtZWRpYSB0aW1lIGJ1dCBhbHNvIHRoZSAKLSAqICAgcHJlc2NyaWJlZCBvZmZzZXQgZWFybHkuIAotICoKLSAqICAgVXBvbiBzY2FsZSBjaGFuZ2VzIHRoZSBjbG9jayBjb21wb25lbnQgY2xlYXJzIHRoZSBuQ2xpZW50UHJpdmF0ZSBkYXRhLCBzZW5kcyB0aGUgY3VycmVudAotICogICBtZWRpYSB0aW1lIGFuZCBzZXRzIHRoZSBuU2NhbGUgdG8gdGhlIG5ldyBzY2FsZSB2aWEgdGhlIGNsaWVudCBwb3J0LiBJdCBlbWl0cyBhIAotICogICBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvIGFsbCBjbGllbnRzIGluZGVwZW5kZW50IG9mIGFueSByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byAKLSAqICAgYWx0ZXIgcHJvY2Vzc2luZyB0byBhY2NvbW9kYXRlIHNjYWxpbmcuIEZvciBpbnN0YW5jZSBhIHZpZGVvIGNvbXBvbmVudCBtaWdodCBza2lwIGludGVyLWZyYW1lcyAKLSAqICAgaW4gdGhlIGNhc2Ugb2YgZXh0cmVtZSBmYXN0Zm9yd2FyZC4gTGlrZXdpc2UgYW4gYXVkaW8gY29tcG9uZW50IG1pZ2h0IGFkZCBvciByZW1vdmUgc2FtcGxlcyAKLSAqICAgZnJvbSBhbiBhdWRpbyBmcmFtZSB0byBzY2FsZSBhdWRpbyBkYXRhLiAKLSAqCi0gKiAgIEl0IGlzIGV4cGVjdGVkIHRoYXQgc29tZSBjbG9jayBjb21wb25lbnRzIG1heSBub3QgYmUgYWJsZSB0byBmdWxmaWxsIHJlcXVlc3RzCi0gKiAgIGF0IGV4YWN0bHkgdGhlIHByZXNjcmliZWQgdGltZS4gVGhpcyBpcyBhY2NlcHRhYmxlIHNvIGxvbmcgYXMgdGhlIHJlcXVlc3QgaXMgCi0gKiAgIGZ1bGZpbGxlZCBhdCBsZWFzdCBhcyBlYXJseSBhcyBkZXNjcmliZWQgYW5kIG5vdCBsYXRlci4gVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgCi0gKiAgIGZpZWxkcyB0aGUgY2xpZW50IG1heSB1c2UgdG8gd2FpdCBmb3IgdGhlIHJlbWFpbmluZyB0aW1lLgotICoKLSAqICAgVGhlIGNsaWVudCBtYXkgdXNlIGVpdGhlciB0aGUgbk9mZnNldCBvciBuV2FsbFRpbWVBdE1lZGlhIGZpZWxkcyB0byBkZXRlcm1pbmUgdGhlIAotICogICB3YWxsIHRpbWUgdW50aWwgdGhlIG5NZWRpYVRpbWVzdGFtcCBhY3R1YWxseSBvY2N1cnMuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKLSAqICAgY2xpZW50IGNhbiBnZXQgYSBtb3JlIGFjY3VyYXRlIHZhbHVlIGZvciBvZmZzZXQgYnkgZ2V0dGluZyB0aGUgY3VycmVudCB3YWxsCi0gKiAgIGZyb20gdGhlIGNsb2MgY29tcG9uZW50IGFuZCBzdWJ0cmFjdGluZyBpdCBmcm9tIG5XYWxsVGltZUF0TWVkaWEuIAotICovCi0KLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX01FRElBVElNRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgbkNsaWVudFByaXZhdGU7ICAgICAgICAgLyoqPCBDbGllbnQgcHJpdmF0ZSBkYXRhIHRvIGRpc2FiaWd1YXRlIHRoaXMgbWVkaWEgdGltZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZnJvbSBvdGhlcnMuIENvcGllZCBmcm9tIHRoZSBtZWRpYSB0aW1lIHJlcXVlc3QuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBIHZhbHVlIG9mIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIHRpbWUgc2NhbGUgdXBkYXRlcy4gKi8KLSAgICBPTVhfVElNRV9VUERBVEVUWVBFIGVVcGRhdGVUeXBlOyAvKio8IFJlYXNvbiBmb3IgdGhlIHVwZGF0ZSAqLwotICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAgICAgLyoqPCBNZWRpYSB0aW1lIHJlcXVlc3RlZC4gSWYgbm8gbWVkaWEgdGltZSB3YXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHJlcXVlc3RlZCB0aGVuIHRoaXMgaXMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZS4gKi8gCi0gICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgICAgICAvKio8IEFtb3VudCBvZiB3YWxsIGNsb2NrIHRpbWUgYnkgd2hpY2ggdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHdhcyBhY3R1YWxseSBmdWxmaWxsZWQgZWFybHkgKi8KLQotICAgIE9NWF9USUNLUyBuV2FsbFRpbWVBdE1lZGlhVGltZTsgLyoqPCBXYWxsIHRpbWUgY29ycmVzcG9uZGluZyB0byBuTWVkaWFUaW1lU3RhbXAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEEgY2xpZW50IG1heSBjb21wYXJlIHRoaXMgdmFsdWUgdG8gY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBtZWRpYSB0aW1lIG9idGFpbmVkIGZyb20gdGhlIENsb2NrIENvbXBvbmVudCB0byBkZXRlcm1pbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhlIHdhbGwgdGltZSB1bnRpbCB0aGUgbWVkaWEgdGltZXN0YW1wIGlzIHJlYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjdXJyZW50LiAqLwotICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgaW4gUTE2IGZvcm1hdC4gKi8KLSAgICBPTVhfVElNRV9DTE9DS1NUQVRFIGVTdGF0ZTsgICAgIC8qIFNlZWtpbmcgQ2hhbmdlLiBBZGRlZCA3LzEyLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLwotfSBPTVhfVElNRV9NRURJQVRJTUVUWVBFOyAgCi0KLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgZmFjdG9yLiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sgCi0gKiAgY29tcG9uZW50LCBvdGhlciBjb21wb25lbnRzIHNlZSBzY2FsZSBjaGFuZ2VzIHZpYSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIGJ1ZmZlcnMgc2VudCB2aWEKLSAqICB0aGUgY2xvY2sgY29tcG9uZW50IGNsaWVudCBwb3J0cy4gVXBvbiByZWNpZXZpbmcgdGhpcyBjb25maWcgdGhlIGNsb2NrIGNvbXBvbmVudCBjaGFuZ2VzIAotICogIHRoZSByYXRlIGJ5IHdoaWNoIHRoZSBtZWRpYSB0aW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZWZmZWN0aXZlbHkgaW1wbGVtZW50aW5nIHRyaWNrIG1vZGVzLiAKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGlzIGlzIGEgdmFsdWUgaW4gUTE2IGZvcm1hdCB3aGljaCBpcyB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2NhbGluZyB0aGUgbWVkaWEgdGltZSAqLwotfSBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFOwotIAotLyoqIEJpdHMgdXNlZCB0byBpZGVudGlmeSBhIGNsb2NrIHBvcnQuIFVzZWQgaW4gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFknMgbldhaXRNYXNrIGZpZWxkICovCi0jZGVmaW5lIE9NWF9DTE9DS1BPUlQwIDB4MDAwMDAwMDEKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDEgMHgwMDAwMDAwMgotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMiAweDAwMDAwMDA0Ci0jZGVmaW5lIE9NWF9DTE9DS1BPUlQzIDB4MDAwMDAwMDgKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDQgMHgwMDAwMDAxMAotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNSAweDAwMDAwMDIwCi0jZGVmaW5lIE9NWF9DTE9DS1BPUlQ2IDB4MDAwMDAwNDAKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDcgMHgwMDAwMDA4MAotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSBtZWRpYSBjbG9jay4gCi0gKiAgSUwgQ2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSBtb2RlIG9mIHRoZSAKLSAqICBtZWRpYSBjbG9jayBvZiB0aGUgY2xvY2sgY29tcG9uZW50LiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sKLSAqICBjb21wb25lbnQuIAotICogIAotICogIE9uIGEgU2V0Q29uZmlnIGlmIGVTdGF0ZSBpcyBPTVhfVElNRV9DbG9ja1N0YXRlUnVubmluZyBtZWRpYSB0aW1lCi0gKiAgc3RhcnRzIGltbWVkaWF0ZWx5IGF0IHRoZSBwcmVzY3JpYmVkIHN0YXJ0IHRpbWUuIElmCi0gKiAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUgdGhlIENsb2NrIENvbXBvbmVudCBpZ25vcmVzCi0gKiAgdGhlIGdpdmVuIG5TdGFydFRpbWUgYW5kIHdhaXRzIGZvciBhbGwgY2xpZW50cyBzcGVjaWZpZWQgaW4gdGhlIAotICogIG5XYWl0TWFzayB0byBzZW5kIHN0YXJ0dGltZXMgKHZpYSAKLSAqICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lKS4gVGhlIENsb2NrIENvbXBvbmVudCB0aGVuIHN0YXJ0cyAKLSAqICB0aGUgbWVkaWEgY2xvY2sgdXNpbmcgdGhlIGVhcmxpZXN0IHN0YXJ0IHRpbWUgc3VwcGxpZWQuICovICAgIAotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluZm9ybWF0aW9uICovCi0gICAgT01YX1RJTUVfQ0xPQ0tTVEFURSBlU3RhdGU7IC8qKjwgU3RhdGUgb2YgdGhlIG1lZGlhIHRpbWUuICovCi0gICAgT01YX1RJQ0tTIG5TdGFydFRpbWU7ICAgICAgIC8qKjwgU3RhcnQgdGltZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KLSAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBUaW1lIHRvIG9mZnNldCB0aGUgbWVkaWEgdGltZSBieSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGUuZy4gcHJlcm9sbCkuIE1lZGlhIHRpbWUgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXBvcnRlZCB0byBiZSBuT2Zmc2V0IHRpY2tzIGVhcmxpZXIuICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1UzMiBuV2FpdE1hc2s7ICAgICAgICAgIC8qKjwgTWFzayBvZiBPTVhfQ0xPQ0tQT1JUIHZhbHVlcy4gKi8KLX0gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFOwotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvCi0gKiAgY29tcHV0ZSBtZWRpYSB0aW1lLiBJTCBjbGllbnQgdXNlcyB0aGlzIGNvbmZpZyB0byBjaGFuZ2Ugb3IgcXVlcnkgdGhlIAotICogIGNsb2NrIGNvbXBvbmVudCdzIGFjdGl2ZSByZWZlcmVuY2UgY2xvY2sgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9USU1FX1JFRkNMT0NLVFlQRSBlQ2xvY2s7ICAgLyoqPCBSZWZlcmVuY2UgY2xvY2sgdXNlZCB0byBjb21wdXRlIG1lZGlhIHRpbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAKLX0gT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRTsKLQotLyoqIERlc2NyaXB0b3IgZm9yIHNldHRpbmcgc3BlY2lmaWNzIG9mIHBvd2VyIHR5cGUuCi0gKiAgTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgbGlzdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlUE07ICAgICAgIC8qKjwgRmxhZyB0byBlbmFibGUgUG93ZXIgTWFuYWdlbWVudCAqLwotfSBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRTsKLQotCi0vKiogRGVzY3JpcHRvciBmb3Igc2V0dGluZyBzcGVjaWZpY3Mgb2Ygc3RhdHMgdHlwZS4KLSAqICBOb3RlOiB0aGlzIHN0cnVjdHVyZSBpcyBsaXN0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX09USEVSX0NPTkZJR19TVEFUU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIC8qIHdoYXQgZ29lcyBoZXJlICovCi19IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFOwotCi0KLS8qKgotICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCi0gKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBvdGhlciAKLSAqIHBhdGguCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgewotICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7ICAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBjaGFubmVsICovCi19IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEU7Ci0KLS8qKiAgUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUKLSAgKiAgdGhlIHZhcmlvdXMgZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KLSAgICBPTVhfVTMyIG5JbmRleDsgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLwotICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIGNoYW5uZWwgKi8KLX0gT01YX09USEVSX1BBUkFNX1BPUlRGT1JNQVRUWVBFOyAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9UeXBlcy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2ZkNGJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogT01YX1R5cGVzLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgT01YX1R5cGVzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBwcmltaXRpdmUgdHlwZSBkZWZpbml0aW9ucyB1c2VkIGJ5IAotICogIHRoZSBjb3JlLCB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQuICBUaGlzIGZpbGUgbWF5IG5lZWQgdG8gYmUKLSAqICBtb2RpZmllZCB0byBiZSB1c2VkIG9uIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSAiY2hhciIgc2V0IHRvIDggYml0cywgCi0gKiAgInNob3J0IiBzZXQgdG8gMTYgYml0cyBhbmQgImxvbmciIHNldCB0byAzMiBiaXRzLgotICovCi0KLSNpZm5kZWYgT01YX1R5cGVzX2gKLSNkZWZpbmUgT01YX1R5cGVzX2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiogVGhlIE9NWF9BUEkgYW5kIE9NWF9BUElFTlRSWSBhcmUgcGxhdGZvcm0gc3BlY2lmaWMgZGVmaW5pdGlvbnMgdXNlZAotICogIHRvIGRlY2xhcmUgT01YIGZ1bmN0aW9uIHByb3RvdHlwZXMuICBUaGV5IGFyZSBtb2RpZmllZCB0byBtZWV0IHRoZQotICogIHJlcXVpcmVtZW50cyBmb3IgYSBwYXJ0aWN1bGFyIHBsYXRmb3JtICovCi0jaWZkZWYgX19TWU1CSUFOMzJfXyAgIAotIyAgIGlmZGVmIF9fT01YX0VYUE9SVFMKLSMgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgZWxzZQotIyAgICAgICBpZmRlZiBfV0lOMzIKLSMgICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSAKLSMgICAgICAgZWxzZQotIyAgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgIGVuZGlmCi0jICAgZW5kaWYKLSNlbHNlCi0jICAgaWZkZWYgX1dJTjMyCi0jICAgICAgaWZkZWYgX19PTVhfRVhQT1JUUwotIyAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBlbHNlCi0vLyMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jZGVmaW5lIE9NWF9BUEkKLSMgICAgICBlbmRpZgotIyAgIGVsc2UKLSMgICAgICBpZmRlZiBfX09NWF9FWFBPUlRTCi0jICAgICAgICAgIGRlZmluZSBPTVhfQVBJCi0jICAgICAgZWxzZQotIyAgICAgICAgICBkZWZpbmUgT01YX0FQSSBleHRlcm4KLSMgICAgICBlbmRpZgotIyAgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBPTVhfQVBJRU5UUlkKLSNkZWZpbmUgT01YX0FQSUVOVFJZIAotI2VuZGlmIAotCi0vKiogT01YX0lOIGlzIHVzZWQgdG8gaWRlbnRpZnkgaW5wdXRzIHRvIGFuIE9NWCBmdW5jdGlvbi4gIFRoaXMgZGVzaWduYXRpb24gCi0gICAgd2lsbCBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgcGFyYW1ldGVyIAotICAgIHRoYXQgaXMgdXNlZCBhcyBhbiBvdXRwdXQuICovCi0jaWZuZGVmIE9NWF9JTgotI2RlZmluZSBPTVhfSU4KLSNlbmRpZgotCi0vKiogT01YX09VVCBpcyB1c2VkIHRvIGlkZW50aWZ5IG91dHB1dHMgZnJvbSBhbiBPTVggZnVuY3Rpb24uICBUaGlzIAotICAgIGRlc2lnbmF0aW9uIHdpbGwgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0IHBvaW50cyAKLSAgICB0byBhIHBhcmFtZXRlciB0aGF0IGlzIHVzZWQgYXMgYW4gaW5wdXQuICovCi0jaWZuZGVmIE9NWF9PVVQKLSNkZWZpbmUgT01YX09VVAotI2VuZGlmCi0KLQotLyoqIE9NWF9JTk9VVCBpcyB1c2VkIHRvIGlkZW50aWZ5IHBhcmFtZXRlcnMgdGhhdCBtYXkgYmUgZWl0aGVyIGlucHV0cyBvcgotICAgIG91dHB1dHMgZnJvbSBhbiBPTVggZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZS4gIFRoaXMgZGVzaWduYXRpb24gd2lsbCAKLSAgICBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgIHBvaW50cyB0byBhIHBhcmFtZXRlciB0aGF0IAotICAgIGlzIHVzZWQgYm90aCBhcyBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0LiAqLwotI2lmbmRlZiBPTVhfSU5PVVQKLSNkZWZpbmUgT01YX0lOT1VUCi0jZW5kaWYKLQotLyoqIE9NWF9BTEwgaXMgdXNlZCB0byBhcyBhIHdpbGRjYXJkIHRvIHNlbGVjdCBhbGwgZW50aXRpZXMgb2YgdGhlIHNhbWUgdHlwZQotICogIHdoZW4gc3BlY2lmeWluZyB0aGUgaW5kZXgsIG9yIHJlZmVycmluZyB0byBhIG9iamVjdCBieSBhbiBpbmRleC4gIChpLmUuCi0gKiAgdXNlIE9NWF9BTEwgdG8gaW5kaWNhdGUgYWxsIE4gY2hhbm5lbHMpLiBXaGVuIHVzZWQgYXMgYSBwb3J0IGluZGV4Ci0gKiAgZm9yIGEgY29uZmlnIG9yIHBhcmFtZXRlciB0aGlzIE9NWF9BTEwgZGVub3RlcyB0aGF0IHRoZSBjb25maWcgb3IKLSAqICBwYXJhbWV0ZXIgYXBwbGllcyB0byB0aGUgZW50aXJlIGNvbXBvbmVudCBub3QganVzdCBvbmUgcG9ydC4gKi8KLSNkZWZpbmUgT01YX0FMTCAweEZGRkZGRkZGCi0KLS8qKiBJbiB0aGUgZm9sbG93aW5nIHdlIGRlZmluZSBncm91cHMgdGhhdCBoZWxwIGJ1aWxkaW5nIGRveHlnZW4gZG9jdW1lbnRhdGlvbiAqLwotCi0vKiogQGRlZmdyb3VwIGNvcmUgT3Blbk1BWCBJTCBjb3JlCi0gKiBGdW5jdGlvbnMgYW5kIHN0cnVjdHVyZSByZWxhdGVkIHRvIHRoZSBPTVggSUwgY29yZQotICovCi0gCi0gLyoqIEBkZWZncm91cCBjb21wIE9wZW5NQVggSUwgY29tcG9uZW50Ci0gKiBGdW5jdGlvbnMgYW5kIHN0cnVjdHVyZSByZWxhdGVkIHRvIHRoZSBPTVggSUwgY29tcG9uZW50Ci0gKi8KLSAKLS8qKiBAZGVmZ3JvdXAgcnBtIFJlc291cmNlIGFuZCBQb2xpY3kgTWFuYWdlbWVudCAKLSAqIFN0cnVjdHVyZXMgZm9yIHJlc291cmNlIGFuZCBwb2xpY3kgbWFuYWdlbWVudCBvZiBjb21wb25lbnRzCi0gKi8KLQotLyoqIEBkZWZncm91cCBidWYgQnVmZmVyIE1hbmFnZW1lbnQKLSAqIEJ1ZmZlciBoYW5kbGluZyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMKLSAqLwotICAKLS8qKiBAZGVmZ3JvdXAgdHVuIFR1bm5lbGluZwotICogQGluZ3JvdXAgY29yZSBjb21wCi0gKiBTdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgdG8gbWFuYWdlIHR1bm5lbHMgYW1vbmcgY29tcG9uZW50IHBvcnRzCi0gKi8KLSAKLS8qKiBAZGVmZ3JvdXAgY3AgQ29udGVudCBQaXBlcwotICogIEBpbmdyb3VwIGNvcmUKLSAqLwotIAotIC8qKiBAZGVmZ3JvdXAgbWV0YWRhdGEgTWV0YWRhdGEgaGFuZGxpbmcKLSAgKiAKLSAgKi8gCi0KLS8qKiBPTVhfVTggaXMgYW4gOCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7Ci0KLS8qKiBPTVhfUzggaXMgYW4gOCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKLQotLyoqIE9NWF9VMTYgaXMgYSAxNiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IE9NWF9VMTY7Ci0KLS8qKiBPTVhfUzE2IGlzIGEgMTYgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkIHNob3J0IE9NWF9TMTY7Ci0KLS8qKiBPTVhfVTMyIGlzIGEgMzIgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMzIgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIE9NWF9VMzI7Ci0KLS8qKiBPTVhfUzMyIGlzIGEgMzIgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDMyIGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkIGxvbmcgT01YX1MzMjsKLQotCi0vKiBVc2VycyB3aXRoIGNvbXBpbGVycyB0aGF0IGNhbm5vdCBhY2NlcHQgdGhlICJsb25nIGxvbmciIGRlc2lnbmF0aW9uIHNob3VsZAotICAgZGVmaW5lIHRoZSBPTVhfU0tJUDY0QklUIG1hY3JvLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyBtYXkgY2F1c2UgCi0gICBzb21lIGNvbXBvbmVudHMgdG8gZmFpbCB0byBjb21waWxlIGlmIHRoZSBjb21wb25lbnQgd2FzIHdyaXR0ZW4gdG8gcmVxdWlyZQotICAgNjQgYml0IGludGVncmFsIHR5cGVzLiAgSG93ZXZlciwgdGhlc2UgY29tcG9uZW50cyB3b3VsZCBOT1QgY29tcGlsZSBhbnl3YXkKLSAgIHNpbmNlIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB3YXkgdGhlIGNvbXBvbmVudCB3YXMgd3JpdHRlbi4KLSovCi0jaWZuZGVmIE9NWF9TS0lQNjRCSVQKLSNpZmRlZiBfX1NZTUJJQU4zMl9fCi0vKiogT01YX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7Ci0KLS8qKiBPTVhfUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBPTVhfUzY0OwotCi0jZWxpZiBkZWZpbmVkKFdJTjMyKQotCi0vKiogT01YX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8gICAKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgT01YX1U2NDsKLQotLyoqIE9NWF9TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgICBfX2ludDY0ICBPTVhfUzY0OwotCi0jZWxzZSAvKiBXSU4zMiAqLwotCi0vKiogT01YX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7Ci0KLS8qKiBPTVhfUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBPTVhfUzY0OwotCi0jZW5kaWYgLyogV0lOMzIgKi8KLSNlbmRpZgotCi0KLS8qKiBUaGUgT01YX0JPT0wgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHRydWUgb3IgYSBmYWxzZSAKLSAgICB2YWx1ZSB3aGVuIHBhc3NpbmcgcGFyYW1ldGVycyB0byBhbmQgZnJvbSB0aGUgT01YIGNvcmUgYW5kIGNvbXBvbmVudHMuICBUaGUKLSAgICBPTVhfQk9PTCBpcyBhIDMyIGJpdCBxdWFudGl0eSBhbmQgaXMgYWxpZ25lZCBvbiBhIDMyIGJpdCB3b3JkIGJvdW5kYXJ5LgotICovCi10eXBlZGVmIGVudW0gT01YX0JPT0wgewotICAgIE9NWF9GQUxTRSA9IDAsCi0gICAgT01YX1RSVUUgPSAhT01YX0ZBTFNFLAotICAgIE9NWF9CT09MX01BWCA9IDB4N0ZGRkZGRkYKLX0gT01YX0JPT0w7IAotIAotLyoqIFRoZSBPTVhfUFRSIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIHBvaW50ZXJzIGJldHdlZW4gdGhlIE9NWAotICAgIGFwcGxpY2F0aW9ucyBhbmQgdGhlIE9NWCBDb3JlIGFuZCBjb21wb25lbnRzLiAgVGhpcyBpcyBhIDMyIGJpdCBwb2ludGVyIGFuZAotICAgIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgYm91bmRhcnkuCi0gKi8KLXR5cGVkZWYgdm9pZCogT01YX1BUUjsKLQotLyoqIFRoZSBPTVhfU1RSSU5HIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzICJDIiB0eXBlIHN0cmluZ3MgYmV0d2VlbgotICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvcmUgYW5kIGNvbXBvbmVudC4gIFRoZSBPTVhfU1RSSU5HIHR5cGUgaXMgYSAzMiAKLSAgICBiaXQgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcuICBUaGUgIHBvaW50ZXIgaXMgd29yZCBhbGlnbmVkIGFuZCAKLSAgICB0aGUgc3RyaW5nIGlzIGJ5dGUgYWxpZ25lZC4gIAotICovCi10eXBlZGVmIGNoYXIqIE9NWF9TVFJJTkc7Ci0KLS8qKiBUaGUgT01YX0JZVEUgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgYXJyYXlzIG9mIGJ5dGVzIHN1Y2ggYXMKLSAgICBidWZmZXJzIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IGFuZCBjb3JlLiAgVGhlIE9NWF9CWVRFIAotICAgIHR5cGUgaXMgYSAzMiBiaXQgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcuICBUaGUgIHBvaW50ZXIgaXMgd29yZAotICAgIGFsaWduZWQgYW5kIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLgotICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIqIE9NWF9CWVRFOwotCi0vKiogT01YX1VVSURUWVBFIGlzIGEgdmVyeSBsb25nIHVuaXF1ZSBpZGVudGlmaWVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5Ci0gICAgYXQgcnVudGltZS4gIFRoaXMgaWRlbnRpZmllciBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5IGEgY29tcG9uZW50IGluIGEgd2F5Ci0gICAgdGhhdCBndWFyYW50ZWVzIHRoYXQgZXZlcnkgaW5zdGFuY2Ugb2YgdGhlIGlkZW50aWZpZXIgcnVubmluZyBvbiB0aGUgc3lzdGVtCi0gICAgaXMgdW5pcXVlLiAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VVUlEVFlQRVsxMjhdOwotCi0vKiogVGhlIE9NWF9ESVJUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgaWYgYSBwb3J0IGlzIGFuIGlucHV0IG9yCi0gICAgYW4gb3V0cHV0IHBvcnQuICBUaGlzIGVudW1lcmF0aW9uIGlzIGNvbW1vbiBhY3Jvc3MgYWxsIGNvbXBvbmVudCB0eXBlcy4gICAgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfRElSVFlQRQotewotICAgIE9NWF9EaXJJbnB1dCwgICAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBhbiBpbnB1dCBwb3J0ICovCi0gICAgT01YX0Rpck91dHB1dCwgICAgICAgICAgICAgLyoqPCBQb3J0IGlzIGFuIG91dHB1dCBwb3J0ICovCi0gICAgT01YX0Rpck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0RJUlRZUEU7Ci0KLS8qKiBUaGUgT01YX0VORElBTlRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgYml0IG9yZGVyaW5nIAotICAgIGZvciBudW1lcmljYWwgZGF0YSAoaS5lLiBiaWcgZW5kaWFuLCBvciBsaXR0bGUgZW5kaWFuKS4gICAgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfRU5ESUFOVFlQRQotewotICAgIE9NWF9FbmRpYW5CaWcsIC8qKjwgYmlnIGVuZGlhbiAqLwotICAgIE9NWF9FbmRpYW5MaXR0bGUsIC8qKjwgbGl0dGxlIGVuZGlhbiAqLwotICAgIE9NWF9FbmRpYW5NYXggPSAweDdGRkZGRkZGCi19IE9NWF9FTkRJQU5UWVBFOwotCi0KLS8qKiBUaGUgT01YX05VTUVSSUNBTERBVEFUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgaWYgZGF0YSAKLSAgICBpcyBzaWduZWQgb3IgdW5zaWduZWQKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9OVU1FUklDQUxEQVRBVFlQRQotewotICAgIE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkLCAvKio8IHNpZ25lZCBkYXRhICovCi0gICAgT01YX051bWVyaWNhbERhdGFVbnNpZ25lZCwgLyoqPCB1bnNpZ25lZCBkYXRhICovCi0gICAgT01YX051bWVyY2lhbERhdGFNYXggPSAweDdGRkZGRkZGCi19IE9NWF9OVU1FUklDQUxEQVRBVFlQRTsKLQotCi0vKiogVW5zaWduZWQgYm91bmRlZCB2YWx1ZSB0eXBlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQlUzMiB7Ci0gICAgT01YX1UzMiBuVmFsdWU7IC8qKjwgYWN0dWFsIHZhbHVlICovCi0gICAgT01YX1UzMiBuTWluOyAgIC8qKjwgbWluaW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlID49IG5NaW4pICovCi0gICAgT01YX1UzMiBuTWF4OyAgIC8qKjwgbWF4aW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlIDw9IG5NYXgpICovCi19IE9NWF9CVTMyOwotCi0KLS8qKiBTaWduZWQgYm91bmRlZCB2YWx1ZSB0eXBlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQlMzMiB7Ci0gICAgT01YX1MzMiBuVmFsdWU7IC8qKjwgYWN0dWFsIHZhbHVlICovCi0gICAgT01YX1MzMiBuTWluOyAgIC8qKjwgbWluaW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlID49IG5NaW4pICovCi0gICAgT01YX1MzMiBuTWF4OyAgIC8qKjwgbWF4aW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlIDw9IG5NYXgpICovCi19IE9NWF9CUzMyOwotCi0KLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHNvbWUgdGltZSBvciBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMuIFRoaXMgc3RydWN0dXJlCi0gICogIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgNjQgYml0IHZhbHVlLiBUaGUgcXVhbnRpdHkgaXMgc2lnbmVkIHRvIGFjY29tbW9kYXRlIAotICAqICBuZWdhdGl2ZSBkZWx0YXMgYW5kIHByZXJvbGwgc2NlbmFyaW9zLiBUaGUgcXVhbnRpdHkgaXMgcmVwcmVzZW50ZWQgaW4gbWljcm9zZWNvbmRzIAotICAqICB0byBhY2NvbW9kYXRlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lc3RhbXBzIChlLmcuIERWRCBwcmVzZW50YXRpb24gdGltZXN0YW1wcyBiYXNlZAotICAqICBvbiBhIDkwa0h6IGNsb2NrKSBhbmQgdG8gYWxsb3cgbW9yZSBhY2N1cmF0ZSBhbmQgc3luY2hyb25pemVkIGRlbGl2ZXJ5IChlLmcuIAotICAqICBpbmRpdmlkdWFsIGF1ZGlvIHNhbXBsZXMgZGVsaXZlcmVkIGF0IDE5MiBrSHopLiBUaGUgcXVhbnRpdHkgaXMgNjQgYml0IHRvIAotICAqICBhY2NvbW1vZGF0ZSBhIGxhcmdlIGR5bmFtaWMgcmFuZ2UgKHNpZ25lZCAzMiBiaXQgdmFsdWVzIHdvdWxkIGFsbG93IG9ubHkgZm9yIHBsdXMKLSAgKiAgb3IgbWludXMgMzUgbWludXRlcykuCi0gICoKLSAgKiAgSW1wbGVtZW50YXRpb25zIHdpdGggbGltaXRlZCBwcmVjaXNpb24gbWF5IGNvbnZlcnQgdGhlIHNpZ25lZCA2NCBiaXQgdmFsdWUgdG8gCi0gICogIGEgc2lnbmVkIDMyIGJpdCB2YWx1ZSBpbnRlcm5hbGx5IGJ1dCByaXNrIGxvc3Mgb2YgcHJlY2lzaW9uLiAgCi0gICovCi0jaWZuZGVmIE9NWF9TS0lQNjRCSVQKLXR5cGVkZWYgT01YX1M2NCBPTVhfVElDS1M7Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJQ0tTCi17Ci0gICAgT01YX1UzMiBuTG93UGFydDsgICAgLyoqIGxvdyBiaXRzIG9mIHRoZSBzaWduZWQgNjQgYml0IHRpY2sgdmFsdWUgKi8KLSAgICBPTVhfVTMyIG5IaWdoUGFydDsgICAvKiogaGlnaCBiaXRzIG9mIHRoZSBzaWduZWQgNjQgYml0IHRpY2sgdmFsdWUgKi8KLX0gT01YX1RJQ0tTOwotI2VuZGlmCi0jZGVmaW5lIE9NWF9USUNLU19QRVJfU0VDT05EIDEwMDAwMDAKLQotLyoqIERlZmluZSB0aGUgcHVibGljIGludGVyZmFjZSBmb3IgdGhlIE9NWCBIYW5kbGUuICBUaGUgY29yZSB3aWxsIG5vdCB1c2UKLSAgICB0aGlzIHZhbHVlIGludGVybmFsbHksIGJ1dCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgdXNlIHRoaXMgdmFsdWUuCi0gKi8KLXR5cGVkZWYgdm9pZCogT01YX0hBTkRMRVRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9NQVJLVFlQRQotewotICAgIE9NWF9IQU5ETEVUWVBFIGhNYXJrVGFyZ2V0Q29tcG9uZW50OyAgIC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBhIG1hcmsgZXZlbnQgdXBvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIG1hcmsuICovCi0gICAgT01YX1BUUiBwTWFya0RhdGE7ICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrIHNlbnQgb24gYSBtYXJrIGV2ZW50IHRvIGRpc2FtYmlndWF0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWFyayBmcm9tIG90aGVycy4gKi8KLX0gT01YX01BUktUWVBFOwotCi0KLS8qKiBPTVhfTkFUSVZFX0RFVklDRVRZUEUgaXMgdXNlZCB0byBtYXAgYSBPTVggdmlkZW8gcG9ydCB0byB0aGUKLSAqICBwbGF0Zm9ybSAmIG9wZXJhdGluZyBzcGVjaWZpYyBvYmplY3QgdXNlZCB0byByZWZlcmVuY2UgdGhlIGRpc3BsYXkgCi0gKiAgb3IgY2FuIGJlIHVzZWQgYnkgYSBhdWRpbyBwb3J0IGZvciBuYXRpdmUgYXVkaW8gcmVuZGVyaW5nICovCi10eXBlZGVmIHZvaWQqIE9NWF9OQVRJVkVfREVWSUNFVFlQRTsKLQotLyoqIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBpcyB1c2VkIHRvIG1hcCBhIE9NWCB2aWRlbyBwb3J0IHRvIHRoZQotICogIHBsYXRmb3JtICYgb3BlcmF0aW5nIHNwZWNpZmljIG9iamVjdCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgd2luZG93ICovCi10eXBlZGVmIHZvaWQqIE9NWF9OQVRJVkVfV0lORE9XVFlQRTsKLQotLyoqIFRoZSBPTVhfVkVSU0lPTlRZUEUgdW5pb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB2ZXJzaW9uIGZvcgotICAgIGEgc3RydWN0dXJlIG9yIGNvbXBvbmVudC4gIEZvciBhIGNvbXBvbmVudCwgdGhlIHZlcnNpb24gaXMgZW50aXJlbHkKLSAgICBzcGVjaWZpZWQgYnkgdGhlIGNvbXBvbmVudCB2ZW5kb3IuICBDb21wb25lbnRzIGRvaW5nIHRoZSBzYW1lIGZ1bmN0aW9uCi0gICAgZnJvbSBkaWZmZXJlbnQgdmVuZG9ycyBtYXkgb3IgbWF5IG5vdCBoYXZlIHRoZSBzYW1lIHZlcnNpb24uICBGb3IgCi0gICAgc3RydWN0dXJlcywgdGhlIHZlcnNpb24gc2hhbGwgYmUgc2V0IGJ5IHRoZSBlbnRpdHkgdGhhdCBhbGxvY2F0ZXMgdGhlCi0gICAgc3RydWN0dXJlLiAgRm9yIHN0cnVjdHVyZXMgc3BlY2lmaWVkIGluIHRoZSBPTVggMS4xIHNwZWNpZmljYXRpb24sIHRoZQotICAgIHZhbHVlIG9mIHRoZSB2ZXJzaW9uIHNoYWxsIGJlIHNldCB0byAxLjEuMC4wIGluIGFsbCBjYXNlcy4gIEFjY2VzcyB0byB0aGUKLSAgICBPTVhfVkVSU0lPTlRZUEUgY2FuIGJlIGJ5IGEgc2luZ2xlIDMyIGJpdCBhY2Nlc3MgKGUuZy4gYnkgblZlcnNpb24pIG9yCi0gICAgYnkgYWNjZXNzaW5nIG9uZSBvZiB0aGUgc3RydWN0dXJlIGVsZW1lbnRzIHRvLCBmb3IgZXhhbXBsZSwgY2hlY2sgb25seQotICAgIHRoZSBNYWpvciByZXZpc2lvbi4KLSAqLwotdHlwZWRlZiB1bmlvbiBPTVhfVkVSU0lPTlRZUEUKLXsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIE9NWF9VOCBuVmVyc2lvbk1ham9yOyAgIC8qKjwgTWFqb3IgdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCi0gICAgICAgIE9NWF9VOCBuVmVyc2lvbk1pbm9yOyAgIC8qKjwgTWlub3IgdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCi0gICAgICAgIE9NWF9VOCBuUmV2aXNpb247ICAgICAgIC8qKjwgUmV2aXNpb24gdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCi0gICAgICAgIE9NWF9VOCBuU3RlcDsgICAgICAgICAgIC8qKjwgU3RlcCB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KLSAgICB9IHM7Ci0gICAgT01YX1UzMiBuVmVyc2lvbjsgICAgICAgICAgIC8qKjwgMzIgYml0IHZhbHVlIHRvIG1ha2UgYWNjZXNzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBlYXNpbHkgZG9uZSBpbiBhIHNpbmdsZSB3b3JkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGNvcHkvY29tcGFyZSBvcGVyYXRpb24gKi8KLX0gT01YX1ZFUlNJT05UWVBFOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1ZpZGVvLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODQ4NWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3OCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIAotICogIEBmaWxlIE9NWF9WaWRlby5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIHN0cnVjdHVyZXMgaXMgbmVlZGVkIGJ5IFZpZGVvIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UgcGFyYW1ldGVycyAKLSAqICBhbmQgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggT01YIGNvbXBvbmVudHMuCi0gKi8KLSNpZm5kZWYgT01YX1ZpZGVvX2gKLSNkZWZpbmUgT01YX1ZpZGVvX2gKLQotLyoqIEBkZWZncm91cCB2aWRlbyBPcGVuTUFYIElMIFZpZGVvIERvbWFpbgotICogQGluZ3JvdXAgaXYKLSAqIFN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgVmlkZW8gZG9tYWluCi0gKiBAewotICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKioKLSAqIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKLSAqIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAotICogZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLQotI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgotCi0KLS8qKgotICogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIHZpZGVvIGNvbXByZXNzaW9uIGNvZGluZ3MuICAKLSAqIE5PVEU6ICBUaGlzIGVzc2VudGlhbGx5IHJlZmVycyB0byBmaWxlIGV4dGVuc2lvbnMuIElmIHRoZSBjb2RpbmcgaXMgCi0gKiAgICAgICAgYmVpbmcgdXNlZCB0byBzcGVjaWZ5IHRoZSBFTkNPREUgdHlwZSwgdGhlbiBhZGRpdGlvbmFsIHdvcmsgCi0gKiAgICAgICAgbXVzdCBiZSBkb25lIHRvIGNvbmZpZ3VyZSB0aGUgZXhhY3QgZmxhdm9yIG9mIHRoZSBjb21wcmVzc2lvbiAKLSAqICAgICAgICB0byBiZSB1c2VkLiAgRm9yIGRlY29kZSBjYXNlcyB3aGVyZSB0aGUgdXNlciBhcHBsaWNhdGlvbiBjYW4gCi0gKiAgICAgICAgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBNUEVHLTQgYW5kIEguMjY0IGJpdCBzdHJlYW1zLCBpdCBpcyAKLSAqICAgICAgICB1cCB0byB0aGUgY29kZWMgdG8gaGFuZGxlIHRoaXMuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQ09ESU5HVFlQRSB7Ci0gICAgT01YX1ZJREVPX0NvZGluZ1VudXNlZCwgICAgIC8qKjwgVmFsdWUgd2hlbiBjb2RpbmcgaXMgTi9BICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0F1dG9EZXRlY3QsIC8qKjwgQXV0b2RldGVjdGlvbiBvZiBjb2RpbmcgdHlwZSAqLwotICAgIE9NWF9WSURFT19Db2RpbmdNUEVHMiwgICAgICAvKio8IEFLQTogSC4yNjIgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nSDI2MywgICAgICAgLyoqPCBILjI2MyAqLwotICAgIE9NWF9WSURFT19Db2RpbmdNUEVHNCwgICAgICAvKio8IE1QRUctNCAqLwotICAgIE9NWF9WSURFT19Db2RpbmdXTVYsICAgICAgICAvKio8IGFsbCB2ZXJzaW9ucyBvZiBXaW5kb3dzIE1lZGlhIFZpZGVvICovCi0gICAgT01YX1ZJREVPX0NvZGluZ1JWLCAgICAgICAgIC8qKjwgYWxsIHZlcnNpb25zIG9mIFJlYWwgVmlkZW8gKi8KLSAgICBPTVhfVklERU9fQ29kaW5nQVZDLCAgICAgICAgLyoqPCBILjI2NC9BVkMgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTUpQRUcsICAgICAgLyoqPCBNb3Rpb24gSlBFRyAqLwotICAgIE9NWF9WSURFT19Db2RpbmdWUFgsICAgICAgICAvKio8IEdvb2dsZSBWUFgsIGZvcm1lcmx5IGtub3duIGFzIE9uMiBWUDggKi8KLSAgICBPTVhfVklERU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19DT0RJTkdUWVBFOwotCi0KLS8qKgotICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYSB2aWRlbyBwYXRoLiAgVGhlIG51bWJlciBvZiBWaWRlbyBwYXRocyBmb3IgCi0gKiBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBWaWRlbyBjb21wb25lbnQuICAKLSAqIAotICogICAgSW5wdXQgKGFrYSBTb3VyY2UpIDogemVybyBJbnB1dHMsIG9uZSBPdXRwdXQsCi0gKiAgICBTcGxpdHRlciAgICAgICAgICAgOiBvbmUgSW5wdXQsIDIgb3IgbW9yZSBPdXRwdXRzLAotICogICAgUHJvY2Vzc2luZyBFbGVtZW50IDogb25lIElucHV0LCBvbmUgb3V0cHV0LAotICogICAgTWl4ZXIgICAgICAgICAgICAgIDogMiBvciBtb3JlIGlucHV0cywgb25lIG91dHB1dCwKLSAqICAgIE91dHB1dCAoYWthIFNpbmspICA6IG9uZSBJbnB1dCwgemVybyBvdXRwdXRzLgotICogCi0gKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKLSAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IHZpZGVvIAotICogcGF0aC4gIElmIGFkZGl0aW9uYWwgdmVuZG9yIHNwZWNpZmljIGRhdGEgaXMgcmVxdWlyZWQsIGl0IHNob3VsZCBiZSAKLSAqIHRyYW5zbWl0dGVkIHRvIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIEN1c3RvbUNvbW1hbmQgZnVuY3Rpb24uICBDb21wbGlhbnQgCi0gKiBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsIHZhbHVlcyBkdXJpbmcgdGhlIAotICogR2V0RGVmYXVsdEluaXRQYXJhbXMgY29tbWFuZC4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBjTUlNRVR5cGUgICAgICAgICAgICAgOiBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQKLSAqICBwTmF0aXZlUmVuZGVyICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgZGlzcGxheSBpZiBhIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAKLSAqICBuRnJhbWVXaWR0aCAgICAgICAgICAgOiBXaWR0aCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiAgVXNlIDAgZm9yIHVua25vd24sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgblN0cmlkZSAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJ5dGVzIHBlciBzcGFuIG9mIGFuIGltYWdlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3BhbiBOIHRvIHNwYW4gTisxLCB3aGVyZSBuZWdhdGl2ZSBzdHJpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGltYWdlIGlzIGJvdHRvbSB1cAotICogIG5TbGljZUhlaWdodCAgICAgICAgICA6IEhlaWdodCB1c2VkIHdoZW4gZW5jb2RpbmcgaW4gc2xpY2VzCi0gKiAgbkJpdHJhdGUgICAgICAgICAgICAgIDogQml0IHJhdGUgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciB1bmtub3duLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgeEZyYW1lcmF0ZSAgICAgICAgICAgIDogRnJhbWUgcmF0ZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgdW5jb21wcmVzc2VkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgZG9uJ3QgY2FyZSBvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4gIFVuaXRzIGFyZSBRMTYgZnJhbWVzIHBlciBzZWNvbmQuCi0gKiAgYkZsYWdFcnJvckNvbmNlYWxtZW50IDogVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMgc3VwcG9ydGVkIGJ5IAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBPTVggY29tcG9uZW50Ci0gKiAgZUNvbXByZXNzaW9uRm9ybWF0ICAgIDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBlQ29sb3JGb3JtYXQgaXMgdXNlZAotICogIGVDb2xvckZvcm1hdCA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAotICogIHBOYXRpdmVXaW5kb3cgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgd2luZG93IG9iamVjdCBpZiBhIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4gCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgewotICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOwotICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOwotICAgIE9NWF9VMzIgbkZyYW1lV2lkdGg7Ci0gICAgT01YX1UzMiBuRnJhbWVIZWlnaHQ7Ci0gICAgT01YX1MzMiBuU3RyaWRlOwotICAgIE9NWF9VMzIgblNsaWNlSGVpZ2h0OwotICAgIE9NWF9VMzIgbkJpdHJhdGU7Ci0gICAgT01YX1UzMiB4RnJhbWVyYXRlOwotICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsKLSAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7Ci0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OwotICAgIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBwTmF0aXZlV2luZG93OwotfSBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFOwotCi0vKiogIAotICogUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUgdGhlIHZhcmlvdXMgCi0gKiBkYXRhIGlucHV0L291dHB1dCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0LgotICogCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0Ci0gKiAgbkluZGV4ICAgICAgICAgICAgIDogSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIAotICogICAgICAgICAgICAgICAgICAgICAgIDB4MCB0byBOLTEKLSAqICBlQ29tcHJlc3Npb25Gb3JtYXQgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuIFdoZW4gT01YX1ZJREVPX0NvZGluZ1VudXNlZCBpcyBzcGVjaWZpZWQsIAotICogICAgICAgICAgICAgICAgICAgICAgIGVDb2xvckZvcm1hdCBpcyB1c2VkIAotICogIGVDb2xvckZvcm1hdCAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAotICogIHhGcmFtZVJhdGUgICAgICAgICA6IEluZGljYXRlcyB0aGUgdmlkZW8gZnJhbWUgcmF0ZSBpbiBRMTYgZm9ybWF0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkluZGV4OwotICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsgCi0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OwotICAgIE9NWF9VMzIgeEZyYW1lcmF0ZTsKLX0gT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdmlkZW8gY29tcHJlc3Npb24gcXVhbnRpemF0aW9uIAotICogcGFyYW1ldGVyIHZhbHVlcy4gIENvZGVjcyBtYXkgc3VwcG9ydCBkaWZmZXJlbnQgUVAgdmFsdWVzIGZvciBkaWZmZXJlbnQKLSAqIGZyYW1lIHR5cGVzLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblFwSSAgICAgICA6IFFQIHZhbHVlIHRvIHVzZSBmb3IgaW5kZXggZnJhbWVzCi0gKiAgblFwUCAgICAgICA6IFFQIHZhbHVlIHRvIHVzZSBmb3IgUCBmcmFtZXMKLSAqICBuUXBCICAgICAgIDogUVAgdmFsdWVzIHRvIHVzZSBmb3IgYmlkaXJlY3Rpb25hbCBmcmFtZXMgCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuUXBJOwotICAgIE9NWF9VMzIgblFwUDsKLSAgICBPTVhfVTMyIG5RcEI7Ci19IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFOwotCi0KLS8qKiAKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiBvZiB2aWRlbyBmYXN0IHVwZGF0ZSBwYXJhbWV0ZXJzLiAKLSAqICAKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvIAotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJFbmFibGVWRlUgOiBFbmFibGUvRGlzYWJsZSB2aWRlbyBmYXN0IHVwZGF0ZQotICogIG5GaXJzdEdPQiAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayByb3cKLSAqICBuRmlyc3RNQiAgIDogc3BlY2lmaWVzIHRoZSBmaXJzdCBNQiByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGZpcnN0IEdPQgotICogIG5OdW1NQnMgICAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBNQnMgdG8gYmUgcmVmcmVzaGVkIGZyb20gbkZpcnN0R09CIAotICogICAgICAgICAgICAgICBhbmQgbkZpcnN0TUIKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZJREVPRkFTVFVQREFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAotICAgIE9NWF9CT09MIGJFbmFibGVWRlU7ICAgICAgCi0gICAgT01YX1UzMiBuRmlyc3RHT0I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgbkZpcnN0TUI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgbk51bU1CczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFOwotCi0KLS8qKiAKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGJpdHJhdGUgY29udHJvbCB0eXBlcyAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgewotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGUsCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGUsCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQsCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGVTa2lwRnJhbWVzLAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50U2tpcEZyYW1lcywKLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19DT05UUk9MUkFURVRZUEU7Ci0KLQotLyoqIAotICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBiaXRyYXRlIG1vZGUgb2YgYSBjb2RlYy4gCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICA6IE9NWCBzcGVjIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0IGFwcGxpZXMgdG8KLSAqICBlQ29udHJvbFJhdGUgICA6IENvbnRyb2wgcmF0ZSB0eXBlIGVudW0KLSAqICBuVGFyZ2V0Qml0cmF0ZSA6IFRhcmdldCBiaXRyYXRlIHRvIGVuY29kZSB3aXRoCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBlQ29udHJvbFJhdGU7IAotICAgIE9NWF9VMzIgblRhcmdldEJpdHJhdGU7ICAgICAgICAgICAgICAgICAKLX0gT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFOwotCi0KLS8qKiAKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIG1vdGlvbiB2ZWN0b3IgKE1WKSB0eXBlcyAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFIHsKLSAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yUGl4ZWwsCi0gICAgT01YX1ZpZGVvX01vdGlvblZlY3RvckhhbGZQZWwsCi0gICAgT01YX1ZpZGVvX01vdGlvblZlY3RvclF1YXJ0ZXJQZWwsCi0gICAgT01YX1ZpZGVvX01vdGlvblZlY3RvckVpZ2h0aFBlbCwKLSAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFOwotCi0KLS8qKgotICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyB0aGUgbnVtYmVyIG9mIG1vdGlvbiB2ZWN0b3JzIHVzZWQgYXMgd2VsbAotICogYXMgdGhlaXIgYWNjdXJhY3kuCi0gKiAKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWMgdmVyc2lvbiBpbmZvCi0gKiAgblBvcnRJbmRleCAgICAgICA6IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUFjY3VyYWN5ICAgICAgICA6IEVudW1lcmF0ZWQgTVYgYWNjdXJhY3kKLSAqICBiVW5yZXN0cmljdGVkTVZzIDogQWxsb3cgdW5yZXN0cmljdGVkIE1WcwotICogIGJGb3VyTVYgICAgICAgICAgOiBBbGxvdyB1c2Ugb2YgNCBNVnMKLSAqICBzWFNlYXJjaFJhbmdlICAgIDogU2VhcmNoIHJhbmdlIGluIGhvcml6b250YWwgZGlyZWN0aW9uIGZvciBNVnMKLSAqICBzWVNlYXJjaFJhbmdlICAgIDogU2VhcmNoIHJhbmdlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiBmb3IgTVZzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1ZJREVPX01PVElPTlZFQ1RPUlRZUEUgZUFjY3VyYWN5OwotICAgIE9NWF9CT09MIGJVbnJlc3RyaWN0ZWRNVnM7Ci0gICAgT01YX0JPT0wgYkZvdXJNVjsKLSAgICBPTVhfUzMyIHNYU2VhcmNoUmFuZ2U7Ci0gICAgT01YX1MzMiBzWVNlYXJjaFJhbmdlOwotfSBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRTsKLQotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtZXRob2RzIHRvIHVzZSBmb3IgSW50cmEgUmVmcmVzaCAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIHsKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQ3ljbGljLAotICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hBZGFwdGl2ZSwKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQm90aCwKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFOwotCi0KLS8qKgotICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBpbnRyYSByZWZyZXNoIG1vZGUgCi0gKiAKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVSZWZyZXNoTW9kZSA6IEN5Y2xpYywgQWRhcHRpdmUsIG9yIEJvdGgKLSAqICBuQWlyTUJzICAgICAgOiBOdW1iZXIgb2YgaW50cmEgbWFjcm9ibG9ja3MgdG8gcmVmcmVzaCBpbiBhIGZyYW1lIHdoZW4gCi0gKiAgICAgICAgICAgICAgICAgQUlSIGlzIGVuYWJsZWQKLSAqICBuQWlyUmVmICAgICAgOiBOdW1iZXIgb2YgdGltZXMgYSBtb3Rpb24gbWFya2VkIG1hY3JvYmxvY2sgaGFzIHRvIGJlICAKLSAqICAgICAgICAgICAgICAgICBpbnRyYSBjb2RlZAotICogIG5DaXJNQnMgICAgICA6IE51bWJlciBvZiBjb25zZWN1dGl2ZSBtYWNyb2Jsb2NrcyB0byBiZSBjb2RlZCBhcyAiaW50cmEiICAKLSAqICAgICAgICAgICAgICAgICB3aGVuIENJUiBpcyBlbmFibGVkCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1ZJREVPX0lOVFJBUkVGUkVTSFRZUEUgZVJlZnJlc2hNb2RlOwotICAgIE9NWF9VMzIgbkFpck1CczsKLSAgICBPTVhfVTMyIG5BaXJSZWY7Ci0gICAgT01YX1UzMiBuQ2lyTUJzOwotfSBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSBmb3IgZW5hYmxpbmcgdmFyaW91cyBlcnJvciBjb3JyZWN0aW9uIG1ldGhvZHMgZm9yIHZpZGVvIAotICogY29tcHJlc3Npb24uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKLSAqICBiRW5hYmxlSEVDICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGhlYWRlciBleHRlbnNpb24gY29kZXMgKEhFQykKLSAqICBiRW5hYmxlUmVzeW5jICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHJlc3luY2hyb25pemF0aW9uIG1hcmtlcnMKLSAqICBuUmVzeW5jaE1hcmtlclNwYWNpbmcgICA6IFJlc3luY2ggbWFya2VycyBpbnRlcnZhbCAoaW4gYml0cykgdG8gYmUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIGluIHRoZSBzdHJlYW0gCi0gKiAgYkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgOiBFbmFibGUvZGlzYWJsZSBkYXRhIHBhcnRpdGlvbmluZyAKLSAqICBiRW5hYmxlUlZMQyAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkVuYWJsZUhFQzsKLSAgICBPTVhfQk9PTCBiRW5hYmxlUmVzeW5jOwotICAgIE9NWF9VMzIgIG5SZXN5bmNoTWFya2VyU3BhY2luZzsKLSAgICBPTVhfQk9PTCBiRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKLSAgICBPTVhfQk9PTCBiRW5hYmxlUlZMQzsKLX0gT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEU7Ci0KLQotLyoqIAotICogQ29uZmlndXJhdGlvbiBvZiB2YXJpYWJsZSBibG9jay1zaXplIG1vdGlvbiBjb21wZW5zYXRpb24gKFZCU01DKSAKLSAqIAotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGIxNngxNiAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDE2eDE2Ci0gKiAgYjE2eDggICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggMTZ4OAotICogIGI4eDE2ICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDh4MTYKLSAqICBiOHg4ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDgKLSAqICBiOHg0ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDQKLSAqICBiNHg4ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA0eDgKLSAqICBiNHg0ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA0eDQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAotICAgIE9NWF9CT09MIGIxNngxNjsgCi0gICAgT01YX0JPT0wgYjE2eDg7IAotICAgIE9NWF9CT09MIGI4eDE2OwotICAgIE9NWF9CT09MIGI4eDg7Ci0gICAgT01YX0JPT0wgYjh4NDsKLSAgICBPTVhfQk9PTCBiNHg4OwotICAgIE9NWF9CT09MIGI0eDQ7Ci19IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEU7Ci0KLQotLyoqIAotICogSC4yNjMgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAotICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KLSAqCi0gKiBFTlVNUzoKLSAqICBCYXNlbGluZSAgICAgICAgICAgOiBCYXNlbGluZSBQcm9maWxlOiBILjI2MyAoVjEpLCBubyBvcHRpb25hbCBtb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICBIMzIwIENvZGluZyAgICAgICAgOiBILjMyMCBDb2RpbmcgRWZmaWNpZW5jeSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IAotICogICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGU6IEguMjYzKyAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEwuNAotICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBUCi0gKiAgQmFja3dhcmRDb21wYXRpYmxlIDogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBQcm9maWxlOiBILjI2MyAoVjEpLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBhbm5leCBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgSVNXVjIgICAgICAgICAgICAgIDogSW50ZXJhY3RpdmUgU3RyZWFtaW5nIFdpcmVsZXNzIFByb2ZpbGU6IEguMjYzKyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEsgYW5kIFQgICAgICAgICAgICAgICAgIAotICogIElTV1YzICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysrICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAoVjMpLCBpbmNsdWRlcyBwcm9maWxlIDMgYW5kIGFubmV4ZXMgViBhbmQgVy42LjMuOCAgIAotICogIEhpZ2hDb21wcmVzc2lvbiAgICA6IENvbnZlcnNhdGlvbmFsIEhpZ2ggQ29tcHJlc3Npb24gUHJvZmlsZTogSC4yNjMrKyAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZXMgMSAmIDIgYW5kIGFubmV4ZXMgRCBhbmQgVSAgIAotICogIEludGVybmV0ICAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybmV0IFByb2ZpbGU6IEguMjYzKysgKFYzKSwgIAotICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggSyAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgSW50ZXJsYWNlICAgICAgICAgIDogQ29udmVyc2F0aW9uYWwgSW50ZXJsYWNlIFByb2ZpbGU6IEguMjYzKysgKFYzKSwgIAotICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggVy42LjMuMTEgICAgICAgICAgICAgICAKLSAqICBIaWdoTGF0ZW5jeSAgICAgICAgOiBIaWdoIExhdGVuY3kgUHJvZmlsZTogSC4yNjMrKyAoVjMpLCBpbmNsdWRlcyAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA2IGFuZCBhbm5leGVzIE8uMSBhbmQgUC41ICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEUgewotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lICAgICAgICAgICAgPSAweDAxLCAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSDMyMENvZGluZyAgICAgICAgICA9IDB4MDIsICAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSAgPSAweDA0LCAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIgICAgICAgICAgICAgICA9IDB4MDgsICAgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjMgICAgICAgICAgICAgICA9IDB4MTAsICAgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uICAgICA9IDB4MjAsICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcm5ldCAgICAgICAgICAgID0gMHg0MCwgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcmxhY2UgICAgICAgICAgID0gMHg4MCwgICAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hMYXRlbmN5ICAgICAgICAgPSAweDEwMCwgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVNYXggICAgICAgICAgICAgICAgID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEU7Ci0KLQotLyoqIAotICogSC4yNjMgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgc2l6ZXMsIAotICogYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLgotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgewotICAgIE9NWF9WSURFT19IMjYzTGV2ZWwxMCAgPSAweDAxLCAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDIwICA9IDB4MDIsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDMwICA9IDB4MDQsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDQwICA9IDB4MDgsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDQ1ICA9IDB4MTAsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDUwICA9IDB4MjAsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDYwICA9IDB4NDAsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDcwICA9IDB4ODAsIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fSDI2M0xFVkVMVFlQRTsKLQotCi0vKiogCi0gKiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZS4gVGhlc2UgdmFsdWVzIHNob3VsZCBiZSBPUidkIHRvIHNpZ25hbCBhbGwgCi0gKiBwaWN0dXJlcyB0eXBlcyB3aGljaCBhcmUgYWxsb3dlZC4KLSAqCi0gKiBFTlVNUzoKLSAqICBHZW5lcmljIFBpY3R1cmUgVHlwZXM6ICAgICAgICAgIEksIFAgYW5kIEIKLSAqICBILjI2MyBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIFNJIGFuZCBTUAotICogIEguMjY0IFNwZWNpZmljIFBpY3R1cmUgVHlwZXM6ICAgRUkgYW5kIEVQCi0gKiAgTVBFRy00IFNwZWNpZmljIFBpY3R1cmUgVHlwZXM6ICBTCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fUElDVFVSRVRZUEUgewotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUkgICA9IDB4MDEsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlUCAgID0gMHgwMiwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVCICAgPSAweDA0LAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVNJICA9IDB4MDgsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlU1AgID0gMHgxMCwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVFSSAgPSAweDExLAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUVQICA9IDB4MTIsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlUyAgID0gMHgxNCwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19QSUNUVVJFVFlQRTsKLQotCi0vKiogCi0gKiBILjI2MyBQYXJhbXMgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5QRnJhbWVzICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQotICogIG5CRnJhbWVzICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQotICogIGVQcm9maWxlICAgICAgICAgICAgICAgICA6IEguMjYzIHByb2ZpbGUocykgdG8gdXNlCi0gKiAgZUxldmVsICAgICAgICAgICAgICAgICAgIDogSC4yNjMgbGV2ZWwocykgdG8gdXNlCi0gKiAgYlBMVVNQVFlQRUFsbG93ZWQgICAgICAgIDogSW5kaWNhdGluZyB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gdXNlIFBMVVNQVFlQRSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BlY2lmaWVkIGluIHRoZSAxOTk4IHZlcnNpb24gb2YgSC4yNjMpIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlIGN1c3RvbSBwaWN0dXJlIHNpemVzIG9yIGNsb2NrIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzIAotICogIG5BbGxvd2VkUGljdHVyZVR5cGVzICAgICA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqICBiRm9yY2VSb3VuZGluZ1R5cGVUb1plcm8gOiB2YWx1ZSBvZiB0aGUgUlRZUEUgYml0IChiaXQgNiBvZiBNUFBUWVBFKSBpcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgY29uc3RyYWluZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGNoYW5nZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCBmb3IgZWFjaCByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBpbiBlcnJvci1mcmVlIGNvbW11bmljYXRpb24KLSAqICBuUGljdHVyZUhlYWRlclJlcGV0aXRpb24gOiBTcGVjaWZpZXMgdGhlIGZyZXF1ZW5jeSBvZiBwaWN0dXJlIGhlYWRlciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBldGl0aW9uCi0gKiAgbkdPQkhlYWRlckludGVydmFsICAgICAgIDogU3BlY2lmaWVzIHRoZSBpbnRlcnZhbCBvZiBub24tZW1wdHkgR09CICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzIGluIHVuaXRzIG9mIEdPQnMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuUEZyYW1lczsKLSAgICBPTVhfVTMyIG5CRnJhbWVzOwotICAgIE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEUgZVByb2ZpbGU7Ci0JT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgZUxldmVsOwotICAgIE9NWF9CT09MIGJQTFVTUFRZUEVBbGxvd2VkOwotICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7Ci0gICAgT01YX0JPT0wgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvOwotICAgIE9NWF9VMzIgblBpY3R1cmVIZWFkZXJSZXBldGl0aW9uOwotICAgIE9NWF9VMzIgbkdPQkhlYWRlckludGVydmFsOwotfSBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEU7Ci0KLQotLyoqIAotICogTVBFRy0yIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKLSAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSA9IDAsICAvKio8IFNpbXBsZSBQcm9maWxlICovCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4sICAgICAgICAvKio8IE1haW4gUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGU0MjIsICAgICAgICAgLyoqPCA0OjI6MiBQcm9maWxlICovCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNOUiwgICAgICAgICAvKio8IFNOUiBQcm9maWxlICovCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNwYXRpYWwsICAgICAvKio8IFNwYXRpYWwgUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVIaWdoLCAgICAgICAgLyoqPCBIaWdoIFByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEU7Ci0KLQotLyoqIAotICogTVBFRy0yIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIAotICogc2l6ZXMsIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4gIE5vIG5lZWQgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEUgewotICAgIE9NWF9WSURFT19NUEVHMkxldmVsTEwgPSAwLCAgLyoqPCBMb3cgTGV2ZWwgKi8gCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCwgICAgICAvKio8IE1haW4gTGV2ZWwgKi8gCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxIMTQsICAgICAvKio8IEhpZ2ggMTQ0MCAqLyAKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbEhMLCAgICAgIC8qKjwgSGlnaCBMZXZlbCAqLyAgIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEU7Ci0KLQotLyoqIAotICogTVBFRy0yIHBhcmFtcyAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUEZyYW1lcyAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgbkJGcmFtZXMgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQotICogIGVQcm9maWxlICAgOiBNUEVHLTIgcHJvZmlsZShzKSB0byB1c2UKLSAqICBlTGV2ZWwgICAgIDogTVBFRy0yIGxldmVscyhzKSB0byB1c2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgCi0gICAgT01YX1UzMiBuUEZyYW1lczsgICAgICAgIAotICAgIE9NWF9VMzIgbkJGcmFtZXM7ICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLQlPTVhfVklERU9fTVBFRzJMRVZFTFRZUEUgZUxldmVsOyAgIAotfSBPTVhfVklERU9fUEFSQU1fTVBFRzJUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctNCBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCi0gKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgotICogCi0gKiBFTlVNUzoKLSAqICAtIFNpbXBsZSBQcm9maWxlLCBMZXZlbHMgMS0zCi0gKiAgLSBTaW1wbGUgU2NhbGFibGUgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gQ29yZSBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBNYWluIFByb2ZpbGUsIExldmVscyAyLTQKLSAqICAtIE4tYml0IFByb2ZpbGUsIExldmVsIDIKLSAqICAtIFNjYWxhYmxlIFRleHR1cmUgUHJvZmlsZSwgTGV2ZWwgMQotICogIC0gU2ltcGxlIEZhY2UgQW5pbWF0aW9uIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIFNpbXBsZSBGYWNlIGFuZCBCb2R5IEFuaW1hdGlvbiAoRkJBKSBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBCYXNpYyBBbmltYXRlZCBUZXh0dXJlIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIEh5YnJpZCBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBBZHZhbmNlZCBSZWFsIFRpbWUgU2ltcGxlIFByb2ZpbGVzLCBMZXZlbHMgMS00Ci0gKiAgLSBDb3JlIFNjYWxhYmxlIFByb2ZpbGUsIExldmVscyAxLTMKLSAqICAtIEFkdmFuY2VkIENvZGluZyBFZmZpY2llbmN5IFByb2ZpbGUsIExldmVscyAxLTQKLSAqICAtIEFkdmFuY2VkIENvcmUgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gQWR2YW5jZWQgU2NhbGFibGUgVGV4dHVyZSwgTGV2ZWxzIDItMwotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgewotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgID0gMHgwMSwgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSAgID0gMHgwMiwgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUgICAgICAgICAgICAgPSAweDA0LCAgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4gICAgICAgICAgICAgPSAweDA4LCAgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTmJpdCAgICAgICAgICAgICA9IDB4MTAsICAgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2NhbGFibGVUZXh0dXJlICA9IDB4MjAsICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UgICAgICAgPSAweDQwLCAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZCQSAgICAgICAgPSAweDgwLCAgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkICAgID0gMHgxMDAsICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkICAgICAgICAgICA9IDB4MjAwLCAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lID0gMHg0MDAsICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlICAgICA9IDB4ODAwLCAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZyAgID0gMHgxMDAwLCAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlICAgICA9IDB4MjAwMCwgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSA9IDB4NDAwMCwKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgICA9IDB4ODAwMCwKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYXggICAgICAgICAgICAgID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctNCBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSAKLSAqIHNpemVzLCBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFIHsKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgID0gMHgwMSwgICAvKio8IExldmVsIDAgKi8gICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDBiID0gMHgwMiwgICAvKio8IExldmVsIDBiICovICAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICA9IDB4MDQsICAgLyoqPCBMZXZlbCAxICovIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgPSAweDA4LCAgIC8qKjwgTGV2ZWwgMiAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgID0gMHgxMCwgICAvKio8IExldmVsIDMgKi8gCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICA9IDB4MjAsICAgLyoqPCBMZXZlbCA0ICovICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDRhID0gMHg0MCwgICAvKio8IExldmVsIDRhICovICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDUgID0gMHg4MCwgICAvKio8IExldmVsIDUgKi8gIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU7Ci0KLQotLyoqIAotICogTVBFRy00IGNvbmZpZ3VyYXRpb24uICBUaGlzIHN0cnVjdHVyZSBoYW5kbGVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotICogd2hpY2ggYXJlIHNwZWNpZmljIHRvIE1QRUc0IGFsZ29yaXRobXMKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuU2xpY2VIZWFkZXJTcGFjaW5nICA6IE51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZXR3ZWVuIHNsaWNlIGhlYWRlciAoSDI2MysgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBBbm5leCBLKS4gUHV0IHplcm8gaWYgbm90IHVzZWQKLSAqICBiU1ZIICAgICAgICAgICAgICAgICA6IEVuYWJsZSBTaG9ydCBWaWRlbyBIZWFkZXIgbW9kZQotICogIGJHb3YgICAgICAgICAgICAgICAgIDogRmxhZyB0byBlbmFibGUgR09WCi0gKiAgblBGcmFtZXMgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUgKGFsc28gY2FsbGVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgR09WIHBlcmlvZCkKLSAqICBuQkZyYW1lcyAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQotICogIG5JRENWTENUaHJlc2hvbGQgICAgIDogVmFsdWUgb2YgaW50cmEgREMgVkxDIHRocmVzaG9sZAotICogIGJBQ1ByZWQgICAgICAgICAgICAgIDogRmxhZyB0byB1c2UgYWMgcHJlZGljdGlvbgotICogIG5NYXhQYWNrZXRTaXplICAgICAgIDogTWF4aW11bSBzaXplIG9mIHBhY2tldCBpbiBieXRlcy4KLSAqICBuVGltZUluY1JlcyAgICAgICAgICA6IFVzZWQgdG8gcGFzcyBWT1AgdGltZSBpbmNyZW1lbnQgcmVzb2x1dGlvbiBmb3IgTVBFRzQuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIE1QRUc0IHN0YW5kYXJkLgotICogIGVQcm9maWxlICAgICAgICAgICAgIDogTVBFRy00IHByb2ZpbGUocykgdG8gdXNlLgotICogIGVMZXZlbCAgICAgICAgICAgICAgIDogTVBFRy00IGxldmVsKHMpIHRvIHVzZS4KLSAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSBiaXRzdHJlYW0KLSAqICBuSGVhZGVyRXh0ZW5zaW9uICAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHZpZGVvIHBhY2tldAotICogICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyB3aXRoaW4gYSBWT1AKLSAqICBiUmV2ZXJzaWJsZVZMQyAgICAgICA6IFNwZWNpZmllcyB3aGV0aGVyIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIGNvZGluZyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluIHVzZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuU2xpY2VIZWFkZXJTcGFjaW5nOwotICAgIE9NWF9CT09MIGJTVkg7Ci0gICAgT01YX0JPT0wgYkdvdjsKLSAgICBPTVhfVTMyIG5QRnJhbWVzOwotICAgIE9NWF9VMzIgbkJGcmFtZXM7Ci0gICAgT01YX1UzMiBuSURDVkxDVGhyZXNob2xkOwotICAgIE9NWF9CT09MIGJBQ1ByZWQ7Ci0gICAgT01YX1UzMiBuTWF4UGFja2V0U2l6ZTsKLSAgICBPTVhfVTMyIG5UaW1lSW5jUmVzOwotICAgIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIGVQcm9maWxlOwotICAgIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSBlTGV2ZWw7Ci0gICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsKLSAgICBPTVhfVTMyIG5IZWFkZXJFeHRlbnNpb247Ci0gICAgT01YX0JPT0wgYlJldmVyc2libGVWTEM7Ci19IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEU7Ci0KLQotLyoqIAotICogV01WIFZlcnNpb25zIAotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEUgewotICAgIE9NWF9WSURFT19XTVZGb3JtYXRVbnVzZWQgPSAweDAxLCAgIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCi0gICAgT01YX1ZJREVPX1dNVkZvcm1hdDcgICAgICA9IDB4MDIsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA3ICovCi0gICAgT01YX1ZJREVPX1dNVkZvcm1hdDggICAgICA9IDB4MDQsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA4ICovCi0gICAgT01YX1ZJREVPX1dNVkZvcm1hdDkgICAgICA9IDB4MDgsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA5ICovCi0gICAgT01YX1ZJREVPX1dNRkZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fV01GRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fV01WRm9ybWF0TWF4ICAgID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fV01WRk9STUFUVFlQRTsKLQotCi0vKiogCi0gKiBXTVYgUGFyYW1zIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGb3JtYXQgICAgOiBWZXJzaW9uIG9mIFdNViBzdHJlYW0gLyBkYXRhCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19XTVZGT1JNQVRUWVBFIGVGb3JtYXQ7Ci19IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFOwotCi0KLS8qKiAKLSAqIFJlYWwgVmlkZW8gVmVyc2lvbiAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19SVkZPUk1BVFRZUEUgewotICAgIE9NWF9WSURFT19SVkZvcm1hdFVudXNlZCA9IDAsIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCi0gICAgT01YX1ZJREVPX1JWRm9ybWF0OCwgICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIGZvcm1hdCA4ICovCi0gICAgT01YX1ZJREVPX1JWRm9ybWF0OSwgICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIGZvcm1hdCA5ICovCi0gICAgT01YX1ZJREVPX1JWRm9ybWF0RzIsICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIEZvcm1hdCBHMiAqLwotICAgIE9NWF9WSURFT19SVkZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fUlZGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19SVkZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX1JWRk9STUFUVFlQRTsKLQotCi0vKiogCi0gKiBSZWFsIFZpZGVvIFBhcmFtcyAKLSAqCi0gKiBTVFVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiAgblBvcnRJbmRleCAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRm9ybWF0ICAgICAgICAgICAgOiBWZXJzaW9uIG9mIFJWIHN0cmVhbSAvIGRhdGEKLSAqICBuQml0c1BlclBpeGVsICAgICAgOiBCaXRzIHBlciBwaXhlbCBjb2RlZCBpbiB0aGUgZnJhbWUKLSAqICBuUGFkZGVkV2lkdGggICAgICAgOiBQYWRkZWQgd2lkdGggaW4gcGl4ZWwgb2YgYSB2aWRlbyBmcmFtZQotICogIG5QYWRkZWRIZWlnaHQgICAgICA6IFBhZGRlZCBIZWlnaHQgaW4gcGl4ZWxzIG9mIGEgdmlkZW8gZnJhbWUKLSAqICBuRnJhbWVSYXRlICAgICAgICAgOiBSYXRlIG9mIHZpZGVvIGluIGZyYW1lcyBwZXIgc2Vjb25kCi0gKiAgbkJpdHN0cmVhbUZsYWdzICAgIDogRmxhZ3Mgd2hpY2ggaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpdHN0cmVhbQotICogIG5CaXRzdHJlYW1WZXJzaW9uICA6IEJpdHN0cmVhbSB2ZXJzaW9uCi0gKiAgbk1heEVuY29kZUZyYW1lU2l6ZTogTWF4IGVuY29kZWQgZnJhbWUgc2l6ZQotICogIGJFbmFibGVQb3N0RmlsdGVyICA6IFR1cm4gb24vb2ZmIHBvc3QgZmlsdGVyCi0gKiAgYkVuYWJsZVRlbXBvcmFsSW50ZXJwb2xhdGlvbiA6IFR1cm4gb24vb2ZmIHRlbXBvcmFsIGludGVycG9sYXRpb24KLSAqICBiRW5hYmxlTGF0ZW5jeU1vZGUgOiBXaGVuIGVuYWJsZWQsIHRoZSBkZWNvZGVyIGRvZXMgbm90IGRpc3BsYXkgYSBkZWNvZGVkIAotICogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIHVudGlsIGl0IGhhcyBkZXRlY3RlZCB0aGF0IG5vIGVuaGFuY2VtZW50IGxheWVyIAotICogIAkJCQkJIGZyYW1lcyBvciBkZXBlbmRlbnQgQiBmcmFtZXMgd2lsbCBiZSBjb21pbmcuIFRoaXMgCi0gKiAgCQkJCQkgZGV0ZWN0aW9uIHVzdWFsbHkgb2NjdXJzIHdoZW4gYSBzdWJzZXF1ZW50IG5vbi1CIAotICogIAkJCQkJIGZyYW1lIGlzIGVuY291bnRlcmVkIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUlZUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1ZJREVPX1JWRk9STUFUVFlQRSBlRm9ybWF0OwotICAgIE9NWF9VMTYgbkJpdHNQZXJQaXhlbDsKLSAgICBPTVhfVTE2IG5QYWRkZWRXaWR0aDsKLSAgICBPTVhfVTE2IG5QYWRkZWRIZWlnaHQ7Ci0gICAgT01YX1UzMiBuRnJhbWVSYXRlOwotICAgIE9NWF9VMzIgbkJpdHN0cmVhbUZsYWdzOwotICAgIE9NWF9VMzIgbkJpdHN0cmVhbVZlcnNpb247Ci0gICAgT01YX1UzMiBuTWF4RW5jb2RlRnJhbWVTaXplOwotICAgIE9NWF9CT09MIGJFbmFibGVQb3N0RmlsdGVyOwotICAgIE9NWF9CT09MIGJFbmFibGVUZW1wb3JhbEludGVycG9sYXRpb247Ci0gICAgT01YX0JPT0wgYkVuYWJsZUxhdGVuY3lNb2RlOwotfSBPTVhfVklERU9fUEFSQU1fUlZUWVBFOwotCi0KLS8qKiAKLSAqIEFWQyBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCi0gKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIHsKLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lID0gMHgwMSwgICAvKio8IEJhc2VsaW5lIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4gICAgID0gMHgwMiwgICAvKio8IE1haW4gcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQgPSAweDA0LCAgIC8qKjwgRXh0ZW5kZWQgcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCAgICAgPSAweDA4LCAgIC8qKjwgSGlnaCBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTAgICA9IDB4MTAsICAgLyoqPCBIaWdoIDEwIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0MjIgID0gMHgyMCwgICAvKio8IEhpZ2ggNDoyOjIgcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQ0NCAgPSAweDQwLCAgIC8qKjwgSGlnaCA0OjQ6NCBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlTWF4ICAgICAgPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFOwotCi0KLS8qKiAKLSAqIEFWQyBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSBzaXplcywgCi0gKiBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSB7Ci0gICAgT01YX1ZJREVPX0FWQ0xldmVsMSAgID0gMHgwMSwgICAgIC8qKjwgTGV2ZWwgMSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDFiICA9IDB4MDIsICAgICAvKio8IExldmVsIDFiICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMTEgID0gMHgwNCwgICAgIC8qKjwgTGV2ZWwgMS4xICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMTIgID0gMHgwOCwgICAgIC8qKjwgTGV2ZWwgMS4yICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMTMgID0gMHgxMCwgICAgIC8qKjwgTGV2ZWwgMS4zICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMiAgID0gMHgyMCwgICAgIC8qKjwgTGV2ZWwgMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDIxICA9IDB4NDAsICAgICAvKio8IExldmVsIDIuMSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDIyICA9IDB4ODAsICAgICAvKio8IExldmVsIDIuMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDMgICA9IDB4MTAwLCAgICAvKio8IExldmVsIDMgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwzMSAgPSAweDIwMCwgICAgLyoqPCBMZXZlbCAzLjEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwzMiAgPSAweDQwMCwgICAgLyoqPCBMZXZlbCAzLjIgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWw0ICAgPSAweDgwMCwgICAgLyoqPCBMZXZlbCA0ICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsNDEgID0gMHgxMDAwLCAgIC8qKjwgTGV2ZWwgNC4xICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsNDIgID0gMHgyMDAwLCAgIC8qKjwgTGV2ZWwgNC4yICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsNSAgID0gMHg0MDAwLCAgIC8qKjwgTGV2ZWwgNSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDUxICA9IDB4ODAwMCwgICAvKio8IExldmVsIDUuMSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fQVZDTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fQVZDTEVWRUxUWVBFOwotCi0KLS8qKiAKLSAqIEFWQyBsb29wIGZpbHRlciBtb2RlcyAKLSAqCi0gKiBPTVhfVklERU9fQVZDTG9vcEZpbHRlckVuYWJsZSAgICAgICAgICAgICAgIDogRW5hYmxlCi0gKiBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUgICAgICAgICAgICAgIDogRGlzYWJsZQotICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSA6IERpc2FibGVkIG9uIHNsaWNlIGJvdW5kYXJpZXMKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMT09QRklMVEVSVFlQRSB7Ci0gICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUgPSAwLAotICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZSwKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGVTbGljZUJvdW5kYXJ5LAotICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFOwotCi0KLS8qKiAKLSAqIEFWQyBwYXJhbXMgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblNsaWNlSGVhZGVyU3BhY2luZyAgICAgICA6IE51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZXR3ZWVuIHNsaWNlIGhlYWRlciwgcHV0ICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyBpZiBub3QgdXNlZAotICogIG5QRnJhbWVzICAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgYlVzZUhhZGFtYXJkICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIEhhZGFtYXJkIHRyYW5zZm9ybQotICogIG5SZWZGcmFtZXMgICAgICAgICAgICAgICAgOiBNYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgdG8gdXNlIGZvciBpbnRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gc2VhcmNoICgxLTE2KQotICogIG5SZWZJZHhUcmFpbGluZyAgICAgICAgICAgOiBQaWMgcGFyYW0gc2V0IHJlZiBmcmFtZSBpbmRleCAoaW5kZXggaW50byByZWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYnVmZmVyIG9mIHRyYWlsaW5nIGZyYW1lcyBsaXN0KSwgQiBmcmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0Ci0gKiAgblJlZklkeEZvcndhcmQgICAgICAgICAgICA6IFBpYyBwYXJhbSBzZXQgcmVmIGZyYW1lIGluZGV4IChpbmRleCBpbnRvIHJlZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBidWZmZXIgb2YgZm9yd2FyZCBmcmFtZXMgbGlzdCksIEIgZnJhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICogIGJFbmFibGVVRVAgICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSB1bmVxdWFsIGVycm9yIHByb3RlY3Rpb24uIFRoaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgdmFsaWQgb2YgZGF0YSBwYXJ0aXRpb25pbmcgaXMgZW5hYmxlZC4KLSAqICBiRW5hYmxlRk1PICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgZmxleGlibGUgbWFjcm9ibG9jayBvcmRlcmluZwotICogIGJFbmFibGVBU08gICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBhcmJpdHJhcnkgc2xpY2Ugb3JkZXJpbmcKLSAqICBiRW5hYmxlUlMgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc2VuZGluZyBvZiByZWR1bmRhbnQgc2xpY2VzCi0gKiAgZVByb2ZpbGUgICAgICAgICAgICAgICAgICA6IEFWQyBwcm9maWxlKHMpIHRvIHVzZQotICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICAgOiBBVkMgbGV2ZWwocykgdG8gdXNlCi0gKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgICAgICA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiAgYkZyYW1lTUJzT25seSAgICAgICAgICAgICA6IHNwZWNpZmllcyB0aGF0IGV2ZXJ5IGNvZGVkIHBpY3R1cmUgb2YgdGhlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCB2aWRlbyBzZXF1ZW5jZSBpcyBhIGNvZGVkIGZyYW1lIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIG9ubHkgZnJhbWUgbWFjcm9ibG9ja3MKLSAqICBiTUJBRkYgICAgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc3dpdGNoaW5nIGJldHdlZW4gZnJhbWUgYW5kIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBtYWNyb2Jsb2NrcyB3aXRoaW4gYSBwaWN0dXJlCi0gKiAgYkVudHJvcHlDb2RpbmdDQUJBQyAgICAgICA6IEVudHJvcHkgZGVjb2RpbmcgbWV0aG9kIHRvIGJlIGFwcGxpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4IGVsZW1lbnRzIGZvciB3aGljaCB0d28gZGVzY3JpcHRvcnMgYXBwZWFyIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3ludGF4IHRhYmxlcwotICogIGJXZWlnaHRlZFBQcmVkaWN0aW9uICAgICAgOiBFbmFibGUvZGlzYWJsZSB3ZWlnaHRlZCBwcmVkaWN0aW9uIHNoYWxsIG5vdCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXBwbGllZCB0byBQIGFuZCBTUCBzbGljZXMKLSAqICBuV2VpZ2h0ZWRCaXByZWRpY2l0b25Nb2RlIDogRGVmYXVsdCB3ZWlnaHRlZCBwcmVkaWN0aW9uIGlzIGFwcGxpZWQgdG8gQiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIAotICogIGJjb25zdElwcmVkICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBpbnRyYSBwcmVkaWN0aW9uCi0gKiAgYkRpcmVjdDh4OEluZmVyZW5jZSAgICAgICA6IFNwZWNpZmllcyB0aGUgbWV0aG9kIHVzZWQgaW4gdGhlIGRlcml2YXRpb24gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgZm9yIGx1bWEgbW90aW9uIHZlY3RvcnMgZm9yIEJfU2tpcCwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfRGlyZWN0XzE2eDE2IGFuZCBCX0RpcmVjdF84eDggYXMgc3BlY2lmaWVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzdWJjbGF1c2UgOC40LjEuMiBvZiB0aGUgQVZDIHNwZWMgCi0gKiAgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbCAgICA6IEZsYWcgaW5kaWNhdGluZyBzcGF0aWFsIG9yIHRlbXBvcmFsIGRpcmVjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHVzZWQgaW4gQiBzbGljZSBjb2RpbmcgKHJlbGF0ZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXJlY3Q4eDhJbmZlcmVuY2UpIC4gU3BhdGlhbCBkaXJlY3QgbW9kZSBpcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBjb21tb24gYW5kIHNob3VsZCBiZSB0aGUgZGVmYXVsdC4KLSAqICBuQ2FiYWNJbml0SWR4ICAgICAgICAgICAgIDogSW5kZXggdXNlZCB0byBpbml0IENBQkFDIGNvbnRleHRzCi0gKiAgZUxvb3BGaWx0ZXJNb2RlICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGxvb3AgZmlsdGVyCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5TbGljZUhlYWRlclNwYWNpbmc7ICAKLSAgICBPTVhfVTMyIG5QRnJhbWVzOyAgICAgCi0gICAgT01YX1UzMiBuQkZyYW1lczsgICAgIAotICAgIE9NWF9CT09MIGJVc2VIYWRhbWFyZDsKLSAgICBPTVhfVTMyIG5SZWZGcmFtZXM7ICAKLQlPTVhfVTMyIG5SZWZJZHgxMEFjdGl2ZU1pbnVzMTsKLQlPTVhfVTMyIG5SZWZJZHgxMUFjdGl2ZU1pbnVzMTsKLSAgICBPTVhfQk9PTCBiRW5hYmxlVUVQOyAgCi0gICAgT01YX0JPT0wgYkVuYWJsZUZNTzsgIAotICAgIE9NWF9CT09MIGJFbmFibGVBU087ICAKLSAgICBPTVhfQk9PTCBiRW5hYmxlUlM7ICAgCi0gICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIGVQcm9maWxlOwotCU9NWF9WSURFT19BVkNMRVZFTFRZUEUgZUxldmVsOyAKLSAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOyAgCi0JT01YX0JPT0wgYkZyYW1lTUJzT25seTsgICAgICAgIAkJCQkJCQkJCQotICAgIE9NWF9CT09MIGJNQkFGRjsgICAgICAgICAgICAgICAKLSAgICBPTVhfQk9PTCBiRW50cm9weUNvZGluZ0NBQkFDOyAgCi0gICAgT01YX0JPT0wgYldlaWdodGVkUFByZWRpY3Rpb247IAotICAgIE9NWF9VMzIgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZTsgCi0gICAgT01YX0JPT0wgYmNvbnN0SXByZWQgOwotICAgIE9NWF9CT09MIGJEaXJlY3Q4eDhJbmZlcmVuY2U7ICAKLQlPTVhfQk9PTCBiRGlyZWN0U3BhdGlhbFRlbXBvcmFsOwotCU9NWF9VMzIgbkNhYmFjSW5pdElkYzsKLQlPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgZUxvb3BGaWx0ZXJNb2RlOwotfSBPTVhfVklERU9fUEFSQU1fQVZDVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgewotICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIAotICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIAotICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIAotICAgT01YX1UzMiBlUHJvZmlsZTsgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFLCBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIGRlcGVuZGluZyBvbiBjb250ZXh0ICovCi0gICBPTVhfVTMyIGVMZXZlbDsgICAgICAgIC8qKjwgdHlwZSBpcyBPTVhfVklERU9fQVZDTEVWRUxUWVBFLCBPTVhfVklERU9fSDI2M0xFVkVMVFlQRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBkZXBlbmRpbmcgb24gY29udGV4dCAqLwotICAgT01YX1UzMiBuUHJvZmlsZUluZGV4OyAvKio8IFVzZWQgdG8gcXVlcnkgZm9yIGluZGl2aWR1YWwgcHJvZmlsZSBzdXBwb3J0IGluZm9ybWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYWxsIG90aGVyIGluZGljZXMgdGhpcyBwYXJhbWV0ZXIgaXMgdG8gYmUgaWdub3JlZC4gKi8KLX0gT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEU7Ci0KLS8qKiAKLSAqIFN0cnVjdHVyZSBmb3IgZHluYW1pY2FsbHkgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KLSAqICBuUG9ydEluZGV4ICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvCi0gKiAgbkVuY29kZUJpdHJhdGUgOiBUYXJnZXQgYXZlcmFnZSBiaXRyYXRlIHRvIGJlIGdlbmVyYXRlZCBpbiBicHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuRW5jb2RlQml0cmF0ZTsgICAgICAgICAgICAgICAgIAotfSBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFOwotCi0vKiogCi0gKiBEZWZpbmVzIEVuY29kZXIgRnJhbWUgUmF0ZSBzZXR0aW5nCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIHhFbmNvZGVGcmFtZXJhdGUgOiBFbmNvZGluZyBmcmFtZXJhdGUgcmVwcmVzZW50ZWQgaW4gUTE2IGZvcm1hdAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIHhFbmNvZGVGcmFtZXJhdGU7IC8qIFExNiBmb3JtYXQgKi8KLX0gT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBJbnRyYVJlZnJlc2hWT1A7Ci19IE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuRXJyTWFwU2l6ZTsgICAgICAgICAgIC8qIFNpemUgb2YgdGhlIEVycm9yIE1hcCBpbiBieXRlcyAqLwotICAgIE9NWF9VOCAgRXJyTWFwWzFdOyAgICAgICAgICAgICAvKiBFcnJvciBtYXAgaGludCAqLwotfSBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsKLX0gT01YX0NPTkZJR19NQkVSUk9SUkVQT1JUSU5HVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbk1hY3JvYmxvY2tzOwotfSBPTVhfUEFSQU1fTUFDUk9CTE9DS1NUWVBFOwotCi0vKiogCi0gKiBBVkMgU2xpY2UgTW9kZSBtb2RlcyAKLSAqCi0gKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQgICA6IE5vcm1hbCBmcmFtZSBlbmNvZGluZywgb25lIHNsaWNlIHBlciBmcmFtZQotICogT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNNQlNsaWNlICAgOiBOQUwgbW9kZSwgbnVtYmVyIG9mIE1CcyBwZXIgZnJhbWUKLSAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDQnl0ZVNsaWNlIDogTkFMIG1vZGUsIG51bWJlciBvZiBieXRlcyBwZXIgZnJhbWUKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFIHsKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQgPSAwLAotICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTUJTbGljZSwKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0J5dGVTbGljZSwKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX0FWQ1NMSUNFTU9ERVRZUEU7Ci0KLS8qKiAKLSAqIEFWQyBGTU8gU2xpY2UgTW9kZSBQYXJhbXMgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbk51bVNsaWNlR3JvdXBzIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCi0gKiAgblNsaWNlR3JvdXBNYXBUeXBlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlIGdyb3VwcwotICogIGVTbGljZU1vZGUgOiBTcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc2xpY2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1PIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VOCBuTnVtU2xpY2VHcm91cHM7Ci0gICAgT01YX1U4IG5TbGljZUdyb3VwTWFwVHlwZTsKLSAgICBPTVhfVklERU9fQVZDU0xJQ0VNT0RFVFlQRSBlU2xpY2VNb2RlOwotfSBPTVhfVklERU9fUEFSQU1fQVZDU0xJQ0VGTU87Ci0KLS8qKiAKLSAqIEFWQyBJRFIgUGVyaW9kIENvbmZpZ3MKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuSURSUGVyaW9kIDogU3BlY2lmaWVzIHBlcmlvZGljaXR5IG9mIElEUiBmcmFtZXMKLSAqICBuUEZyYW1lcyA6IFNwZWNpZmllcyBpbnRlcm5hbCBvZiBjb2RpbmcgSW50cmEgZnJhbWVzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QgewotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuSURSUGVyaW9kOwotICAgIE9NWF9VMzIgblBGcmFtZXM7Ci19IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0Q7Ci0KLS8qKiAKLSAqIEFWQyBOQUwgU2l6ZSBDb25maWdzCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbk5hbHVCeXRlcyA6IFNwZWNpZmllcyB0aGUgTkFMIHVuaXQgc2l6ZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX05BTFNJWkUgewotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuTmFsdUJ5dGVzOwotfSBPTVhfVklERU9fQ09ORklHX05BTFNJWkU7Ci0KLS8qKiBAfSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmphdmEKaW5kZXggMTM5ZmYwMS4uNGU2YzE3NCAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmphdmEKQEAgLTExNTUsNiArMTE1NSwyNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCB0aGUgTWVkaWFQbGF5ZXIgdG8gc3RhcnQgd2hlbiB0aGlzIE1lZGlhUGxheWVyIGZpbmlzaGVzIHBsYXliYWNrCisgICAgICogKGkuZS4gcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0pLgorICAgICAqIFRoZSBtZWRpYSBmcmFtZXdvcmsgd2lsbCBhdHRlbXB0IHRvIHRyYW5zaXRpb24gZnJvbSB0aGlzIHBsYXllciB0bworICAgICAqIHRoZSBuZXh0IGFzIHNlYW1sZXNzbHkgYXMgcG9zc2libGUuIFRoZSBuZXh0IHBsYXllciBjYW4gYmUgc2V0IGF0CisgICAgICogYW55IHRpbWUgYmVmb3JlIGNvbXBsZXRpb24uIFRoZSBuZXh0IHBsYXllciBtdXN0IGJlIHByZXBhcmVkIGJ5IHRoZQorICAgICAqIGFwcCwgYW5kIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGNhbGwgc3RhcnQoKSBvbiBpdC4KKyAgICAgKiBUaGUgbmV4dCBNZWRpYVBsYXllciBtdXN0IGJlIGRpZmZlcmVudCBmcm9tICd0aGlzJy4gQW4gZXhjZXB0aW9uCisgICAgICogd2lsbCBiZSB0aHJvd24gaWYgbmV4dCA9PSB0aGlzLgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgY2FsbCBzZXROZXh0TWVkaWFQbGF5ZXIobnVsbCkgdG8gaW5kaWNhdGUgbm8KKyAgICAgKiBuZXh0IHBsYXllciBzaG91bGQgYmUgc3RhcnRlZCBhdCB0aGUgZW5kIG9mIHBsYXliYWNrLgorICAgICAqIElmIHRoZSBjdXJyZW50IHBsYXllciBpcyBsb29waW5nLCBpdCB3aWxsIGtlZXAgbG9vcGluZyBhbmQgdGhlIG5leHQKKyAgICAgKiBwbGF5ZXIgd2lsbCBub3QgYmUgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXh0IHRoZSBwbGF5ZXIgdG8gc3RhcnQgYWZ0ZXIgdGhpcyBvbmUgY29tcGxldGVzIHBsYXliYWNrLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgc2V0TmV4dE1lZGlhUGxheWVyKE1lZGlhUGxheWVyIG5leHQpOworCisgICAgLyoqCiAgICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1lZGlhUGxheWVyIG9iamVjdC4KICAgICAgKiBJdCBpcyBjb25zaWRlcmVkIGdvb2QgcHJhY3RpY2UgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHlvdSdyZQogICAgICAqIGRvbmUgdXNpbmcgdGhlIE1lZGlhUGxheWVyLiBJbiBwYXJ0aWN1bGFyLCB3aGVuZXZlciBhbiBBY3Rpdml0eQpAQCAtMTY1OSw2ICsxNjc5LDEwIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBpZiAod2hhdCA9PSBNRURJQV9JTkZPICYmIGFyZzEgPT0gTUVESUFfSU5GT19TVEFSVEVEX0FTX05FWFQpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgYWNxdWlyZXMgdGhlIHdha2Vsb2NrIGlmIG5lZWRlZCwgYW5kIHNldHMgdGhlIGNsaWVudCBzaWRlIHN0YXRlCisgICAgICAgICAgICBtcC5zdGFydCgpOworICAgICAgICB9CiAgICAgICAgIGlmIChtcC5tRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1wLm1FdmVudEhhbmRsZXIub2J0YWluTWVzc2FnZSh3aGF0LCBhcmcxLCBhcmcyLCBvYmopOwogICAgICAgICAgICAgbXAubUV2ZW50SGFuZGxlci5zZW5kTWVzc2FnZShtKTsKQEAgLTE5MTMsNiArMTkzNywxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElBX0lORk9fVU5LTk9XTiA9IDE7CiAKKyAgICAvKiogVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgorICAgICAqIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2suCisgICAgICogQHNlZSBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uSW5mb0xpc3RlbmVyCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9JTkZPX1NUQVJURURfQVNfTkVYVCA9IDI7CisKICAgICAvKiogVGhlIHZpZGVvIGlzIHRvbyBjb21wbGV4IGZvciB0aGUgZGVjb2RlcjogaXQgY2FuJ3QgZGVjb2RlIGZyYW1lcyBmYXN0CiAgICAgICogIGVub3VnaC4gUG9zc2libHkgb25seSB0aGUgYXVkaW8gcGxheXMgZmluZSBhdCB0aGlzIHN0YWdlLgogICAgICAqIEBzZWUgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkluZm9MaXN0ZW5lcgpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL0FuZHJvaWQubWsgYi9tZWRpYS9qbmkvQW5kcm9pZC5tawppbmRleCAwNzBkMmQ5Li5hOTgyNzVhIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvQW5kcm9pZC5taworKysgYi9tZWRpYS9qbmkvQW5kcm9pZC5tawpAQCAtNDcsNyArNDcsNyBAQAogICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbXRwIFwKLSAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICQoUFZfSU5DTFVERVMpIFwKICAgICAkKEpOSV9IX0lOQ0xVREUpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgY29yZWNnIGdyYXBoaWNzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCmluZGV4IGY1NzJmNzEuLjc0NWUyNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKQEAgLTc5NSw2ICs3OTUsMzMgQEAKICAgICBwcm9jZXNzX21lZGlhX3BsYXllcl9jYWxsKGVudiwgdGhpeiwgbXAtPmdldFBhcmFtZXRlcihrZXksIHJlcGx5KSwgTlVMTCwgTlVMTCApOwogfQogCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllcl9zZXROZXh0TWVkaWFQbGF5ZXIoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhX3BsYXllcikKK3sKKyAgICBBTE9HVigic2V0TmV4dE1lZGlhUGxheWVyIik7CisgICAgc3A8TWVkaWFQbGF5ZXI+IHRoaXNwbGF5ZXIgPSBnZXRNZWRpYVBsYXllcihlbnYsIHRoaXopOworICAgIGlmICh0aGlzcGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsICJUaGlzIHBsYXllciBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxNZWRpYVBsYXllcj4gbmV4dHBsYXllciA9IChqYXZhX3BsYXllciA9PSBOVUxMKSA/IE5VTEwgOiBnZXRNZWRpYVBsYXllcihlbnYsIGphdmFfcGxheWVyKTsKKyAgICBpZiAobmV4dHBsYXllciA9PSBOVUxMICYmIGphdmFfcGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsICJUaGF0IHBsYXllciBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChuZXh0cGxheWVyID09IHRoaXNwbGF5ZXIpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJOZXh0IHBsYXllciBjYW4ndCBiZSBzZWxmIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gdGllIHRoZSB0d28gcGxheWVycyB0b2dldGhlcgorICAgIHByb2Nlc3NfbWVkaWFfcGxheWVyX2NhbGwoCisgICAgICAgICAgICBlbnYsIHRoaXosIHRoaXNwbGF5ZXItPnNldE5leHRNZWRpYVBsYXllcihuZXh0cGxheWVyKSwKKyAgICAgICAgICAgICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJzZXROZXh0TWVkaWFQbGF5ZXIgZmFpbGVkLiIgKTsKKyAgICA7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewpAQCAtODQwLDYgKzg2Nyw3IEBACiAgICAgeyJzZXRQYXJhbWV0ZXIiLCAgICAgICAgIihJTGFuZHJvaWQvb3MvUGFyY2VsOylaIiwgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX3NldFBhcmFtZXRlcn0sCiAgICAgeyJnZXRQYXJhbWV0ZXIiLCAgICAgICAgIihJTGFuZHJvaWQvb3MvUGFyY2VsOylWIiwgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX2dldFBhcmFtZXRlcn0sCiAgICAgeyJuYXRpdmVfc2V0UmV0cmFuc21pdEVuZHBvaW50IiwgIihMamF2YS9sYW5nL1N0cmluZztJKUkiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX3NldFJldHJhbnNtaXRFbmRwb2ludH0sCisgICAgeyJzZXROZXh0TWVkaWFQbGF5ZXIiLCAgIihMYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjspViIsICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX3NldE5leHRNZWRpYVBsYXllcn0sCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllciI7CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvbWVkaWFlZGl0b3IvQW5kcm9pZC5tayBiL21lZGlhL2puaS9tZWRpYWVkaXRvci9BbmRyb2lkLm1rCmluZGV4IDYwMDM2MDguLjY4OGUxODAgMTAwNzU1Ci0tLSBhL21lZGlhL2puaS9tZWRpYWVkaXRvci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9tZWRpYWVkaXRvci9BbmRyb2lkLm1rCkBAIC0zNiwxNCArMzYsMTUgQEAKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pL21lZGlhZWRpdG9yIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9tZWRpYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9tZWRpYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbWVkaWEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL21lZGlhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL21lZGlhL2xpYnZpZGVvZWRpdG9yL2x2cHAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL21lZGlhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jCisgICAgJChUT1ApL2ZyYW1ld29ya3MvbWVkaWEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW91dGlscyBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYWhfcnRwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYWhfcnRwL0FuZHJvaWQubWsKaW5kZXggNTRmZDllYy4uMWU4N2NmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWFoX3J0cC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmFhaF9ydHAvQW5kcm9pZC5tawpAQCAtMjEsOSArMjEsOSBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhIFwKLSAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjb21tb25fdGltZV9jbGllbnQgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKaW5kZXggMjM2NzBkZi4uNWVjYzhmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCkBAIC01Nyw3ICs1Nyw3IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKEpOSV9IX0lOQ0xVREUpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgIGV4dGVybmFsL2ljdTRjL2NvbW1vbiBcCiAgICAgZXh0ZXJuYWwvZXhwYXQvbGliIFwKICAgICBzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IGY1ODZiMDIuLjBiYjIzN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtNTUsNiArNTUsNyBAQAogICAgIFNFVF9QQVJBTUVURVIsCiAgICAgR0VUX1BBUkFNRVRFUiwKICAgICBTRVRfUkVUUkFOU01JVF9FTkRQT0lOVCwKKyAgICBTRVRfTkVYVF9QTEFZRVIsCiB9OwogCiBjbGFzcyBCcE1lZGlhUGxheWVyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhUGxheWVyPgpAQCAtMzA3LDcgKzMwOCwxNSBAQAogICAgICAgICBpZiAoT0sgIT0gZXJyKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXROZXh0UGxheWVyKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcikgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHNwPElCaW5kZXI+IGIocGxheWVyLT5hc0JpbmRlcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihiKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9ORVhUX1BMQVlFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIH07CkBAIC00ODksNyArNDk4LDExIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFJldHJhbnNtaXRFbmRwb2ludChOVUxMKSk7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfTkVYVF9QTEFZRVI6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE5leHRQbGF5ZXIoaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggYTc1MzZiMy4uYzIyNGYwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxleHBhdC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IDdlYTk0OTAuLmI1MmEzN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTc4OCw0ICs3ODgsMTEgQEAKIAogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0TmV4dE1lZGlhUGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyPiYgbmV4dCkgeworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUGxheWVyLT5zZXROZXh0UGxheWVyKG5leHQgPT0gTlVMTCA/IE5VTEwgOiBuZXh0LT5tUGxheWVyKTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggZTUyMTY0OC4uNDFiY2FiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTM2LDEzICszNiwxMyBAQAogICAgICAgICBsaWJzdGFnZWZyaWdodF9udXBsYXllciAgICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9ydHNwICAgICAgICAgICAgICAgICAgICAgXAogCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0xPQ0FMX0NfSU5DTFVERVMgOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkkKEpOSV9IX0lOQ0xVREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpICAgICAgICAgICAgICAgICAgICAgICBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAogCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwICAgICAgICAgICAgICAgIFwKLSAgICAgICAgJChUT1ApL2V4dGVybmFsL3RyZW1vbG8vVHJlbW9sbyBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCAgICAgICAgICAgICAgICAgIFwKKwkkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvCiAKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhcGxheWVyc2VydmljZQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGJiYzUzZjMuLjFjYzEyMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0xMDY4LDYgKzEwNjgsMjAgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0TmV4dFBsYXllcihjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBwbGF5ZXIpIHsKKyAgICBBTE9HVigic2V0TmV4dFBsYXllciIpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzcDxDbGllbnQ+IGMgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihwbGF5ZXIuZ2V0KCkpOworICAgIG1OZXh0Q2xpZW50ID0gYzsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwgJiYgYyAhPSBOVUxMKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0TmV4dE91dHB1dChjLT5tQXVkaW9PdXRwdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJubyBjdXJyZW50IGF1ZGlvIG91dHB1dCIpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNlZWtUbyhpbnQgbXNlYykKIHsKICAgICBBTE9HVigiWyVkXSBzZWVrVG8oJWQpIiwgbUNvbm5JZCwgbXNlYyk7CkBAIC0xMTg5LDYgKzEyMDMsMTUgQEAKIHsKICAgICBDbGllbnQqIGNsaWVudCA9IHN0YXRpY19jYXN0PENsaWVudCo+KGNvb2tpZSk7CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKGNsaWVudC0+bUxvY2spOworICAgICAgICBpZiAobXNnID09IE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFICYmIGNsaWVudC0+bU5leHRDbGllbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgY2xpZW50LT5tQXVkaW9PdXRwdXQtPnN3aXRjaFRvTmV4dE91dHB1dCgpOworICAgICAgICAgICAgY2xpZW50LT5tTmV4dENsaWVudC0+c3RhcnQoKTsKKyAgICAgICAgICAgIGNsaWVudC0+bU5leHRDbGllbnQtPm1DbGllbnQtPm5vdGlmeShNRURJQV9JTkZPLCBNRURJQV9JTkZPX1NUQVJURURfQVNfTkVYVCwgMCwgb2JqKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChNRURJQV9JTkZPID09IG1zZyAmJgogICAgICAgICBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSA9PSBleHQxKSB7CiAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlID0gZXh0MjsKQEAgLTEzNzYsOSArMTM5OSwxMSBAQAogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCkKICAgICA6IG1DYWxsYmFjayhOVUxMKSwKICAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKKyAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCiAgICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCkgewogICAgIEFMT0dWKCJBdWRpb091dHB1dCglZCkiLCBzZXNzaW9uSWQpOwogICAgIG1UcmFjayA9IDA7CisgICAgbVJlY3ljbGVkVHJhY2sgPSAwOwogICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIG1MZWZ0Vm9sdW1lID0gMS4wOwogICAgIG1SaWdodFZvbHVtZSA9IDEuMDsKQEAgLTEzOTMsNiArMTQxOCw4IEBACiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp+QXVkaW9PdXRwdXQoKQogewogICAgIGNsb3NlKCk7CisgICAgZGVsZXRlIG1SZWN5Y2xlZFRyYWNrOworICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldE1pbkJ1ZmZlckNvdW50KCkKQEAgLTE0NzMsNyArMTUwMCw2IEBACiAgICAgfQogICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgJWQsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJDb3VudCwgbVNlc3Npb25JZCk7Ci0gICAgaWYgKG1UcmFjaykgY2xvc2UoKTsKICAgICBpbnQgYWZTYW1wbGVSYXRlOwogICAgIGludCBhZkZyYW1lQ291bnQ7CiAgICAgaW50IGZyYW1lQ291bnQ7CkBAIC0xNDk0LDkgKzE1MjAsNDggQEAKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChtUmVjeWNsZWRUcmFjaykgeworICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXhpc3RpbmcgdHJhY2sgY2FuIGJlIHJldXNlZCBhcy1pcywgb3IgaWYgYSBuZXcgdHJhY2sgbmVlZHMgdG8gYmUgY3JlYXRlZC4KKworICAgICAgICBib29sIHJldXNlID0gdHJ1ZTsKKyAgICAgICAgaWYgKChtQ2FsbGJhY2tEYXRhID09IE5VTEwgJiYgbUNhbGxiYWNrICE9IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCAmJiBtQ2FsbGJhY2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIC8vIHJlY3ljbGVkIHRyYWNrIHVzZXMgY2FsbGJhY2tzIGJ1dCB0aGUgY2FsbGVyIHdhbnRzIHRvIHVzZSB3cml0ZXMsIG9yIHZpY2UgdmVyc2EKKyAgICAgICAgICAgIEFMT0dWKCJjYW4ndCBjaGFpbiBjYWxsYmFjayBhbmQgd3JpdGUiKTsKKyAgICAgICAgICAgIHJldXNlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoKG1SZWN5Y2xlZFRyYWNrLT5nZXRTYW1wbGVSYXRlKCkgIT0gc2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAobVJlY3ljbGVkVHJhY2stPmNoYW5uZWxDb3VudCgpICE9IGNoYW5uZWxDb3VudCkgfHwKKyAgICAgICAgICAgICAgICAobVJlY3ljbGVkVHJhY2stPmZyYW1lQ291bnQoKSAhPSBmcmFtZUNvdW50KSkgeworICAgICAgICAgICAgQUxPR1YoInNhbXBsZXJhdGUsIGNoYW5uZWxjb3VudCBvciBmcmFtZWNvdW50IGRpZmZlciIpOworICAgICAgICAgICAgcmV1c2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV1c2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjaGFpbmluZyB0byBuZXh0IG91dHB1dCIpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIG1UcmFjayA9IG1SZWN5Y2xlZFRyYWNrOworICAgICAgICAgICAgbVJlY3ljbGVkVHJhY2sgPSBOVUxMOworICAgICAgICAgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPnNldE91dHB1dCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBnb2luZyB0byByZXVzZSB0aGUgdHJhY2ssIHVuYmxvY2sgYW5kIGZsdXNoIGl0CisgICAgICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPnNldE91dHB1dChOVUxMKTsKKyAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7CisgICAgICAgIH0KKyAgICAgICAgbVJlY3ljbGVkVHJhY2stPmZsdXNoKCk7CisgICAgICAgIGRlbGV0ZSBtUmVjeWNsZWRUcmFjazsKKyAgICAgICAgbVJlY3ljbGVkVHJhY2sgPSBOVUxMOworICAgICAgICBkZWxldGUgbUNhbGxiYWNrRGF0YTsKKyAgICAgICAgbUNhbGxiYWNrRGF0YSA9IE5VTEw7CisgICAgICAgIGNsb3NlKCk7CisgICAgfQogCiAgICAgQXVkaW9UcmFjayAqdDsKICAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRGF0YSA9IG5ldyBDYWxsYmFja0RhdGEodGhpcyk7CiAgICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLApAQCAtMTUwNSw3ICsxNTcwLDcgQEAKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKLSAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEsCiAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkKTsKICAgICB9IGVsc2UgewpAQCAtMTU0Niw2ICsxNjExLDkgQEAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c3RhcnQoKQogewogICAgIEFMT0dWKCJzdGFydCIpOworICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRGF0YS0+ZW5kVHJhY2tTd2l0Y2goKTsKKyAgICB9CiAgICAgaWYgKG1UcmFjaykgewogICAgICAgICBtVHJhY2stPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKICAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CkBAIC0xNTUzLDggKzE2MjEsMjcgQEAKICAgICB9CiB9CiAKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0TmV4dE91dHB1dChjb25zdCBzcDxBdWRpb091dHB1dD4mIG5leHRPdXRwdXQpIHsKKyAgICBtTmV4dE91dHB1dCA9IG5leHRPdXRwdXQ7Cit9CiAKIAordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojpzd2l0Y2hUb05leHRPdXRwdXQoKSB7CisgICAgQUxPR1YoInN3aXRjaFRvTmV4dE91dHB1dCIpOworICAgIGlmIChtTmV4dE91dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPmJlZ2luVHJhY2tTd2l0Y2goKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGE7CisgICAgICAgIG1OZXh0T3V0cHV0LT5tQ2FsbGJhY2tEYXRhID0gbUNhbGxiYWNrRGF0YTsKKyAgICAgICAgbUNhbGxiYWNrRGF0YSA9IE5VTEw7CisgICAgICAgIG1OZXh0T3V0cHV0LT5tUmVjeWNsZWRUcmFjayA9IG1UcmFjazsKKyAgICAgICAgbVRyYWNrID0gTlVMTDsKKyAgICAgICAgbU5leHRPdXRwdXQtPm1TYW1wbGVSYXRlSHogPSBtU2FtcGxlUmF0ZUh6OworICAgICAgICBtTmV4dE91dHB1dC0+bU1zZWNzUGVyRnJhbWUgPSBtTXNlY3NQZXJGcmFtZTsKKyAgICB9Cit9CisKIHNzaXplX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBMT0dfRkFUQUxfSUYobUNhbGxiYWNrICE9IE5VTEwsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOwpAQCAtMTY0NiwxMyArMTczMywyMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQXVkaW9PdXRwdXQgKm1lID0gKEF1ZGlvT3V0cHV0ICopY29va2llOworICAgIENhbGxiYWNrRGF0YSAqZGF0YSA9IChDYWxsYmFja0RhdGEqKWNvb2tpZTsKKyAgICBkYXRhLT5sb2NrKCk7CisgICAgQXVkaW9PdXRwdXQgKm1lID0gZGF0YS0+Z2V0T3V0cHV0KCk7CiAgICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKKyAgICBpZiAobWUgPT0gTlVMTCkgeworICAgICAgICAvLyBubyBvdXRwdXQgc2V0LCBsaWtlbHkgYmVjYXVzZSB0aGUgdHJhY2sgd2FzIHNjaGVkdWxlZCB0byBiZSByZXVzZWQKKyAgICAgICAgLy8gYnkgYW5vdGhlciBwbGF5ZXIsIGJ1dCB0aGUgZm9ybWF0IHR1cm5lZCBvdXQgdG8gYmUgaW5jb21wYXRpYmxlLgorICAgICAgICBkYXRhLT51bmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llKTsKIAotICAgIGlmIChhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCkgeworICAgIGlmIChhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCAmJiBtZS0+bU5leHRPdXRwdXQgPT0gTlVMTCkgewogICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIEVPUyBidXQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldCwKICAgICAgICAgLy8ga2VlcCBwbGF5aW5nIHNpbGVuY2UuCiAKQEAgLTE2NjEsNiArMTc1Nyw3IEBACiAgICAgfQogCiAgICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKKyAgICBkYXRhLT51bmxvY2soKTsKIH0KIAogaW50IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggODVjZWMyMi4uZDRlMGViMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKQEAgLTY5LDcgKzcwLDkgQEAKIAogICAgIGNsYXNzIEF1ZGlvT3V0cHV0IDogcHVibGljIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rCiAgICAgewotICAgIHB1YmxpYzoKKyAgICAgICAgY2xhc3MgQ2FsbGJhY2tEYXRhOworCisgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5BdWRpb091dHB1dCgpOwogCkBAIC0xMDQsMTQgKzEwNywyMSBAQAogCiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIGlzT25FbXVsYXRvcigpOwogICAgICAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBnZXRNaW5CdWZmZXJDb3VudCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXROZXh0T3V0cHV0KGNvbnN0IHNwPEF1ZGlvT3V0cHV0PiYgbmV4dE91dHB1dCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHN3aXRjaFRvTmV4dE91dHB1dCgpOworICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICBuZWVkc1RyYWlsaW5nUGFkZGluZygpIHsgcmV0dXJuIG1OZXh0T3V0cHV0ID09IE5VTEw7IH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CiAgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlcigKICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKm1lLCB2b2lkICppbmZvKTsKIAogICAgICAgICBBdWRpb1RyYWNrKiAgICAgICAgICAgICBtVHJhY2s7CisgICAgICAgIEF1ZGlvVHJhY2sqICAgICAgICAgICAgIG1SZWN5Y2xlZFRyYWNrOworICAgICAgICBzcDxBdWRpb091dHB1dD4gICAgICAgICBtTmV4dE91dHB1dDsKICAgICAgICAgQXVkaW9DYWxsYmFjayAgICAgICAgICAgbUNhbGxiYWNrOwogICAgICAgICB2b2lkICogICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWU7CisgICAgICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7CiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwpAQCAtMTI0LDcgKzEzNCwzOCBAQAogICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwogICAgICAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBtTWluQnVmZmVyQ291bnQ7ICAvLyAxMiBmb3IgZW11bGF0b3I7IG90aGVyd2lzZSA0CiAKLSAgICB9OworICAgICAgICAvLyBDYWxsYmFja0RhdGEgaXMgd2hhdCBpcyBwYXNzZWQgdG8gdGhlIEF1ZGlvVHJhY2sgYXMgdGhlICJ1c2VyIiBkYXRhLgorICAgICAgICAvLyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gdGFyZ2V0IHRoaXMgdG8gYSBkaWZmZXJlbnQgT3V0cHV0IG9uIHRoZSBmbHksCisgICAgICAgIC8vIHNvIHdlIGNhbid0IHVzZSB0aGUgT3V0cHV0IGl0c2VsZiBmb3IgdGhpcy4KKyAgICAgICAgY2xhc3MgQ2FsbGJhY2tEYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQ2FsbGJhY2tEYXRhKEF1ZGlvT3V0cHV0ICpjb29raWUpIHsKKyAgICAgICAgICAgICAgICBtRGF0YSA9IGNvb2tpZTsKKyAgICAgICAgICAgICAgICBtU3dpdGNoaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb091dHB1dCAqICAgZ2V0T3V0cHV0KCkgeyByZXR1cm4gbURhdGE7fQorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldE91dHB1dChBdWRpb091dHB1dCogbmV3Y29va2llKSB7IG1EYXRhID0gbmV3Y29va2llOyB9CisgICAgICAgICAgICAvLyBsb2NrL3VubG9jayBhcmUgdXNlZCBieSB0aGUgY2FsbGJhY2sgYmVmb3JlIGFjY2Vzc2luZyB0aGUgcGF5bG9hZCBvZiB0aGlzIG9iamVjdAorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGxvY2soKSB7IG1Mb2NrLmxvY2soKTsgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHVubG9jaygpIHsgbUxvY2sudW5sb2NrKCk7IH0KKyAgICAgICAgICAgIC8vIGJlZ2luVHJhY2tTd2l0Y2gvZW5kVHJhY2tTd2l0Y2ggYXJlIHVzZWQgd2hlbiB0aGlzIG9iamVjdCBpcyBiZWluZyBoYW5kZWQgb3ZlcgorICAgICAgICAgICAgLy8gdG8gdGhlIG5leHQgc2luay4KKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBiZWdpblRyYWNrU3dpdGNoKCkgeyBtTG9jay5sb2NrKCk7IG1Td2l0Y2hpbmcgPSB0cnVlOyB9CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZW5kVHJhY2tTd2l0Y2goKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Td2l0Y2hpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0ICogICBtRGF0YTsKKyAgICAgICAgICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBtU3dpdGNoaW5nOworICAgICAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2FsbGJhY2tEYXRhKTsKKyAgICAgICAgfTsKKworICAgIH07IC8vIEF1ZGlvT3V0cHV0CisKIAogICAgIGNsYXNzIEF1ZGlvQ2FjaGUgOiBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsKICAgICB7CkBAIC0xODQsNyArMjI1LDcgQEAKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtQ29tbWFuZENvbXBsZXRlOwogCiAgICAgICAgIHNwPFRocmVhZD4gICAgICAgICAgbUNhbGxiYWNrVGhyZWFkOwotICAgIH07CisgICAgfTsgLy8gQXVkaW9DYWNoZQogCiBwdWJsaWM6CiAgICAgc3RhdGljICB2b2lkICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlKCk7CkBAIC0yNzgsNiArMzE5LDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogZW5kcG9pbnQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXROZXh0UGxheWVyKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcik7CiAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgY3JlYXRlUGxheWVyKHBsYXllcl90eXBlIHBsYXllclR5cGUpOwogCkBAIC0zNTAsNiArMzkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRXaW5kb3dCaW5kZXI7CiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgICAgICAgICBtUmV0cmFuc21pdEVuZHBvaW50OwogICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkOworICAgICAgICAgICAgICAgICAgICBzcDxDbGllbnQ+ICAgICAgICAgICAgICAgICAgbU5leHRDbGllbnQ7CiAKICAgICAgICAgLy8gTWV0YWRhdGEgZmlsdGVycy4KICAgICAgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhQWxsb3c7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKQEAgLTM2NCw3ICs0MDcsNyBAQAogI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCiAgICAgICAgICAgICAgICAgICAgIEFudGFnb25pemVyKiAgICAgICAgICAgICAgICBtQW50YWdvbml6ZXI7CiAjZW5kaWYKLSAgICB9OworICAgIH07IC8vIENsaWVudAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKaW5kZXggMzNlMmY5My4uOWI0ODVkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKQEAgLTEyLDExICsxMiwxMSBAQAogICAgICAgICBTdHJlYW1pbmdTb3VyY2UuY3BwICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4ICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZSAgICAgICAgICAgIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMgICAgICAgICAgICAgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlICAgICAgICAgICAgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyAgICAgICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwICAgICAgICAgICAgICAgIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X251cGxheWVyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDVhZWE4ZDAuLjA0N2I0Y2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtNTcsOCArNTcsOSBAQAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvZXhwYXQvbGliIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2ZsYWMvaW5jbHVkZSBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC90cmVtb2xvIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCAyM2MzYzc0Li45ZGIzYzk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC00MTksNyArNDE5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVRvQ29tcGxldGlvblVzLCB0aW1lVG9Db21wbGV0aW9uVXMgLyAxRTYpOwogCiAgICAgICAgICAgICAgICAgICAgIHBvc3RFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IHRpbWVUb0NvbXBsZXRpb25VcyArIG1MYXRlbmN5VXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IHRpbWVUb0NvbXBsZXRpb25VcyArIG1MYXRlbmN5VXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggOTY2NDE2ZS4uMjc4ZTNhMiAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtMjcsOSArMjcsOSBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCmluZGV4IGFiMmNmZjAuLjYwMjQ2OWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcApAQCAtMjAsOCArMjAsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KKyNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KIAogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rCmluZGV4IDYzNzc1ZjEuLmUzN2I0YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKQEAgLTEwLDcgKzEwLDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICBleHRlcm5hbC9jaHJvbWl1bSBcCiAgICAgICAgIGV4dGVybmFsL2Nocm9taXVtL2FuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCmluZGV4IDIwYzdiYzAuLmZkNmRlNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfSU1QT1JUX1JFRj0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCmluZGV4IDUwOTE5M2MuLmI0N2NiMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKQEAgLTk0LDkgKzk0LDkgQEAKICAgICAgICAgU29mdEFBQ0VuY29kZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKaW5kZXggMjNhMjJlZi4uYjgxMzA2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawpAQCAtNjEsMTIgKzYxLDEyIEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYyBcCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24vaW5jbHVkZSBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbgogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tawppbmRleCA5NGU4NzI2Li4yMTkzN2JmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCkBAIC04NCw3ICs4NCw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawppbmRleCA2Y2U2MTcxLi4zYTQ2ZWM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawpAQCAtMTI1LDkgKzEyNSw5IEBACiAgICAgICAgIFNvZnRBTVJXQkVuY29kZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawppbmRleCBlYjJlMzIwLi41NGNjOWIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKQEAgLTI1LDggKzI1LDggQEAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgLURfX2FybV9fIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKaW5kZXggNjY5MjUzMy4uNDI3MDZhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKQEAgLTYsNyArNiw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKaW5kZXggMmZmYTVmMi4uOGMyNDVkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawpAQCAtNDIsNyArNDIsNyBAQAogCSQoTE9DQUxfUEFUSCkvc3JjIFwKIAkkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfRVhQT1JUX1JFRj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKQEAgLTU5LDcgKzU5LDcgQEAKIAkkKExPQ0FMX1BBVEgpL3NyYyBcCiAJJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfRVhQT1JUX1JFRj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawppbmRleCA0MzMxOGU5Li4yYjdjOTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCkBAIC0zMSw3ICszMSw3IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCiAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawppbmRleCBhMDhjOWYwLi5lZDUxYWE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCkBAIC02NSw3ICs2NSw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawppbmRleCAzMmJiZDZiLi4yOTk3MjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKQEAgLTksNyArOSw3IEBACiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvdnB4X2NvZGVjIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC92cHhfcG9ydHMgXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlidnB4CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCmluZGV4IDViM2M4NzYuLjQzYzIwZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rCkBAIC0zNSw3ICszNSw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uL2luYyBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotCWZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAKIE1ZX0FTTSA6PSBcCiAJLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKaW5kZXggZjMzZjNhYy4uZmNhNzBiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCkBAIC03LDcgKzcsNyBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICAgIGV4dGVybmFsL3RyZW1vbG8gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlidm9yYmlzaWRlYyBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawppbmRleCA2MmJhNDBmLi41OWE2NGJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawpAQCAtNiw3ICs2LDcgQEAKICAgICAgICAgU29mdHdhcmVSZW5kZXJlci5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgICQoVE9QKS9oYXJkd2FyZS9tc203awogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawppbmRleCA5MjI1ZTQxLi5hNTk5MGMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKQEAgLTksOSArOSw5IEBACiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKaW5kZXggMWYxYzY4Yi4uZTY3ZGE0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCkBAIC03LDcgKzcsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgJChKTklfSF9JTkNMVURFKSBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbWt2cGFyc2VyIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawppbmRleCA1NzhjNjY5Li5hYzRjMmExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCkBAIC0xMSw4ICsxMSw4IEBACiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0CisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tcGVnMnRzCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKaW5kZXggZDg0NGYzZC4uZjU4N2E5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKQEAgLTE0LDcgKzE0LDggQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaAppbmRleCBmZWVlMWY5Li42MDY5NzQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgT01YX01BU1RFUl9IXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YUGx1Z2luQmFzZS5oPgorI2luY2x1ZGUgPE9NWFBsdWdpbkJhc2UuaD4KIAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCAwOTljNGY1Li5iZmYzZGVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjQsOCArMjQsOCBAQAogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKaW5kZXggZjkzYzMyMy4uYzg5Y2Q4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCkBAIC0xOSw3ICsxOSw3IEBACiAjZGVmaW5lIFNPRlRfT01YX1BMVUdJTl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaD4KKyNpbmNsdWRlIDxPTVhQbHVnaW5CYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tawppbmRleCAwYzBhNzBjLi4wN2Q0N2E4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tawpAQCAtMTAsNyArMTAsNyBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfTU9EVUxFIDo9IG9teF90ZXN0cwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKaW5kZXggODIzMDM0Ny4uYjNiYzM3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawpAQCAtMTksOSArMTksOSBAQAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisJJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9ydHNwCiAKQEAgLTQ3LDcgKzQ3LDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDM1N2ZlYjEuLjY1NmE2MzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawpAQCAtMzgsNyArMzgsNyBAQAogICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvb214anBlZ2RlY29kZXIvQW5kcm9pZC5tayBiL21lZGlhL3Rlc3RzL29teGpwZWdkZWNvZGVyL0FuZHJvaWQubWsKaW5kZXggMDI1YTEzMS4uM2UwOWE1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvb214anBlZ2RlY29kZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS90ZXN0cy9vbXhqcGVnZGVjb2Rlci9BbmRyb2lkLm1rCkBAIC00MCw5ICs0MCw5IEBACiAgICAgJChUT1ApL2V4dGVybmFsL3NraWEvaW5jbHVkZS91dGlscyBcCiAgICAgJChUT1ApL2V4dGVybmFsL3NraWEvaW5jbHVkZS9lZmZlY3RzIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlLyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS8KKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlLyBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9NT0RVTEUgOj0ganBlZ19iZW5jaAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OYXRpdmVEYWVtb25Db25uZWN0b3IuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCmluZGV4IDY1OTNhMGYuLjBiNWVhZmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhCkBAIC0yMDAsMTcgKzIwMCwxNSBAQAogCiAgICAgLyoqCiAgICAgICogTWFrZSBjb21tYW5kIGZvciBkYWVtb24sIGVzY2FwaW5nIGFyZ3VtZW50cyBhcyBuZWVkZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmaW5hbCBjb21tYW5kLgogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBtYWtlQ29tbWFuZChTdHJpbmcgY21kLCBPYmplY3QuLi4gYXJncykKKyAgICBwcml2YXRlIHZvaWQgbWFrZUNvbW1hbmQoU3RyaW5nQnVpbGRlciBidWlsZGVyLCBTdHJpbmcgY21kLCBPYmplY3QuLi4gYXJncykKICAgICAgICAgICAgIHRocm93cyBOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24gewogICAgICAgICAvLyBUT0RPOiBldmVudHVhbGx5IGVuZm9yY2UgdGhhdCBjbWQgZG9lc24ndCBjb250YWluIGFyZ3VtZW50cwogICAgICAgICBpZiAoY21kLmluZGV4T2YoJ1wwJykgPj0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5leHBlY3RlZCBjb21tYW5kOiAiICsgY21kKTsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGNtZCk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNtZCk7CiAgICAgICAgIGZvciAoT2JqZWN0IGFyZyA6IGFyZ3MpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmdTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihhcmcpOwogICAgICAgICAgICAgaWYgKGFyZ1N0cmluZy5pbmRleE9mKCdcMCcpID49IDApIHsKQEAgLTIyMCwzNCArMjE4LDYgQEAKICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7CiAgICAgICAgICAgICBhcHBlbmRFc2NhcGVkKGJ1aWxkZXIsIGFyZ1N0cmluZyk7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBzZW5kQ29tbWFuZChTdHJpbmdCdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICB0aHJvd3MgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uIHsKLQotICAgICAgICBpbnQgc2VxdWVuY2VOdW1iZXIgPSBtU2VxdWVuY2VOdW1iZXIuaW5jcmVtZW50QW5kR2V0KCk7Ci0KLSAgICAgICAgYnVpbGRlci5pbnNlcnQoMCwgSW50ZWdlci50b1N0cmluZyhzZXF1ZW5jZU51bWJlcikgKyAiICIpOwotCi0gICAgICAgIGxvZygiU05EIC0+IHsiICsgYnVpbGRlci50b1N0cmluZygpICsgIn0iKTsKLQotICAgICAgICBidWlsZGVyLmFwcGVuZCgnXDAnKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1EYWVtb25Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobU91dHB1dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkNvbm5lY3RvckV4Y2VwdGlvbigibWlzc2luZyBvdXRwdXQgc3RyZWFtIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0ud3JpdGUoYnVpbGRlci50b1N0cmluZygpLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uKCJwcm9ibGVtIHNlbmRpbmcgY29tbWFuZCIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXF1ZW5jZU51bWJlcjsKICAgICB9CiAKICAgICAvKioKQEAgLTMyNSwyNSArMjk1LDQ2IEBACiAgICAgcHVibGljIE5hdGl2ZURhZW1vbkV2ZW50W10gZXhlY3V0ZShpbnQgdGltZW91dCwgU3RyaW5nIGNtZCwgT2JqZWN0Li4uIGFyZ3MpCiAgICAgICAgICAgICB0aHJvd3MgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5hdGl2ZURhZW1vbkV2ZW50PiBldmVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzZW50Q29tbWFuZCA9IG1ha2VDb21tYW5kKGNtZCwgYXJncyk7Ci0gICAgICAgIGZpbmFsIGludCBjbWROdW1iZXIgPSBzZW5kQ29tbWFuZChzZW50Q29tbWFuZCk7CisKKyAgICAgICAgZmluYWwgaW50IHNlcXVlbmNlTnVtYmVyID0gbVNlcXVlbmNlTnVtYmVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGNtZEJ1aWxkZXIgPQorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKEludGVnZXIudG9TdHJpbmcoc2VxdWVuY2VOdW1iZXIpKS5hcHBlbmQoJyAnKTsKKworICAgICAgICBtYWtlQ29tbWFuZChjbWRCdWlsZGVyLCBjbWQsIGFyZ3MpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBsb2dDbWQgPSBjbWRCdWlsZGVyLnRvU3RyaW5nKCk7IC8qIGluY2x1ZGVzIGNtZE51bSwgY21kLCBhcmdzICovCisgICAgICAgIGxvZygiU05EIC0+IHsiICsgbG9nQ21kICsgIn0iKTsKKworICAgICAgICBjbWRCdWlsZGVyLmFwcGVuZCgnXDAnKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNlbnRDbWQgPSBjbWRCdWlsZGVyLnRvU3RyaW5nKCk7IC8qIGxvZ0NtZCArIFwwICovCisKKyAgICAgICAgc3luY2hyb25pemVkIChtRGFlbW9uTG9jaykgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24oIm1pc3Npbmcgb3V0cHV0IHN0cmVhbSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLndyaXRlKHNlbnRDbWQuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24oInByb2JsZW0gc2VuZGluZyBjb21tYW5kIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgTmF0aXZlRGFlbW9uRXZlbnQgZXZlbnQgPSBudWxsOwotICAgICAgICBjbWQgPSBzZW50Q29tbWFuZC50b1N0cmluZygpOwogICAgICAgICBkbyB7Ci0gICAgICAgICAgICBldmVudCA9IG1SZXNwb25zZVF1ZXVlLnJlbW92ZShjbWROdW1iZXIsIHRpbWVvdXQsIGNtZCk7CisgICAgICAgICAgICBldmVudCA9IG1SZXNwb25zZVF1ZXVlLnJlbW92ZShzZXF1ZW5jZU51bWJlciwgdGltZW91dCwgc2VudENtZCk7CiAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZ2UoInRpbWVkLW91dCB3YWl0aW5nIGZvciByZXNwb25zZSB0byAiICsgY21kTnVtYmVyICsgIiAiICsgY21kKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uRmFpbHVyZUV4Y2VwdGlvbihjbWQsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICBsb2dlKCJ0aW1lZC1vdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UgdG8gIiArIGxvZ0NtZCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkZhaWx1cmVFeGNlcHRpb24obG9nQ21kLCBldmVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBldmVudHMuYWRkKGV2ZW50KTsKICAgICAgICAgfSB3aGlsZSAoZXZlbnQuaXNDbGFzc0NvbnRpbnVlKCkpOwogCiAgICAgICAgIGlmIChldmVudC5pc0NsYXNzQ2xpZW50RXJyb3IoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkFyZ3VtZW50RXhjZXB0aW9uKGNtZCwgZXZlbnQpOworICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkFyZ3VtZW50RXhjZXB0aW9uKGxvZ0NtZCwgZXZlbnQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChldmVudC5pc0NsYXNzU2VydmVyRXJyb3IoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkZhaWx1cmVFeGNlcHRpb24oY21kLCBldmVudCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uRmFpbHVyZUV4Y2VwdGlvbihsb2dDbWQsIGV2ZW50KTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBldmVudHMudG9BcnJheShuZXcgTmF0aXZlRGFlbW9uRXZlbnRbZXZlbnRzLnNpemUoKV0pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDYzNDE4ZGIuLjUyYTQxMTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE4NTgsNiArMTg1OCw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBsaWdodHMgKmJlZm9yZSogdGFraW5nIGNhcmUgb2YgdHVybmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgLy8gc2NyZWVuIG9mZiwgc28gd2UgY2FuIGluaXRpYXRlIGFueSBhbmltYXRpb25zIHRoYXQgYXJlIGRlc2lyZWQuCisgICAgICAgICAgICAgICAgICAgIG1TY3JlZW5PZmZSZWFzb24gPSByZWFzb247CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZUNoYW5nZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxpZ2h0c0xvY2tlZChuZXdTdGF0ZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE4NzYsNyArMTg3Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbVBvd2VyU3RhdGUgJj0gflNDUkVFTl9PTl9CSVQ7Ci0gICAgICAgICAgICAgICAgICAgIG1TY3JlZW5PZmZSZWFzb24gPSByZWFzb247CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVNjcmVlbkJyaWdodG5lc3NBbmltYXRvci5pc0FuaW1hdGluZygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzY3JlZW5PZmZGaW5pc2hlZEFuaW1hdGluZ0xvY2tlZChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewo=