ZGlmZiAtLWdpdCBhL09XTkVSUyBiL09XTkVSUwppbmRleCA2ODJhMDY3Li45NmI0ZjU0IDEwMDY0NAotLS0gYS9PV05FUlMKKysrIGIvT1dORVJTCkBAIC0xICsxLDIgQEAKKyMgQnVnIGNvbXBvbmVudDogMTI4NTc3CiBlbmhAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvYm9vdHN0YXQvQW5kcm9pZC5icCBiL2Jvb3RzdGF0L0FuZHJvaWQuYnAKaW5kZXggY2E1OWVmMy4uMGM4NzYwYyAxMDA2NDQKLS0tIGEvYm9vdHN0YXQvQW5kcm9pZC5icAorKysgYi9ib290c3RhdC9BbmRyb2lkLmJwCkBAIC03Miw5ICs3Miw2IEBACiAgICAgXSwKICAgICBpbml0X3JjOiBbImJvb3RzdGF0LnJjIl0sCiAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgcGRrOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKICAgICAgICAgZGVidWdnYWJsZTogewogICAgICAgICAgICAgaW5pdF9yYzogWyJib290c3RhdC1kZWJ1Zy5yYyJdLAogICAgICAgICB9LApkaWZmIC0tZ2l0IGEvYm9vdHN0YXQvYm9vdHN0YXQuY3BwIGIvYm9vdHN0YXQvYm9vdHN0YXQuY3BwCmluZGV4IDg0NDM1N2MuLjJkNTVlNWEgMTAwNjQ0Ci0tLSBhL2Jvb3RzdGF0L2Jvb3RzdGF0LmNwcAorKysgYi9ib290c3RhdC9ib290c3RhdC5jcHAKQEAgLTQ1OSw2ICs0NTksMTYgQEAKICAgICB7InJlYm9vdCxzeXNfbGRvX29rLHBtaWMsbWFpbiIsIDIyN30sCiAgICAgeyJyZWJvb3Qsc3lzX2xkb19vayxwbWljLHN1YiIsIDIyOH0sCiAgICAgeyJyZWJvb3Qsc21wbF90aW1lb3V0LHBtaWMsbWFpbiIsIDIyOX0sCisgICAgeyJyZWJvb3Qsb3RhLC4qIiwgMjMwfSwKKyAgICB7InJlYm9vdCxwZXJpb2RpYywuKiIsIDIzMX0sCisgICAgeyJyZWJvb3QsZWFybHksYWJsIiwgMjMyfSwKKyAgICB7InJlYm9vdCxlYXJseSxibDIiLCAyMzN9LAorICAgIHsicmVib290LGxvbmdrZXkscG1pY19jb2xkIiwgMjM0fSwKKyAgICB7InJlYm9vdCxsb25na2V5LG1hc3Rlcl9kYyIsIDIzNX0sCisgICAgeyJyZWJvb3Qsb2NwMixwbWljLGlmIiwgMjM2fSwKKyAgICB7InJlYm9vdCxvY3AscG1pYyxpZiIsIDIzN30sCisgICAgeyJyZWJvb3QsZnNoaXAiLCAyMzh9LAorICAgIHsicmVib290LG9jcCwuKiIsIDIzOX0sCiB9OwogCiAvLyBDb252ZXJ0cyBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiB0aGUgc3lzdGVtIGJvb3RlZCB0byBhbgpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL0FuZHJvaWQuYnAgYi9kZWJ1Z2dlcmQvQW5kcm9pZC5icAppbmRleCBkMjBkZTZiLi43ZDIwOTk1IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvQW5kcm9pZC5icAorKysgYi9kZWJ1Z2dlcmQvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsNyBAQAogICAgICAgICAiLVduby11bnVzZWQtYXJndW1lbnQiLAogICAgICAgICAiLVduby11bnVzZWQtZnVuY3Rpb24iLAogICAgICAgICAiLVduby1udWxsYWJpbGl0eS1jb21wbGV0ZW5lc3MiLAorICAgICAgICAiLVduby1yZW9yZGVyLWluaXQtbGlzdCIsCiAgICAgICAgICItT3MiLAogICAgICAgICAiLWZuby1maW5pdGUtbG9vcHMiLAogICAgICAgICAiLURBTkRST0lEX0RFQlVHR0FCTEU9MCIsCkBAIC0zMSw5ICszMiwxMCBAQAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCiAgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgImNvbS5hbmRyb2lkLnJ1bnRpbWUiLAogICAgICAgICAiY29tLmFuZHJvaWQudmlydCIsCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgIF0sCisgICAgXSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtODQsNiArODYsNyBAQAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJkZWJ1Z2dlcmRfY29tbW9uX2hlYWRlcnMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInRvbWJzdG9uZWQvaW5jbHVkZSJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLnJ1bnRpbWUiXSwKIH0KIAogLy8gQ29yZSBpbXBsZW1lbnRhdGlvbiwgbGlua2VkIGludG8gbGliZGVidWdnZXJkX2hhbmRsZXIgYW5kIHRoZSBkeW5hbWljIGxpbmtlci4KQEAgLTEwOSw2ICsxMTIsOSBAQAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJkZWJ1Z2dlcmRfY29tbW9uX2hlYWRlcnMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiY29tLmFuZHJvaWQucnVudGltZSIsCisgICAgXSwKIH0KIAogLy8gSW1wbGVtZW50YXRpb24gd2l0aCBhIG5vLW9wIGZhbGxiYWNrLgpAQCAtMTg1LDkgKzE5MSw0NSBAQAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliZGVidWdnZXJkX3RvbWJzdG9uZV9wcm90b190b190ZXh0IiwKKyAgICBkZWZhdWx0czogWyJkZWJ1Z2dlcmRfZGVmYXVsdHMiXSwKKyAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCisgICAgdmVuZG9yX3JhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImxpYmRlYnVnZ2VyZC9pbmNsdWRlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJsaWJkZWJ1Z2dlcmQvaW5jbHVkZSJdLAorCisgICAgc3JjczogWworICAgICAgICAibGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJiaW9uaWNfbGliY19wbGF0Zm9ybV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nX2Zvcl9ydW50aW1lX2FwZXgiLAorICAgICAgICAibGlidW53aW5kc3RhY2siLAorICAgIF0sCisKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAibGlidG9tYnN0b25lX3Byb3RvIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQucnVudGltZSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJkZWJ1Z2dlcmQiLAogICAgIGRlZmF1bHRzOiBbImRlYnVnZ2VyZF9kZWZhdWx0cyJdLAorICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCiAKQEAgLTE5Nyw3ICsyMzksNiBAQAogICAgICAgICAibGliZGVidWdnZXJkL29wZW5fZmlsZXNfbGlzdC5jcHAiLAogICAgICAgICAibGliZGVidWdnZXJkL3RvbWJzdG9uZS5jcHAiLAogICAgICAgICAibGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90by5jcHAiLAotICAgICAgICAibGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmNwcCIsCiAgICAgICAgICJsaWJkZWJ1Z2dlcmQvdXRpbGl0eS5jcHAiLAogICAgIF0sCiAKQEAgLTIyMSwxMSArMjYyLDkgQEAKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICBdLAotICAgIHJ1bnRpbWVfbGliczogWwotICAgICAgICAibGliZGV4ZmlsZSIsICAgICAgICAgICAvLyBsaWJkZXhmaWxlX3N1cHBvcnQgZGVwZW5kZW5jeQotICAgIF0sCiAKICAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAibGliZGVidWdnZXJkX3RvbWJzdG9uZV9wcm90b190b190ZXh0IiwKICAgICAgICAgImxpYmFzeW5jX3NhZmUiLAogICAgICAgICAiZ3dwX2FzYW5fY3Jhc2hfaGFuZGxlciIsCiAgICAgICAgICJsaWJ0b21ic3RvbmVfcHJvdG8iLApAQCAtMjUwLDYgKzI4OSwxOSBAQAogICAgICAgICAgICAgICAgICJsaWJkZXhmaWxlIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIHJhbWRpc2s6IHsKKyAgICAgICAgICAgIGV4Y2x1ZGVfc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGliZGV4ZmlsZV9zdXBwb3J0IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBleGNsdWRlX3J1bnRpbWVfbGliczogWworICAgICAgICAgICAgICAgICJsaWJkZXhmaWxlIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHJ1bnRpbWVfbGliczogWworICAgICAgICAgICAgICAgICJsaWJkZXhmaWxlIiwgICAgICAgICAgIC8vIGxpYmRleGZpbGVfc3VwcG9ydCBkZXBlbmRlbmN5CisgICAgICAgICAgICBdLAorICAgICAgICB9LAogICAgIH0sCiAKICAgICBwcm9kdWN0X3ZhcmlhYmxlczogewpAQCAtMjY0LDYgKzMxNiw5IEBACiAgICAgICAgICAgICBoZWFkZXJfbGliczogWyJzY3Vkb19oZWFkZXJzIl0sCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiY29tLmFuZHJvaWQucnVudGltZSIsCisgICAgXSwKIH0KIAogY2NfYmluYXJ5IHsKQEAgLTI5Nyw3ICszNTIsNyBAQAogICAgICAgICAibGliZGVidWdnZXJkL3Rlc3QvZWxmX2Zha2UuY3BwIiwKICAgICAgICAgImxpYmRlYnVnZ2VyZC90ZXN0L2xvZ19mYWtlLmNwcCIsCiAgICAgICAgICJsaWJkZWJ1Z2dlcmQvdGVzdC9vcGVuX2ZpbGVzX2xpc3RfdGVzdC5jcHAiLAotICAgICAgICAibGliZGVidWdnZXJkL3Rlc3QvdXRpbGl0eV90ZXN0LmNwcCIsCisgICAgICAgICJsaWJkZWJ1Z2dlcmQvdGVzdC90b21ic3RvbmVfcHJvdG9fdG9fdGV4dF90ZXN0LmNwcCIsCiAgICAgXSwKIAogICAgIHRhcmdldDogewpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2NsaWVudC9kZWJ1Z2dlcmRfY2xpZW50LmNwcCBiL2RlYnVnZ2VyZC9jbGllbnQvZGVidWdnZXJkX2NsaWVudC5jcHAKaW5kZXggYzllMDk3ZS4uYmQxZTkxZCAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NsaWVudC9kZWJ1Z2dlcmRfY2xpZW50LmNwcAorKysgYi9kZWJ1Z2dlcmQvY2xpZW50L2RlYnVnZ2VyZF9jbGllbnQuY3BwCkBAIC0yNzYsNiArMjc2LDEzIEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gV0FSTklORzogSXQncyBub3QgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUgYmVsb3cgd2l0aCBhIHNwbGljZSBjYWxsLgorICAgIC8vIER1ZSB0byB0aGUgd2F5IGRlYnVnZ2VyZCBkb2VzIG1hbnkgc21hbGwgd3JpdGVzIGFjcm9zcyB0aGUgcGlwZSwKKyAgICAvLyB0aGlzIHdvdWxkIGNhdXNlIHNwbGljZSB0byBjb3B5IGEgcGFnZSBmb3IgZWFjaCB3cml0ZS4gVGhlIHNlY29uZAorICAgIC8vIHBpcGUgZmlsbHMgdXAgYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYWdlcyBiZWluZyBjb3BpZWQsIGV2ZW4KKyAgICAvLyB0aG91Z2ggdGhlcmUgaXMgbm90IG11Y2ggZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBwZXIgcGFnZS4gV2hlbgorICAgIC8vIHRoZSBzZWNvbmQgcGlwZSBpcyBmdWxsLCBldmVyeXRoaW5nIHN0b3BzIHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcKKyAgICAvLyByZWFkaW5nIHRoZSBzZWNvbmQgcGlwZSB0byBjbGVhciBpdC4KICAgICBjaGFyIGJ1ZlsxMDI0XTsKICAgICByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKHBpcGVfcmVhZC5nZXQoKSwgYnVmLCBzaXplb2YoYnVmKSkpOwogICAgIGlmIChyYyA9PSAwKSB7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvY2xpZW50L2RlYnVnZ2VyZF9jbGllbnRfdGVzdC5jcHAgYi9kZWJ1Z2dlcmQvY2xpZW50L2RlYnVnZ2VyZF9jbGllbnRfdGVzdC5jcHAKaW5kZXggZWJiOGQ4Ni4uMzNmZjA1ZiAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NsaWVudC9kZWJ1Z2dlcmRfY2xpZW50X3Rlc3QuY3BwCisrKyBiL2RlYnVnZ2VyZC9jbGllbnQvZGVidWdnZXJkX2NsaWVudF90ZXN0LmNwcApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxjaHJvbm8+CkBAIC01MSwyMyArNTIsMzUgQEAKIAogVEVTVChkZWJ1Z2dlcmRfY2xpZW50LCByYWNlKSB7CiAgIHN0YXRpYyBpbnQgVEhSRUFEX0NPVU5UID0gZ2V0VGhyZWFkQ291bnQoKTsKKworICAvLyBTZW1hcGhvcmUgaW5jcmVtZW50ZWQgb25jZSBwZXIgdGhyZWFkIHN0YXJ0ZWQuCisgIHVuaXF1ZV9mZCBiYXJyaWVyKGV2ZW50ZmQoMCwgRUZEX1NFTUFQSE9SRSkpOworICBBU1NFUlRfTkUoLTEsIGJhcnJpZXIuZ2V0KCkpOworCiAgIHBpZF90IGZvcmtwaWQgPSBmb3JrKCk7Ci0KICAgQVNTRVJUX05FKC0xLCBmb3JrcGlkKTsKLQogICBpZiAoZm9ya3BpZCA9PSAwKSB7CiAgICAgLy8gU3Bhd24gYSBidW5jaCBvZiB0aHJlYWRzLCB0byBtYWtlIGNyYXNoX2R1bXAgdGFrZSBsb25nZXIuCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0aHJlYWQ+IHRocmVhZHM7CisgICAgdGhyZWFkcy5yZXNlcnZlKFRIUkVBRF9DT1VOVCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUSFJFQURfQ09VTlQ7ICsraSkgewotICAgICAgdGhyZWFkcy5lbXBsYWNlX2JhY2soW10oKSB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDYwcyk7CisgICAgICB0aHJlYWRzLmVtcGxhY2VfYmFjayhbJmJhcnJpZXJdKCkgeworICAgICAgICB1aW50NjRfdCBjb3VudCA9IDE7CisgICAgICAgIEFTU0VSVF9ORSgtMSwgd3JpdGUoYmFycmllci5nZXQoKSwgJmNvdW50LCBzaXplb2YoY291bnQpKSk7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICBwYXVzZSgpOwogICAgICAgICB9CiAgICAgICB9KTsKICAgICB9CisgICAgZm9yICg7OykgeworICAgICAgcGF1c2UoKTsKKyAgICB9CisgIH0KIAotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig2MHMpOwotICAgIGV4aXQoMCk7CisgIC8vIFdhaXQgZm9yIHRoZSBjaGlsZCB0byBzcGF3biBhbGwgb2YgaXRzIHRocmVhZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgVEhSRUFEX0NPVU5UOyArK2kpIHsKKyAgICB1aW50NjRfdCBjb3VudDsKKyAgICBBU1NFUlRfTkUoLTEsIHJlYWQoYmFycmllci5nZXQoKSwgJmNvdW50LCBzaXplb2YoY291bnQpKSk7CiAgIH0KIAogICB1bmlxdWVfZmQgcGlwZV9yZWFkLCBwaXBlX3dyaXRlOwpAQCAtNzcsOSArOTAsNiBAQAogICBjb25zdGV4cHIgaW50IFBJUEVfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7CiAgIEFTU0VSVF9FUShQSVBFX1NJWkUsIGZjbnRsKHBpcGVfcmVhZC5nZXQoKSwgRl9TRVRQSVBFX1NaLCBQSVBFX1NJWkUpKTsKIAotICAvLyBXYWl0IGZvciBhIGJpdCB0byBsZXQgdGhlIGNoaWxkIHNwYXduIGFsbCBvZiBpdHMgdGhyZWFkcy4KLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDFzKTsKLQogICBBU1NFUlRfVFJVRSgKICAgICAgIGRlYnVnZ2VyZF90cmlnZ2VyX2R1bXAoZm9ya3BpZCwga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSwgNjAwMDAsIHN0ZDo6bW92ZShwaXBlX3dyaXRlKSkpOwogICAvLyBJbW1lZGlhdGVseSBraWxsIHRoZSBmb3JrZWQgY2hpbGQsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkdW1wIGRpZG4ndCByZXR1cm4gZWFybHkuCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvY29tbW9uL2luY2x1ZGUvZHVtcF90eXBlLmggYi9kZWJ1Z2dlcmQvY29tbW9uL2luY2x1ZGUvZHVtcF90eXBlLmgKaW5kZXggYTNlMTcxYi4uODJlZjdiNiAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NvbW1vbi9pbmNsdWRlL2R1bXBfdHlwZS5oCisrKyBiL2RlYnVnZ2VyZC9jb21tb24vaW5jbHVkZS9kdW1wX3R5cGUuaApAQCAtMjgsMjYgKzI4LDI0IEBACiAgIGtEZWJ1Z2dlcmRUb21ic3RvbmVQcm90bywKIH07CiAKLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzdHJlYW0sIGNvbnN0IERlYnVnZ2VyZER1bXBUeXBlJiByaHMpIHsKLSAgc3dpdGNoIChyaHMpIHsKK2lubGluZSBjb25zdCBjaGFyKiBnZXRfZHVtcF90eXBlX25hbWUoY29uc3QgRGVidWdnZXJkRHVtcFR5cGUmIGR1bXBfdHlwZSkgeworICBzd2l0Y2ggKGR1bXBfdHlwZSkgewogICAgIGNhc2Uga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZToKLSAgICAgIHN0cmVhbSA8PCAia0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSI7Ci0gICAgICBicmVhazsKKyAgICAgIHJldHVybiAia0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSI7CiAgICAgY2FzZSBrRGVidWdnZXJkVG9tYnN0b25lOgotICAgICAgc3RyZWFtIDw8ICJrRGVidWdnZXJkVG9tYnN0b25lIjsKLSAgICAgIGJyZWFrOworICAgICAgcmV0dXJuICJrRGVidWdnZXJkVG9tYnN0b25lIjsKICAgICBjYXNlIGtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlOgotICAgICAgc3RyZWFtIDw8ICJrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSI7Ci0gICAgICBicmVhazsKKyAgICAgIHJldHVybiAia0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UiOwogICAgIGNhc2Uga0RlYnVnZ2VyZEFueUludGVyY2VwdDoKLSAgICAgIHN0cmVhbSA8PCAia0RlYnVnZ2VyZEFueUludGVyY2VwdCI7Ci0gICAgICBicmVhazsKKyAgICAgIHJldHVybiAia0RlYnVnZ2VyZEFueUludGVyY2VwdCI7CiAgICAgY2FzZSBrRGVidWdnZXJkVG9tYnN0b25lUHJvdG86Ci0gICAgICBzdHJlYW0gPDwgImtEZWJ1Z2dlcmRUb21ic3RvbmVQcm90byI7Ci0gICAgICBicmVhazsKKyAgICAgIHJldHVybiAia0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvIjsKICAgICBkZWZhdWx0OgotICAgICAgc3RyZWFtIDw8ICJbdW5rbm93bl0iOworICAgICAgcmV0dXJuICJbdW5rbm93bl0iOwogICB9Cit9CiAKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzdHJlYW0sIGNvbnN0IERlYnVnZ2VyZER1bXBUeXBlJiByaHMpIHsKKyAgc3RyZWFtIDw8IGdldF9kdW1wX3R5cGVfbmFtZShyaHMpOwogICByZXR1cm4gc3RyZWFtOwogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2NyYXNoX2R1bXAuY3BwIGIvZGVidWdnZXJkL2NyYXNoX2R1bXAuY3BwCmluZGV4IDM1NjM0MzYuLjA4OTkxMTEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jcmFzaF9kdW1wLmNwcAorKysgYi9kZWJ1Z2dlcmQvY3Jhc2hfZHVtcC5jcHAKQEAgLTMxNyw2ICszMTcsNyBAQAogICAgICAgcHJvY2Vzc19pbmZvLT5nd3BfYXNhbl9zdGF0ZSA9IGNyYXNoX2luZm8tPmRhdGEuZC5nd3BfYXNhbl9zdGF0ZTsKICAgICAgIHByb2Nlc3NfaW5mby0+Z3dwX2FzYW5fbWV0YWRhdGEgPSBjcmFzaF9pbmZvLT5kYXRhLmQuZ3dwX2FzYW5fbWV0YWRhdGE7CiAgICAgICBwcm9jZXNzX2luZm8tPnNjdWRvX3N0YWNrX2RlcG90ID0gY3Jhc2hfaW5mby0+ZGF0YS5kLnNjdWRvX3N0YWNrX2RlcG90OworICAgICAgcHJvY2Vzc19pbmZvLT5zY3Vkb19zdGFja19kZXBvdF9zaXplID0gY3Jhc2hfaW5mby0+ZGF0YS5kLnNjdWRvX3N0YWNrX2RlcG90X3NpemU7CiAgICAgICBwcm9jZXNzX2luZm8tPnNjdWRvX3JlZ2lvbl9pbmZvID0gY3Jhc2hfaW5mby0+ZGF0YS5kLnNjdWRvX3JlZ2lvbl9pbmZvOwogICAgICAgcHJvY2Vzc19pbmZvLT5zY3Vkb19yaW5nX2J1ZmZlciA9IGNyYXNoX2luZm8tPmRhdGEuZC5zY3Vkb19yaW5nX2J1ZmZlcjsKICAgICAgIHByb2Nlc3NfaW5mby0+c2N1ZG9fcmluZ19idWZmZXJfc2l6ZSA9IGNyYXNoX2luZm8tPmRhdGEuZC5zY3Vkb19yaW5nX2J1ZmZlcl9zaXplOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2NyYXNoZXIvYXJtL2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL2NyYXNoZXIvYXJtL2NyYXNoZ2x1ZS5TCmluZGV4IGU0YWRmNDAuLjMwMDFjYTEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jcmFzaGVyL2FybS9jcmFzaGdsdWUuUworKysgYi9kZWJ1Z2dlcmQvY3Jhc2hlci9hcm0vY3Jhc2hnbHVlLlMKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogLmdsb2JsIGNyYXNoMQogLnR5cGUgY3Jhc2gxLCAlZnVuY3Rpb24KIGNyYXNoMToKQEAgLTIzLDEwICszOSwxMSBAQAogCWxkciBsciwgW2xyXQogCWIgLgogCS5jZmlfZW5kcHJvYworCS5zaXplIGNyYXNoMSwgLi1jcmFzaDEKIAotLmdsb2JsIGNyYXNobm9zdGFjawotLnR5cGUgY3Jhc2hub3N0YWNrLCAlZnVuY3Rpb24KLWNyYXNobm9zdGFjazoKKy5nbG9ibCBjcmFzaF9ub19zdGFjaworLnR5cGUgY3Jhc2hfbm9fc3RhY2ssICVmdW5jdGlvbgorY3Jhc2hfbm9fc3RhY2s6CiAJLmNmaV9zdGFydHByb2MKIAltb3YgcjEsIHNwCiAJLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyIHIxCkBAIC0zNSwzICs1Miw0IEBACiAJbGRyIHIwLCBbcjBdCiAJYiAuCiAJLmNmaV9lbmRwcm9jCisJLnNpemUgY3Jhc2hfbm9fc3RhY2ssIC4tY3Jhc2hfbm9fc3RhY2sKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jcmFzaGVyL2FybTY0L2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL2NyYXNoZXIvYXJtNjQvY3Jhc2hnbHVlLlMKaW5kZXggOTdjODI0ZS4uOTBiYTlhMSAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NyYXNoZXIvYXJtNjQvY3Jhc2hnbHVlLlMKKysrIGIvZGVidWdnZXJkL2NyYXNoZXIvYXJtNjQvY3Jhc2hnbHVlLlMKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogLmdsb2JsIGNyYXNoMQogLnR5cGUgY3Jhc2gxLCAlZnVuY3Rpb24KIGNyYXNoMToKQEAgLTQxLDExICs1NywxMiBAQAogCWxkciB4MzAsIFt4MzBdCiAJYiAuCiAJLmNmaV9lbmRwcm9jCisJLnNpemUgY3Jhc2gxLCAuLWNyYXNoMQogCiAKLS5nbG9ibCBjcmFzaG5vc3RhY2sKLS50eXBlIGNyYXNobm9zdGFjaywgJWZ1bmN0aW9uCi1jcmFzaG5vc3RhY2s6CisuZ2xvYmwgY3Jhc2hfbm9fc3RhY2sKKy50eXBlIGNyYXNoX25vX3N0YWNrLCAlZnVuY3Rpb24KK2NyYXNoX25vX3N0YWNrOgogCS5jZmlfc3RhcnRwcm9jCiAJbW92IHgxLCBzcAogCS5jZmlfZGVmX2NmYV9yZWdpc3RlciB4MQpAQCAtNTQsMyArNzEsNDEgQEAKIAlsZHIgeDAsIFt4MF0KIAliIC4KIAkuY2ZpX2VuZHByb2MKKwkuc2l6ZSBjcmFzaF9ub19zdGFjaywgLi1jcmFzaF9ub19zdGFjaworCisKKy5nbG9ibCBjcmFzaF9idGkKKy50eXBlIGNyYXNoX2J0aSwgJWZ1bmN0aW9uCitjcmFzaF9idGk6CisJLmNmaV9zdGFydHByb2MKKwlhZHIgeDE2LCAxZgorCWJyIHgxNgorMToJLy8gRGVsaWJlcmF0bHkgbm90IGEgYnRpIGluc3RydWN0aW9uIHNvIHdlIGNyYXNoIGhlcmUuCisJYiAuCisJLmNmaV9lbmRwcm9jCisJLnNpemUgY3Jhc2hfYnRpLCAuLWNyYXNoX2J0aQorCisKKy5nbG9ibCBjcmFzaF9wYWMKKy50eXBlIGNyYXNoX3BhYywgJWZ1bmN0aW9uCitjcmFzaF9wYWM6CisJLmNmaV9zdGFydHByb2MKKwlwYWNpYXNwCisJLy8gU2luY2Ugc3AgaXMgYSBwYWMgaW5wdXQsIHRoaXMgZW5zdXJlcyBhIG1pc21hdGNoLgorCXN1YiBzcCwgc3AsICMxNgorCWF1dGlhc3AKKwliIC4KKwkuY2ZpX2VuZHByb2MKKwkuc2l6ZSBjcmFzaF9wYWMsIC4tY3Jhc2hfcGFjCisKKy8vIFNldCB0aGUgUEFDIGFuZCBCVEkgYml0cyBmb3IgdGhpcyBvYmplY3QgZmlsZS4KKy5zZWN0aW9uIC5ub3RlLmdudS5wcm9wZXJ0eSwgImEiCisuYmFsaWduIDgKKy5sb25nIDQKKy5sb25nIDB4MTAKKy5sb25nIDB4NQorLmFzY2l6ICJHTlUiCisubG9uZyAweGMwMDAwMDAwCisubG9uZyA0CisubG9uZyAweDMKKy5sb25nIDAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jcmFzaGVyL2NyYXNoZXIuY3BwIGIvZGVidWdnZXJkL2NyYXNoZXIvY3Jhc2hlci5jcHAKaW5kZXggNmExOTg3OC4uM2I1Mjc3NiAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NyYXNoZXIvY3Jhc2hlci5jcHAKKysrIGIvZGVidWdnZXJkL2NyYXNoZXIvY3Jhc2hlci5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVycm9yLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CkBAIC0yOSw2ICszMCw5IEBACiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisKIC8vIFdlIHRlc3QgYm90aCBraW5kcyBvZiBsb2dnaW5nLgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgpAQCAtNTksOCArNjMsMTAgQEAKIC8vIEF2b2lkIG5hbWUgbWFuZ2xpbmcgc28gdGhhdCBzdGFja3MgYXJlIG1vcmUgcmVhZGFibGUuCiBleHRlcm4gIkMiIHsKIAotdm9pZCBjcmFzaDEodm9pZCk7Ci12b2lkIGNyYXNobm9zdGFjayh2b2lkKTsKK3ZvaWQgY3Jhc2gxKCk7Cit2b2lkIGNyYXNoX25vX3N0YWNrKCk7Cit2b2lkIGNyYXNoX2J0aSgpOwordm9pZCBjcmFzaF9wYWMoKTsKIAogaW50IGRvX2FjdGlvbihjb25zdCBjaGFyKiBhcmcpOwogCkBAIC0xNDgsNyArMTU0LDcgQEAKIG5vaW5saW5lIHZvaWQgbGVhaygpIHsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICB2b2lkKiBtYXBwaW5nID0KLSAgICAgICAgICAgIG1tYXAobnVsbHB0ciwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKyAgICAgICAgICAgIG1tYXAobnVsbHB0ciwgZ2V0cGFnZXNpemUoKSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiAgICAgICAgIHN0YXRpY19jYXN0PHZvbGF0aWxlIGNoYXIqPihtYXBwaW5nKVswXSA9ICdhJzsKICAgICB9CiB9CkBAIC0xOTYsMTMgKzIwMiw2IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgIGZkc2FuX2ZpbGUgICAgICAgICAgICBjbG9zZSBhIGZpbGUgZGVzY3JpcHRvciB0aGF0J3Mgb3duZWQgYnkgYSBGSUxFKlxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgIGZkc2FuX2RpciAgICAgICAgICAgICBjbG9zZSBhIGZpbGUgZGVzY3JpcHRvciB0aGF0J3Mgb3duZWQgYnkgYSBESVIqXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgc2VjY29tcCAgICAgICAgICAgICAgIGZhaWwgYSBzZWNjb21wIGNoZWNrXG4iKTsKLSNpZiBkZWZpbmVkKF9fYXJtX18pCi0gICAgZnByaW50ZihzdGRlcnIsICIgIGt1c2VyX2hlbHBlcl92ZXJzaW9uICBjYWxsIGt1c2VyX2hlbHBlcl92ZXJzaW9uXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAga3VzZXJfZ2V0X3RscyAgICAgICAgIGNhbGwga3VzZXJfZ2V0X3Rsc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIGt1c2VyX2NtcHhjaGcgICAgICAgICBjYWxsIGt1c2VyX2NtcHhjaGdcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICBrdXNlcl9tZW1vcnlfYmFycmllciAgY2FsbCBrdXNlcl9tZW1vcnlfYmFycmllclxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIGt1c2VyX2NtcHhjaGc2NCAgICAgICBjYWxsIGt1c2VyX2NtcHhjaGc2NFxuIik7Ci0jZW5kaWYKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgeG9tICAgICAgICAgICAgICAgICAgIHJlYWQgZXhlY3V0ZS1vbmx5IG1lbW9yeVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICBMT0dfQUxXQVlTX0ZBVEFMICAgICAgY2FsbCBsaWJsb2cgTE9HX0FMV0FZU19GQVRBTFxuIik7CkBAIC0yMjMsNiArMjIyLDIwIEBACiAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICBub19uZXdfcHJpdnMgICAgICAgICAgc2V0IFBSX1NFVF9OT19ORVdfUFJJVlMgYW5kIHRoZW4gYWJvcnRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisgICAgZnByaW50ZihzdGRlcnIsICJBbHNvLCBzaW5jZSB0aGlzIGlzIGFuIGFybTMyIGJpbmFyeTpcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICBrdXNlcl9oZWxwZXJfdmVyc2lvbiAgY2FsbCBrdXNlcl9oZWxwZXJfdmVyc2lvblxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIGt1c2VyX2dldF90bHMgICAgICAgICBjYWxsIGt1c2VyX2dldF90bHNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICBrdXNlcl9jbXB4Y2hnICAgICAgICAgY2FsbCBrdXNlcl9jbXB4Y2hnXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAga3VzZXJfbWVtb3J5X2JhcnJpZXIgIGNhbGwga3VzZXJfbWVtb3J5X2JhcnJpZXJcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICBrdXNlcl9jbXB4Y2hnNjQgICAgICAgY2FsbCBrdXNlcl9jbXB4Y2hnNjRcbiIpOworI2VuZGlmCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFsc28sIHNpbmNlIHRoaXMgaXMgYW4gYXJtNjQgYmluYXJ5OlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIGJ0aSAgICAgICAgICAgICAgICAgICBmYWlsIGEgYnJhbmNoIHRhcmdldCBpZGVudGlmaWNhdGlvbiAoQlRJKSBjaGVja1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIHBhYyAgICAgICAgICAgICAgICAgICBmYWlsIGEgcG9pbnRlciBhdXRoZW50aWNhdGlvbiAoUEFDKSBjaGVja1xuIik7CisjZW5kaWYKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICJwcmVmaXggYW55IG9mIHRoZSBhYm92ZSB3aXRoICd0aHJlYWQtJyB0byBydW4gb24gYSBuZXcgdGhyZWFkXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgInByZWZpeCBhbnkgb2YgdGhlIGFib3ZlIHdpdGggJ2V4aGF1c3RmZC0nIHRvIGV4aGF1c3RcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiYWxsIGF2YWlsYWJsZSBmaWxlIGRlc2NyaXB0b3JzIGJlZm9yZSBjcmFzaGluZy5cbiIpOwpAQCAtMjMxLDYgKzI0NCwyMSBAQAogICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiB9CiAKK1tbbWF5YmVfdW51c2VkXV0gc3RhdGljIHZvaWQgQ2hlY2tDcHVGZWF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgc3RkOjpzdHJpbmcgY3B1aW5mbzsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2NwdWluZm8iLCAmY3B1aW5mbykpIHsKKyAgICAgICAgZXJyb3IoMSwgZXJybm8sICJjb3VsZG4ndCByZWFkIC9wcm9jL2NwdWluZm8iKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoY3B1aW5mbywgIlxuIik7CisgICAgZm9yIChzdGQ6OnN0cmluZ192aWV3IGxpbmUgOiBsaW5lcykgeworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OkNvbnN1bWVQcmVmaXgoJmxpbmUsICJGZWF0dXJlc1x0OiIpKSBjb250aW51ZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZlYXR1cmVzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoc3RkOjpzdHJpbmcobGluZSksICIgIik7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoZmVhdHVyZXMuYmVnaW4oKSwgZmVhdHVyZXMuZW5kKCksIG5hbWUpID09IGZlYXR1cmVzLmVuZCgpKSB7CisgICAgICAgICAgZXJyb3IoMSwgMCwgIi9wcm9jL2NwdWluZm8gZG9lcyBub3QgcmVwb3J0IGZlYXR1cmUgJyVzJyIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIG5vaW5saW5lIGludCBkb19hY3Rpb24oY29uc3QgY2hhciogYXJnKSB7CiAgICAgLy8gUHJlZml4ZXMuCiAgICAgaWYgKCFzdHJuY21wKGFyZywgIndhaXQtIiwgc3RybGVuKCJ3YWl0LSIpKSkgewpAQCAtMjU2LDcgKzI4NCw3IEBACiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJzdGFjay1vdmVyZmxvdyIpKSB7CiAgICAgICBvdmVyZmxvd19zdGFjayhudWxscHRyKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgIm5vc3RhY2siKSkgewotICAgICAgY3Jhc2hub3N0YWNrKCk7CisgICAgICBjcmFzaF9ub19zdGFjaygpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiZXhpdCIpKSB7CiAgICAgICBleGl0KDEpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiY2FsbC1udWxsIikpIHsKQEAgLTM1MCw2ICszNzgsMTQgQEAKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgImt1c2VyX2NtcHhjaGc2NCIpKSB7CiAgICAgICAgIHJldHVybiBfX2t1c2VyX2NtcHhjaGc2NCgwLCAwLCAwKTsKICNlbmRpZgorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJidGkiKSkgeworICAgICAgICBDaGVja0NwdUZlYXR1cmUoImJ0aSIpOworICAgICAgICBjcmFzaF9idGkoKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgInBhYyIpKSB7CisgICAgICAgIENoZWNrQ3B1RmVhdHVyZSgicGFjYSIpOworICAgICAgICBjcmFzaF9wYWMoKTsKKyNlbmRpZgogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAibm9fbmV3X3ByaXZzIikpIHsKICAgICAgICAgaWYgKHByY3RsKFBSX1NFVF9OT19ORVdfUFJJVlMsIDEpICE9IDApIHsKICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInByY3RsKFBSX1NFVF9OT19ORVdfUFJJVlMsIDEpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvY3Jhc2hlci9yaXNjdjY0L2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL2NyYXNoZXIvcmlzY3Y2NC9jcmFzaGdsdWUuUwppbmRleCA0MmY1OWIzLi44MDRhNTExIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvY3Jhc2hlci9yaXNjdjY0L2NyYXNoZ2x1ZS5TCisrKyBiL2RlYnVnZ2VyZC9jcmFzaGVyL3Jpc2N2NjQvY3Jhc2hnbHVlLlMKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogLmdsb2JsIGNyYXNoMQogY3Jhc2gxOgogCS5jZmlfc3RhcnRwcm9jCkBAIC00MywxMCArNTksMTEgQEAKIAlsZCB0MiwgMCh6ZXJvKQogCWogLgogCS5jZmlfZW5kcHJvYworCS5zaXplIGNyYXNoMSwgLi1jcmFzaDEKIAogCi0uZ2xvYmwgY3Jhc2hub3N0YWNrCi1jcmFzaG5vc3RhY2s6CisuZ2xvYmwgY3Jhc2hfbm9fc3RhY2sKK2NyYXNoX25vX3N0YWNrOgogCS5jZmlfc3RhcnRwcm9jCiAJbXYgdDEsIHNwCiAJLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyIHQxCkBAIC01NCwzICs3MSw0IEBACiAJbGQgdDIsIDAoemVybykKIAlqIC4KIAkuY2ZpX2VuZHByb2MKKwkuc2l6ZSBjcmFzaF9ub19zdGFjaywgLi1jcmFzaF9ub19zdGFjawpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2NyYXNoZXIveDg2L2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL2NyYXNoZXIveDg2L2NyYXNoZ2x1ZS5TCmluZGV4IGU4ZWIzYTcuLmZlN2M2NDggMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jcmFzaGVyL3g4Ni9jcmFzaGdsdWUuUworKysgYi9kZWJ1Z2dlcmQvY3Jhc2hlci94ODYvY3Jhc2hnbHVlLlMKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogLmdsb2JsIGNyYXNoMQogY3Jhc2gxOgogCW1vdmwgJDB4YTVhNTAwMDAsICVlYXgKQEAgLTYsMTMgKzIyLDE1IEBACiAKIAltb3ZsICQwLCAlZWR4CiAJam1wIColZWR4CisJLnNpemUgY3Jhc2gxLCAuLWNyYXNoMQogCiAKLS5nbG9ibCBjcmFzaG5vc3RhY2sKLWNyYXNobm9zdGFjazoKKy5nbG9ibCBjcmFzaF9ub19zdGFjaworY3Jhc2hfbm9fc3RhY2s6CiAJLmNmaV9zdGFydHByb2MKIAltb3ZsICVlc3AsICVlYXgKIAkuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgJWVheAogCW1vdmwgJDAsICVlc3AKIAltb3ZsICglZXNwKSwgJWVieAogCS5jZmlfZW5kcHJvYworCS5zaXplIGNyYXNoX25vX3N0YWNrLCAuLWNyYXNoX25vX3N0YWNrCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvY3Jhc2hlci94ODZfNjQvY3Jhc2hnbHVlLlMgYi9kZWJ1Z2dlcmQvY3Jhc2hlci94ODZfNjQvY3Jhc2hnbHVlLlMKaW5kZXggOGY2NzIxNC4uYWUxM2FhNyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NyYXNoZXIveDg2XzY0L2NyYXNoZ2x1ZS5TCisrKyBiL2RlYnVnZ2VyZC9jcmFzaGVyL3g4Nl82NC9jcmFzaGdsdWUuUwpAQCAtMSwzICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCiAuZ2xvYmwgY3Jhc2gxCiBjcmFzaDE6CiAJbW92bCAkMHhhNWE1MDAwMCwgJWVheApAQCAtNiwxMyArMjIsMTUgQEAKIAogCW1vdmwgJDAsICVlZHgKIAlqbXAgKiVyZHgKKwkuc2l6ZSBjcmFzaDEsIC4tY3Jhc2gxCiAKIAotLmdsb2JsIGNyYXNobm9zdGFjawotY3Jhc2hub3N0YWNrOgorLmdsb2JsIGNyYXNoX25vX3N0YWNrCitjcmFzaF9ub19zdGFjazoKIAkuY2ZpX3N0YXJ0cHJvYwogCW1vdnEgJXJzcCwgJXJheAogCS5jZmlfZGVmX2NmYV9yZWdpc3RlciAlcmF4CiAJbW92cSAkMCwgJXJzcAogCW1vdnEgKCVyc3ApLCAlcmJ4CiAJLmNmaV9lbmRwcm9jCisJLnNpemUgY3Jhc2hfbm9fc3RhY2ssIC4tY3Jhc2hfbm9fc3RhY2sKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuY3BwIGIvZGVidWdnZXJkL2RlYnVnZ2VyZC5jcHAKaW5kZXggZTIwZThkOS4uMGQ0YjkxZiAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2RlYnVnZ2VyZC5jcHAKKysrIGIvZGVidWdnZXJkL2RlYnVnZ2VyZC5jcHAKQEAgLTQxLDIyICs0MSw2IEBACiAgIF9leGl0KGV4aXRfY29kZSk7CiB9CiAKLXN0YXRpYyBzdGQ6OnRocmVhZCBzcGF3bl9yZWRpcmVjdF90aHJlYWQodW5pcXVlX2ZkIGZkKSB7Ci0gIHJldHVybiBzdGQ6OnRocmVhZChbZmR7IHN0ZDo6bW92ZShmZCkgfV0oKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGNoYXIgYnVmW0JVRlNJWl07Ci0gICAgICBzc2l6ZV90IHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoZmQuZ2V0KCksIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKLSAgICAgIGlmIChyYyA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KFNURE9VVF9GSUxFTk8sIGJ1ZiwgcmMpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0pOwotfQotCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIGlmIChhcmdjIDw9IDEpIHVzYWdlKDApOwogICBpZiAoYXJnYyA+IDMpIHVzYWdlKDEpOwpAQCAtMTA3LDE0ICs5MSwyMCBAQAogICAgIH0KICAgfQogCi0gIHVuaXF1ZV9mZCBwaXBlcmVhZCwgcGlwZXdyaXRlOwotICBpZiAoIVBpcGUoJnBpcGVyZWFkLCAmcGlwZXdyaXRlKSkgewotICAgIGVycigxLCAiZmFpbGVkIHRvIGNyZWF0ZSBwaXBlIik7CisgIC8vIHVuZnJlZXplIGlmIHBpZCBpcyBmcm96ZW4uCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZyZWV6ZV9maWxlID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAorICAgICAgIi9zeXMvZnMvY2dyb3VwL3VpZF8lZC9waWRfJWQvY2dyb3VwLmZyZWV6ZSIsIHByb2NfaW5mby51aWQsIHByb2NfaW5mby5waWQpOworICBpZiAoc3RkOjpzdHJpbmcgZnJlZXplX3N0YXR1czsKKyAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZnJlZXplX2ZpbGUsICZmcmVlemVfc3RhdHVzKSAmJiBmcmVlemVfc3RhdHVzWzBdID09ICcxJykgeworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKCIwIiwgZnJlZXplX2ZpbGUpOworICAgIC8vIHdlIGRvbid0IHJlc3RvcmUgdGhlIGZyb3plbiBzdGF0ZSBhcyB0aGlzIGlzIGNvbnNpZGVyZWQgYSBiZW5pZ24gY2hhbmdlLgogICB9CiAKLSAgc3RkOjp0aHJlYWQgcmVkaXJlY3RfdGhyZWFkID0gc3Bhd25fcmVkaXJlY3RfdGhyZWFkKHN0ZDo6bW92ZShwaXBlcmVhZCkpOwotICBpZiAoIWRlYnVnZ2VyZF90cmlnZ2VyX2R1bXAocHJvY19pbmZvLnBpZCwgZHVtcF90eXBlLCAwLCBzdGQ6Om1vdmUocGlwZXdyaXRlKSkpIHsKLSAgICByZWRpcmVjdF90aHJlYWQuam9pbigpOworICB1bmlxdWVfZmQgb3V0cHV0X2ZkKGZjbnRsKFNURE9VVF9GSUxFTk8sIEZfRFVQRkRfQ0xPRVhFQywgMCkpOworICBpZiAob3V0cHV0X2ZkLmdldCgpID09IC0xKSB7CisgICAgZXJyKDEsICJmYWlsZWQgdG8gZmNudGwgZHVwIHN0ZG91dCIpOworICB9CisgIGlmICghZGVidWdnZXJkX3RyaWdnZXJfZHVtcChwcm9jX2luZm8ucGlkLCBkdW1wX3R5cGUsIDAsIHN0ZDo6bW92ZShvdXRwdXRfZmQpKSkgewogICAgIGlmIChwaWQgPT0gcHJvY19pbmZvLnBpZCkgewogICAgICAgZXJyeCgxLCAiZmFpbGVkIHRvIGR1bXAgcHJvY2VzcyAlZCIsIHBpZCk7CiAgICAgfSBlbHNlIHsKQEAgLTEyMiw2ICsxMTIsNSBAQAogICAgIH0KICAgfQogCi0gIHJlZGlyZWN0X3RocmVhZC5qb2luKCk7CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2RlYnVnZ2VyZF90ZXN0LmNwcCBiL2RlYnVnZ2VyZC9kZWJ1Z2dlcmRfdGVzdC5jcHAKaW5kZXggNGNkNjE5My4uYzA1MjJhYSAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2RlYnVnZ2VyZF90ZXN0LmNwcAorKysgYi9kZWJ1Z2dlcmQvZGVidWdnZXJkX3Rlc3QuY3BwCkBAIC05NCw3ICs5NCw3IEBACiAgICAgaWYgKHNpZ2FjdGlvbihTSUdBTFJNLCAmbmV3X3NpZ2FjdGlvbiwgJm9sZF9zaWdhY3Rpb24pICE9IDApIHsgXAogICAgICAgZXJyKDEsICJzaWdhY3Rpb24gZmFpbGVkIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWxhcm0oc2Vjb25kcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFsYXJtKHNlY29uZHMgKiBhbmRyb2lkOjpiYXNlOjpId1RpbWVvdXRNdWx0aXBsaWVyKCkpOyAgICAgICAgIFwKICAgICBhdXRvIHZhbHVlID0gZXhwcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGlmIChzaWdhY3Rpb24oU0lHQUxSTSwgJm9sZF9zaWdhY3Rpb24sIG51bGxwdHIpICE9IDApIHsgICAgICAgIFwKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgICAgICAgICAgICAgUiIoI1xkXGQgcGMgWzAtOWEtZl0rXHMrIFxTKyAoXChvZmZzZXQgMHhbMC05YS1mXStcKSApP1woKSIgZnJhbWVfbmFtZSBSIihcKykiKTsKIAogc3RhdGljIHZvaWQgdG9tYnN0b25lZF9pbnRlcmNlcHQocGlkX3QgdGFyZ2V0X3BpZCwgdW5pcXVlX2ZkKiBpbnRlcmNlcHRfZmQsIHVuaXF1ZV9mZCogb3V0cHV0X2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJjZXB0U3RhdHVzKiBzdGF0dXMsIERlYnVnZ2VyZER1bXBUeXBlIGludGVyY2VwdF90eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmNlcHRSZXNwb25zZSogcmVzcG9uc2UsIERlYnVnZ2VyZER1bXBUeXBlIGludGVyY2VwdF90eXBlKSB7CiAgIGludGVyY2VwdF9mZC0+cmVzZXQoc29ja2V0X2xvY2FsX2NsaWVudChrVG9tYnN0b25lZEludGVyY2VwdFNvY2tldE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NPQ0tFVF9OQU1FU1BBQ0VfUkVTRVJWRUQsIFNPQ0tfU0VRUEFDS0VUKSk7CiAgIGlmIChpbnRlcmNlcHRfZmQtPmdldCgpID09IC0xKSB7CkBAIC0xNTUsMTggKzE1NSwxNSBAQAogICAgIEZBSUwoKSA8PCAiZmFpbGVkIHRvIHNlbmQgb3V0cHV0IGZkIHRvIHRvbWJzdG9uZWQ6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwogICB9CiAKLSAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2U7Ci0gIHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoaW50ZXJjZXB0X2ZkLT5nZXQoKSwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSk7CisgIHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoaW50ZXJjZXB0X2ZkLT5nZXQoKSwgcmVzcG9uc2UsIHNpemVvZigqcmVzcG9uc2UpKSk7CiAgIGlmIChyYyA9PSAtMSkgewogICAgIEZBSUwoKSA8PCAiZmFpbGVkIHRvIHJlYWQgcmVzcG9uc2UgZnJvbSB0b21ic3RvbmVkOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKICAgfSBlbHNlIGlmIChyYyA9PSAwKSB7CiAgICAgRkFJTCgpIDw8ICJmYWlsZWQgdG8gcmVhZCByZXNwb25zZSBmcm9tIHRvbWJzdG9uZWQgKEVPRikiOwotICB9IGVsc2UgaWYgKHJjICE9IHNpemVvZihyZXNwb25zZSkpIHsKLSAgICBGQUlMKCkgPDwgInJlY2VpdmVkIHBhY2tldCBvZiB1bmV4cGVjdGVkIGxlbmd0aCBmcm9tIHRvbWJzdG9uZWQ6IGV4cGVjdGVkICIgPDwgc2l6ZW9mKHJlc3BvbnNlKQorICB9IGVsc2UgaWYgKHJjICE9IHNpemVvZigqcmVzcG9uc2UpKSB7CisgICAgRkFJTCgpIDw8ICJyZWNlaXZlZCBwYWNrZXQgb2YgdW5leHBlY3RlZCBsZW5ndGggZnJvbSB0b21ic3RvbmVkOiBleHBlY3RlZCAiIDw8IHNpemVvZigqcmVzcG9uc2UpCiAgICAgICAgICAgIDw8ICIsIHJlY2VpdmVkICIgPDwgcmM7CiAgIH0KLQotICAqc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzOwogfQogCiBzdGF0aWMgYm9vbCBwYWNfc3VwcG9ydGVkKCkgewpAQCAtMjI1LDkgKzIyMiwxMCBAQAogICAgIEZBSUwoKSA8PCAiY3Jhc2hlciBoYXNuJ3QgYmVlbiBzdGFydGVkIjsKICAgfQogCi0gIEludGVyY2VwdFN0YXR1cyBzdGF0dXM7Ci0gIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGNyYXNoZXJfcGlkLCAmdGhpcy0+aW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQsICZzdGF0dXMsIGludGVyY2VwdF90eXBlKTsKLSAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHN0YXR1cyk7CisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGNyYXNoZXJfcGlkLCAmdGhpcy0+aW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQsICZyZXNwb25zZSwgaW50ZXJjZXB0X3R5cGUpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKIH0KIAogdm9pZCBDcmFzaGVyVGVzdDo6RmluaXNoSW50ZXJjZXB0KGludCogcmVzdWx0KSB7CkBAIC0zMDAsMjQgKzI5OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIENvbnN1bWVGZCh1bmlxdWVfZmQgZmQsIHN0ZDo6c3RyaW5nKiBvdXRwdXQpIHsKLSAgY29uc3RleHByIHNpemVfdCByZWFkX2xlbmd0aCA9IFBBR0VfU0laRTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0OwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgc2l6ZV90IG9mZnNldCA9IHJlc3VsdC5zaXplKCk7Ci0gICAgcmVzdWx0LnJlc2l6ZShyZXN1bHQuc2l6ZSgpICsgUEFHRV9TSVpFKTsKLSAgICBzc2l6ZV90IHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoZmQuZ2V0KCksICZyZXN1bHRbb2Zmc2V0XSwgcmVhZF9sZW5ndGgpKTsKLSAgICBpZiAocmMgPT0gLTEpIHsKLSAgICAgIEZBSUwoKSA8PCAicmVhZCBmYWlsZWQ6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIH0gZWxzZSBpZiAocmMgPT0gMCkgewotICAgICAgcmVzdWx0LnJlc2l6ZShyZXN1bHQuc2l6ZSgpIC0gUEFHRV9TSVpFKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJlc3VsdC5yZXNpemUocmVzdWx0LnNpemUoKSAtIFBBR0VfU0laRSArIHJjKTsKLSAgfQotCi0gICpvdXRwdXQgPSBzdGQ6Om1vdmUocmVzdWx0KTsKKyAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6UmVhZEZkVG9TdHJpbmcoZmQsIG91dHB1dCkpOwogfQogCiBjbGFzcyBMb2djYXRDb2xsZWN0b3IgewpAQCAtMTc2MSw5ICsxNzQyLDEwIEBACiAgICAgcGlkX3QgcGlkID0gMTIzJzQ1Nic3ODkgKyBpOwogCiAgICAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZCwgb3V0cHV0X2ZkOwotICAgIEludGVyY2VwdFN0YXR1cyBzdGF0dXM7Ci0gICAgdG9tYnN0b25lZF9pbnRlcmNlcHQocGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmc3RhdHVzLCBrRGVidWdnZXJkVG9tYnN0b25lKTsKLSAgICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgc3RhdHVzKTsKKyAgICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICAgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KHBpZCwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnJlc3BvbnNlLCBrRGVidWdnZXJkVG9tYnN0b25lKTsKKyAgICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOwogCiAgICAgewogICAgICAgdW5pcXVlX2ZkIHRvbWJzdG9uZWRfc29ja2V0LCBpbnB1dF9mZDsKQEAgLTE3OTUsOSArMTc3NywxMCBAQAogICAgICAgcGlkX3QgcGlkID0gcGlkX2Jhc2UgKyBkdW1wOwogCiAgICAgICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7Ci0gICAgICBJbnRlcmNlcHRTdGF0dXMgc3RhdHVzOwotICAgICAgdG9tYnN0b25lZF9pbnRlcmNlcHQocGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmc3RhdHVzLCBrRGVidWdnZXJkVG9tYnN0b25lKTsKLSAgICAgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCBzdGF0dXMpOworICAgICAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2UgPSB7fTsKKyAgICAgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KHBpZCwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnJlc3BvbnNlLCBrRGVidWdnZXJkVG9tYnN0b25lKTsKKyAgICAgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICAgICAgPDwgIkVycm9yIG1lc3NlYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CiAKICAgICAgIC8vIFByZXRlbmQgdG8gY3Jhc2gsIGFuZCB0aGVuIGltbWVkaWF0ZWx5IGNsb3NlIHRoZSBzb2NrZXQuCiAgICAgICB1bmlxdWVfZmQgc29ja2ZkKHNvY2tldF9sb2NhbF9jbGllbnQoa1RvbWJzdG9uZWRDcmFzaFNvY2tldE5hbWUsCkBAIC0xODI4LDkgKzE4MTEsMTAgQEAKICAgICAgIHBpZF90IHBpZCA9IHBpZF9iYXNlICsgZHVtcDsKIAogICAgICAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZCwgb3V0cHV0X2ZkOwotICAgICAgSW50ZXJjZXB0U3RhdHVzIHN0YXR1czsKLSAgICAgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KHBpZCwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnN0YXR1cywga0RlYnVnZ2VyZFRvbWJzdG9uZSk7Ci0gICAgICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgc3RhdHVzKTsKKyAgICAgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgICAgICB0b21ic3RvbmVkX2ludGVyY2VwdChwaWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwga0RlYnVnZ2VyZFRvbWJzdG9uZSk7CisgICAgICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CiAKICAgICAgIHsKICAgICAgICAgdW5pcXVlX2ZkIHRvbWJzdG9uZWRfc29ja2V0LCBpbnB1dF9mZDsKQEAgLTE4NTUsMTYgKzE4MzksMTcgQEAKICAgfQogfQogCi1URVNUKHRvbWJzdG9uZWQsIGphdmFfdHJhY2VfaW50ZXJjZXB0X3Ntb2tlKSB7CitURVNUKHRvbWJzdG9uZWQsIGludGVyY2VwdF9qYXZhX3RyYWNlX3Ntb2tlKSB7CiAgIC8vIFVzaW5nIGEgInJlYWwiIFBJRCBpcyBhIGxpdHRsZSBkYW5nZXJvdXMgaGVyZSAtIGlmIHRoZSB0ZXN0IGZhaWxzCiAgIC8vIG9yIGNyYXNoZXMsIHdlIG1pZ2h0IGVuZCB1cCBnZXR0aW5nIGEgYm9ndXMgLyB1bnJlbGlhYmxlIHN0YWNrCiAgIC8vIHRyYWNlLgogICBjb25zdCBwaWRfdCBzZWxmID0gZ2V0cGlkKCk7CiAKICAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZCwgb3V0cHV0X2ZkOwotICBJbnRlcmNlcHRTdGF0dXMgc3RhdHVzOwotICB0b21ic3RvbmVkX2ludGVyY2VwdChzZWxmLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmc3RhdHVzLCBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSk7Ci0gIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCBzdGF0dXMpOworICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICB0b21ic3RvbmVkX2ludGVyY2VwdChzZWxmLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlKTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CiAKICAgLy8gRmlyc3QgY29ubmVjdCB0byB0b21ic3RvbmVkIHJlcXVlc3RpbmcgYSBuYXRpdmUgdG9tYnN0b25lLiBUaGlzCiAgIC8vIHNob3VsZCByZXN1bHQgaW4gYSAicmVndWxhciIgRkQgYW5kIG5vdCB0aGUgaW5zdGFsbGVkIGludGVyY2VwdC4KQEAgLTE4ODYsMjUgKzE4NzEsOTYgQEAKICAgQVNTRVJUX1NUUkVRKCJqYXZhIiwgb3V0YnVmKTsKIH0KIAotVEVTVCh0b21ic3RvbmVkLCBtdWx0aXBsZV9pbnRlcmNlcHRzKSB7CitURVNUKHRvbWJzdG9uZWQsIGludGVyY2VwdF9tdWx0aXBsZV9kdW1wX3R5cGVzKSB7CiAgIGNvbnN0IHBpZF90IGZha2VfcGlkID0gMScyMzQnNTY3OwogICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7Ci0gIEludGVyY2VwdFN0YXR1cyBzdGF0dXM7Ci0gIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmc3RhdHVzLCBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSk7Ci0gIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCBzdGF0dXMpOworICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnJlc3BvbnNlLCBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOwogCiAgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmRfMiwgb3V0cHV0X2ZkXzI7Ci0gIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkXzIsICZvdXRwdXRfZmRfMiwgJnN0YXR1cywga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSk7Ci0gIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtGYWlsZWRBbHJlYWR5UmVnaXN0ZXJlZCwgc3RhdHVzKTsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmRfMiwgJm91dHB1dF9mZF8yLCAmcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKK30KKworVEVTVCh0b21ic3RvbmVkLCBpbnRlcmNlcHRfYmFkX3BpZCkgeworICBjb25zdCBwaWRfdCBmYWtlX3BpZCA9IC0xOworICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7CisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprRmFpbGVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworICBBU1NFUlRfTUFUQ0gocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSwgImJhZCBwaWQiKTsKK30KKworVEVTVCh0b21ic3RvbmVkLCBpbnRlcmNlcHRfYmFkX2R1bXBfdHlwZXMpIHsKKyAgY29uc3QgcGlkX3QgZmFrZV9waWQgPSAxJzIzNCc1Njc7CisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQsIG91dHB1dF9mZDsKKyAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2UgPSB7fTsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RGVidWdnZXJkRHVtcFR5cGU+KDIwKSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtGYWlsZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CisgIEFTU0VSVF9NQVRDSChyZXNwb25zZS5lcnJvcl9tZXNzYWdlLCAiYmFkIGR1bXAgdHlwZSBcXFt1bmtub3duXFxdIik7CisKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwga0RlYnVnZ2VyZEFueUludGVyY2VwdCk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtGYWlsZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CisgIEFTU0VSVF9NQVRDSChyZXNwb25zZS5lcnJvcl9tZXNzYWdlLCAiYmFkIGR1bXAgdHlwZSBrRGVidWdnZXJkQW55SW50ZXJjZXB0Iik7CisKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvKTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a0ZhaWxlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKyAgQVNTRVJUX01BVENIKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UsICJiYWQgZHVtcCB0eXBlIGtEZWJ1Z2dlcmRUb21ic3RvbmVQcm90byIpOworfQorCitURVNUKHRvbWJzdG9uZWQsIGludGVyY2VwdF9hbHJlYWR5X3JlZ2lzdGVyZWQpIHsKKyAgY29uc3QgcGlkX3QgZmFrZV9waWQgPSAxJzIzNCc1Njc7CisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQxLCBvdXRwdXRfZmQxOworICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZDEsICZvdXRwdXRfZmQxLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKworICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkMiwgb3V0cHV0X2ZkMjsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQyLCAmb3V0cHV0X2ZkMiwgJnJlc3BvbnNlLCBrRGVidWdnZXJkVG9tYnN0b25lKTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a0ZhaWxlZEFscmVhZHlSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworICBBU1NFUlRfTUFUQ0gocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSwgImFscmVhZHkgcmVnaXN0ZXJlZCwgdHlwZSBrRGVidWdnZXJkVG9tYnN0b25lIik7Cit9CisKK1RFU1QodG9tYnN0b25lZCwgaW50ZXJjZXB0X3RvbWJzdG9uZV9wcm90b19tYXRjaGVkX3RvX3RvbWJzdG9uZSkgeworICBjb25zdCBwaWRfdCBmYWtlX3BpZCA9IDEnMjM0JzU2NzsKKworICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7CisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKworICBjb25zdCBjaGFyIGRhdGFbXSA9ICJ0b21ic3RvbmVfcHJvdG8iOworICB1bmlxdWVfZmQgdG9tYnN0b25lZF9zb2NrZXQsIGlucHV0X2ZkOworICBBU1NFUlRfVFJVRSgKKyAgICAgIHRvbWJzdG9uZWRfY29ubmVjdChmYWtlX3BpZCwgJnRvbWJzdG9uZWRfc29ja2V0LCAmaW5wdXRfZmQsIGtEZWJ1Z2dlcmRUb21ic3RvbmVQcm90bykpOworICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGlucHV0X2ZkLmdldCgpLCBkYXRhLCBzaXplb2YoZGF0YSkpKTsKKyAgdG9tYnN0b25lZF9ub3RpZnlfY29tcGxldGlvbih0b21ic3RvbmVkX3NvY2tldC5nZXQoKSk7CisKKyAgY2hhciBvdXRidWZbc2l6ZW9mKGRhdGEpXTsKKyAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KG91dHB1dF9mZC5nZXQoKSwgb3V0YnVmLCBzaXplb2Yob3V0YnVmKSkpOworICBBU1NFUlRfU1RSRVEoInRvbWJzdG9uZV9wcm90byIsIG91dGJ1Zik7CiB9CiAKIFRFU1QodG9tYnN0b25lZCwgaW50ZXJjZXB0X2FueSkgewogICBjb25zdCBwaWRfdCBmYWtlX3BpZCA9IDEnMjM0JzU2NzsKIAogICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7Ci0gIEludGVyY2VwdFN0YXR1cyBzdGF0dXM7Ci0gIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmc3RhdHVzLCBrRGVidWdnZXJkTmF0aXZlQmFja3RyYWNlKTsKLSAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHN0YXR1cyk7CisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKIAogICBjb25zdCBjaGFyIGFueVtdID0gImFueSI7CiAgIHVuaXF1ZV9mZCB0b21ic3RvbmVkX3NvY2tldCwgaW5wdXRfZmQ7CkBAIC0xOTE3LDYgKzE5NzMsNzcgQEAKICAgQVNTRVJUX1NUUkVRKCJhbnkiLCBvdXRidWYpOwogfQogCitURVNUKHRvbWJzdG9uZWQsIGludGVyY2VwdF9hbnlfZmFpbGVkX3dpdGhfbXVsdGlwbGVfaW50ZXJjZXB0cykgeworICBjb25zdCBwaWRfdCBmYWtlX3BpZCA9IDEnMjM0JzU2NzsKKworICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkMSwgb3V0cHV0X2ZkMTsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQxLCAmb3V0cHV0X2ZkMSwgJnJlc3BvbnNlLCBrRGVidWdnZXJkTmF0aXZlQmFja3RyYWNlKTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CisKKyAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZDIsIG91dHB1dF9mZDI7CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkMiwgJm91dHB1dF9mZDIsICZyZXNwb25zZSwga0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKworICB1bmlxdWVfZmQgdG9tYnN0b25lZF9zb2NrZXQsIGlucHV0X2ZkOworICBBU1NFUlRfRkFMU0UodG9tYnN0b25lZF9jb25uZWN0KGZha2VfcGlkLCAmdG9tYnN0b25lZF9zb2NrZXQsICZpbnB1dF9mZCwga0RlYnVnZ2VyZEFueUludGVyY2VwdCkpOworfQorCitURVNUKHRvbWJzdG9uZWQsIGludGVyY2VwdF9tdWx0aXBsZV92ZXJpZnlfaW50ZXJjZXB0KSB7CisgIC8vIE5lZWQgdG8gdXNlIG91ciBwaWQgZm9yIGphdmEgc2luY2UgdGhhdCB3aWxsIHZlcmlmeSB0aGUgcGlkLgorICBjb25zdCBwaWRfdCBmYWtlX3BpZCA9IGdldHBpZCgpOworCisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQxLCBvdXRwdXRfZmQxOworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZDEsICZvdXRwdXRfZmQxLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKworICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkMiwgb3V0cHV0X2ZkMjsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQyLCAmb3V0cHV0X2ZkMiwgJnJlc3BvbnNlLCBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworCisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQzLCBvdXRwdXRfZmQzOworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZDMsICZvdXRwdXRfZmQzLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKworICBjb25zdCBjaGFyIG5hdGl2ZV9kYXRhW10gPSAibmF0aXZlIjsKKyAgdW5pcXVlX2ZkIHRvbWJzdG9uZWRfc29ja2V0MSwgaW5wdXRfZmQxOworICBBU1NFUlRfVFJVRSgKKyAgICAgIHRvbWJzdG9uZWRfY29ubmVjdChmYWtlX3BpZCwgJnRvbWJzdG9uZWRfc29ja2V0MSwgJmlucHV0X2ZkMSwga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSkpOworICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGlucHV0X2ZkMS5nZXQoKSwgbmF0aXZlX2RhdGEsIHNpemVvZihuYXRpdmVfZGF0YSkpKTsKKyAgdG9tYnN0b25lZF9ub3RpZnlfY29tcGxldGlvbih0b21ic3RvbmVkX3NvY2tldDEuZ2V0KCkpOworCisgIGNoYXIgbmF0aXZlX291dGJ1ZltzaXplb2YobmF0aXZlX2RhdGEpXTsKKyAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KG91dHB1dF9mZDEuZ2V0KCksIG5hdGl2ZV9vdXRidWYsIHNpemVvZihuYXRpdmVfb3V0YnVmKSkpOworICBBU1NFUlRfU1RSRVEoIm5hdGl2ZSIsIG5hdGl2ZV9vdXRidWYpOworCisgIGNvbnN0IGNoYXIgamF2YV9kYXRhW10gPSAiamF2YSI7CisgIHVuaXF1ZV9mZCB0b21ic3RvbmVkX3NvY2tldDIsIGlucHV0X2ZkMjsKKyAgQVNTRVJUX1RSVUUoCisgICAgICB0b21ic3RvbmVkX2Nvbm5lY3QoZmFrZV9waWQsICZ0b21ic3RvbmVkX3NvY2tldDIsICZpbnB1dF9mZDIsIGtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlKSk7CisgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoaW5wdXRfZmQyLmdldCgpLCBqYXZhX2RhdGEsIHNpemVvZihqYXZhX2RhdGEpKSk7CisgIHRvbWJzdG9uZWRfbm90aWZ5X2NvbXBsZXRpb24odG9tYnN0b25lZF9zb2NrZXQyLmdldCgpKTsKKworICBjaGFyIGphdmFfb3V0YnVmW3NpemVvZihqYXZhX2RhdGEpXTsKKyAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KG91dHB1dF9mZDIuZ2V0KCksIGphdmFfb3V0YnVmLCBzaXplb2YoamF2YV9vdXRidWYpKSk7CisgIEFTU0VSVF9TVFJFUSgiamF2YSIsIGphdmFfb3V0YnVmKTsKKworICBjb25zdCBjaGFyIHRvbWJfZGF0YVtdID0gInRvbWJzdG9uZSI7CisgIHVuaXF1ZV9mZCB0b21ic3RvbmVkX3NvY2tldDMsIGlucHV0X2ZkMzsKKyAgQVNTRVJUX1RSVUUodG9tYnN0b25lZF9jb25uZWN0KGZha2VfcGlkLCAmdG9tYnN0b25lZF9zb2NrZXQzLCAmaW5wdXRfZmQzLCBrRGVidWdnZXJkVG9tYnN0b25lKSk7CisgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoaW5wdXRfZmQzLmdldCgpLCB0b21iX2RhdGEsIHNpemVvZih0b21iX2RhdGEpKSk7CisgIHRvbWJzdG9uZWRfbm90aWZ5X2NvbXBsZXRpb24odG9tYnN0b25lZF9zb2NrZXQzLmdldCgpKTsKKworICBjaGFyIHRvbWJfb3V0YnVmW3NpemVvZih0b21iX2RhdGEpXTsKKyAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KG91dHB1dF9mZDMuZ2V0KCksIHRvbWJfb3V0YnVmLCBzaXplb2YodG9tYl9vdXRidWYpKSk7CisgIEFTU0VSVF9TVFJFUSgidG9tYnN0b25lIiwgdG9tYl9vdXRidWYpOworfQorCiBURVNUKHRvbWJzdG9uZWQsIGludGVyY2VwdGxlc3NfYmFja3RyYWNlKSB7CiAgIC8vIEdlbmVyYXRlIDUwIGJhY2t0cmFjZXMsIGFuZCB0aGVuIGNoZWNrIHRvIHNlZSB0aGF0IHdlIGhhdmVuJ3QgY3JlYXRlZCA1MCBuZXcgdG9tYnN0b25lcy4KICAgYXV0byBnZXRfdG9tYnN0b25lX3RpbWVzdGFtcHMgPSBbXSgpIC0+IHN0ZDo6bWFwPGludCwgdGltZV90PiB7CkBAIC0yMDk0LDI4ICsyMjIxLDEwIEBACiAgIEFTU0VSVF9NQVRDSChyZXN1bHQsIG1hdGNoX3N0cik7CiB9CiAKLVRFU1QodG9tYnN0b25lZCwgcHJvdG8pIHsKLSAgY29uc3QgcGlkX3Qgc2VsZiA9IGdldHBpZCgpOwotICB1bmlxdWVfZmQgdG9tYnN0b25lZF9zb2NrZXQsIHRleHRfZmQsIHByb3RvX2ZkOwotICBBU1NFUlRfVFJVRSgKLSAgICAgIHRvbWJzdG9uZWRfY29ubmVjdChzZWxmLCAmdG9tYnN0b25lZF9zb2NrZXQsICZ0ZXh0X2ZkLCAmcHJvdG9fZmQsIGtEZWJ1Z2dlcmRUb21ic3RvbmVQcm90bykpOwotCi0gIHRvbWJzdG9uZWRfbm90aWZ5X2NvbXBsZXRpb24odG9tYnN0b25lZF9zb2NrZXQuZ2V0KCkpOwotCi0gIEFTU0VSVF9ORSgtMSwgdGV4dF9mZC5nZXQoKSk7Ci0gIEFTU0VSVF9ORSgtMSwgcHJvdG9fZmQuZ2V0KCkpOwotCi0gIHN0cnVjdCBzdGF0IHRleHRfc3Q7Ci0gIEFTU0VSVF9FUSgwLCBmc3RhdCh0ZXh0X2ZkLmdldCgpLCAmdGV4dF9zdCkpOwotCi0gIC8vIEdpdmUgdG9tYnN0b25lZCBzb21lIHRpbWUgdG8gbGluayB0aGUgZmlsZXMgaW50byBwbGFjZS4KLSAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zKTsKLQotICAvLyBGaW5kIHRoZSB0b21ic3RvbmUuCi0gIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IHRvbWJzdG9uZV9maWxlOwordm9pZCBDaGVja0ZvclRvbWJzdG9uZShjb25zdCBzdHJ1Y3Qgc3RhdCYgdGV4dF9zdCwgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHRvbWJzdG9uZV9maWxlKSB7CisgIHN0YXRpYyBzdGQ6OnJlZ2V4IHRvbWJzdG9uZV9yZSgidG9tYnN0b25lX1xcZCsiKTsKICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgZGVjbHR5cGUoJmNsb3NlZGlyKT4gZGlyX2gob3BlbmRpcigiL2RhdGEvdG9tYnN0b25lcyIpLCBjbG9zZWRpcik7CiAgIEFTU0VSVF9UUlVFKGRpcl9oICE9IG51bGxwdHIpOwotICBzdGQ6OnJlZ2V4IHRvbWJzdG9uZV9yZSgidG9tYnN0b25lX1xcZCsiKTsKICAgZGlyZW50KiBlbnRyeTsKICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyX2guZ2V0KCkpKSAhPSBudWxscHRyKSB7CiAgICAgaWYgKCFzdGQ6OnJlZ2V4X21hdGNoKGVudHJ5LT5kX25hbWUsIHRvbWJzdG9uZV9yZSkpIHsKQEAgLTIxMzMsOCArMjI0MiwzOCBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICB9Cit9CiAKLSAgQVNTRVJUX1RSVUUodG9tYnN0b25lX2ZpbGUpOworVEVTVCh0b21ic3RvbmVkLCBwcm90bykgeworICBjb25zdCBwaWRfdCBzZWxmID0gZ2V0cGlkKCk7CisgIHVuaXF1ZV9mZCB0b21ic3RvbmVkX3NvY2tldCwgdGV4dF9mZCwgcHJvdG9fZmQ7CisgIEFTU0VSVF9UUlVFKAorICAgICAgdG9tYnN0b25lZF9jb25uZWN0KHNlbGYsICZ0b21ic3RvbmVkX3NvY2tldCwgJnRleHRfZmQsICZwcm90b19mZCwga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvKSk7CisKKyAgdG9tYnN0b25lZF9ub3RpZnlfY29tcGxldGlvbih0b21ic3RvbmVkX3NvY2tldC5nZXQoKSk7CisKKyAgQVNTRVJUX05FKC0xLCB0ZXh0X2ZkLmdldCgpKTsKKyAgQVNTRVJUX05FKC0xLCBwcm90b19mZC5nZXQoKSk7CisKKyAgc3RydWN0IHN0YXQgdGV4dF9zdDsKKyAgQVNTRVJUX0VRKDAsIGZzdGF0KHRleHRfZmQuZ2V0KCksICZ0ZXh0X3N0KSk7CisKKyAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gdG9tYnN0b25lX2ZpbGU7CisgIC8vIEFsbG93IHVwIHRvIDUgc2Vjb25kcyBmb3IgdGhlIHRvbWJzdG9uZSB0byBiZSB3cml0dGVuIHRvIHRoZSBzeXN0ZW0uCisgIGNvbnN0IGF1dG8gbWF4X3dhaXRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpICogYW5kcm9pZDo6YmFzZTo6SHdUaW1lb3V0TXVsdGlwbGllcigpOworICBjb25zdCBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zKTsKKyAgICBDaGVja0ZvclRvbWJzdG9uZSh0ZXh0X3N0LCB0b21ic3RvbmVfZmlsZSk7CisgICAgaWYgKHRvbWJzdG9uZV9maWxlKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpIC0gc3RhcnQgPiBtYXhfd2FpdF90aW1lKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBBU1NFUlRfVFJVRSh0b21ic3RvbmVfZmlsZSkgPDwgIlRpbWVkIG91dCB0cnlpbmcgdG8gZmluZCB0b21ic3RvbmUgZmlsZS4iOwogICBzdGQ6OnN0cmluZyBwcm90b19wYXRoID0gdG9tYnN0b25lX2ZpbGUudmFsdWUoKSArICIucGIiOwogCiAgIHN0cnVjdCBzdGF0IHByb3RvX2ZkX3N0OwpAQCAtMjE0OSwxMCArMjI4OCwxMSBAQAogVEVTVCh0b21ic3RvbmVkLCBwcm90b19pbnRlcmNlcHQpIHsKICAgY29uc3QgcGlkX3Qgc2VsZiA9IGdldHBpZCgpOwogICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7Ci0gIEludGVyY2VwdFN0YXR1cyBzdGF0dXM7CiAKLSAgdG9tYnN0b25lZF9pbnRlcmNlcHQoc2VsZiwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnN0YXR1cywga0RlYnVnZ2VyZFRvbWJzdG9uZSk7Ci0gIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCBzdGF0dXMpOworICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICB0b21ic3RvbmVkX2ludGVyY2VwdChzZWxmLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKIAogICB1bmlxdWVfZmQgdG9tYnN0b25lZF9zb2NrZXQsIHRleHRfZmQsIHByb3RvX2ZkOwogICBBU1NFUlRfVFJVRSgKQEAgLTIyODEsMTAgKzI0MjEsMTQgQEAKIAogICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihcbm1lbW9yeSBtYXAgXCguKlwpOiBcKGZhdWx0IGFkZHJlc3MgcHJlZml4ZWQgd2l0aCAtLS0+KVxuKSIpOwogCi0gIC8vIEFzc3VtZXMgdGhhdCB0aGUgb3BlbiBmaWxlcyBzZWN0aW9uIGNvbWVzIGFmdGVyIHRoZSBtYXAgc2VjdGlvbi4KLSAgLy8gSWYgdGhhdCBhc3N1bXB0aW9uIGNoYW5nZXMsIHRoZSByZWdleCBiZWxvdyBuZWVkcyB0byBjaGFuZ2UuCisgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGZhdWx0IGFkZHJlc3MgZXJyb3IgbWVzc2FnZSBpcyBhdCB0aGUgZW5kIG9mIHRoZQorICAvLyBtYXBzIHNlY3Rpb24uIFRvIGRvIHRoaXMsIHRoZSBjaGVjayBiZWxvdyBsb29rcyBmb3IgdGhlIHN0YXJ0IG9mIHRoZQorICAvLyBvcGVuIGZpbGVzIHNlY3Rpb24gb3IgdGhlIHN0YXJ0IG9mIHRoZSBsb2cgZmlsZSBzZWN0aW9uLiBJdCdzIHBvc3NpYmxlCisgIC8vIGZvciBlaXRoZXIgb2YgdGhlc2Ugc2VjdGlvbnMgdG8gYmUgcHJlc2VudCBhZnRlciB0aGUgbWFwcyBzZWN0aW9uIHJpZ2h0CisgIC8vIG5vdy4KKyAgLy8gSWYgdGhlIHNlY3Rpb25zIG1vdmUgYXJvdW5kLCB0aGlzIGNoZWNrIG1pZ2h0IG5lZWQgdG8gYmUgbW9kaWZpZWQuCiAgIG1hdGNoX3N0ciA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgIFIiKFxuLS0tPkZhdWx0IGFkZHJlc3MgZmFsbHMgYXQgJXMgYWZ0ZXIgYW55IG1hcHBlZCByZWdpb25zXG5cbm9wZW4gZmlsZXM6KSIsCisgICAgICBSIihcbi0tLT5GYXVsdCBhZGRyZXNzIGZhbGxzIGF0ICVzIGFmdGVyIGFueSBtYXBwZWQgcmVnaW9uc1xuKC0tLS0tLS0tLXxcbm9wZW4gZmlsZXM6KSkiLAogICAgICAgZm9ybWF0X3BvaW50ZXIoY3Jhc2hfdXB0cikuY19zdHIoKSk7CiAgIEFTU0VSVF9NQVRDSChyZXN1bHQsIG1hdGNoX3N0cik7CiB9CkBAIC0yNjkzLDcgKzI4MzcsOCBAQAogICAgIH0KIAogICAgIHByZXZfZmlsZSA9IG1hdGNoWzFdOwotICAgIHVud2luZHN0YWNrOjpFbGYgZWxmKHVud2luZHN0YWNrOjpNZW1vcnk6OkNyZWF0ZUZpbGVNZW1vcnkocHJldl9maWxlLCAwKS5yZWxlYXNlKCkpOworICAgIGF1dG8gZWxmX21lbW9yeSA9IHVud2luZHN0YWNrOjpNZW1vcnk6OkNyZWF0ZUZpbGVNZW1vcnkocHJldl9maWxlLCAwKTsKKyAgICB1bndpbmRzdGFjazo6RWxmIGVsZihlbGZfbWVtb3J5KTsKICAgICBpZiAoIWVsZi5Jbml0KCkgfHwgIWVsZi52YWxpZCgpKSB7CiAgICAgICAvLyBTa2lwcGluZyBpbnZhbGlkIGVsZiBmaWxlcy4KICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2hhbmRsZXIvZGVidWdnZXJkX2hhbmRsZXIuY3BwIGIvZGVidWdnZXJkL2hhbmRsZXIvZGVidWdnZXJkX2hhbmRsZXIuY3BwCmluZGV4IGM2YTUzNWEuLmVhMDdjZTIgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9oYW5kbGVyL2RlYnVnZ2VyZF9oYW5kbGVyLmNwcAorKysgYi9kZWJ1Z2dlcmQvaGFuZGxlci9kZWJ1Z2dlcmRfaGFuZGxlci5jcHAKQEAgLTM5NSw2ICszOTUsNyBAQAogICAgIEFTU0VSVF9TQU1FX09GRlNFVChzY3Vkb19yZWdpb25faW5mbywgc2N1ZG9fcmVnaW9uX2luZm8pOwogICAgIEFTU0VSVF9TQU1FX09GRlNFVChzY3Vkb19yaW5nX2J1ZmZlciwgc2N1ZG9fcmluZ19idWZmZXIpOwogICAgIEFTU0VSVF9TQU1FX09GRlNFVChzY3Vkb19yaW5nX2J1ZmZlcl9zaXplLCBzY3Vkb19yaW5nX2J1ZmZlcl9zaXplKTsKKyAgICBBU1NFUlRfU0FNRV9PRkZTRVQoc2N1ZG9fc3RhY2tfZGVwb3Rfc2l6ZSwgc2N1ZG9fc3RhY2tfZGVwb3Rfc2l6ZSk7CiAgICAgQVNTRVJUX1NBTUVfT0ZGU0VUKHJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoLCByZWNvdmVyYWJsZV9nd3BfYXNhbl9jcmFzaCk7CiAjdW5kZWYgQVNTRVJUX1NBTUVfT0ZGU0VUCiAKQEAgLTU1Miw4ICs1NTMsMTQgQEAKICAgfQogCiAgIGRlYnVnZ2VyX3Byb2Nlc3NfaW5mbyBwcm9jZXNzX2luZm8gPSB7fTsKKyAgaWYgKGdfY2FsbGJhY2tzLmdldF9wcm9jZXNzX2luZm8pIHsKKyAgICBwcm9jZXNzX2luZm8gPSBnX2NhbGxiYWNrcy5nZXRfcHJvY2Vzc19pbmZvKCk7CisgIH0KICAgdWludHB0cl90IHNpX3ZhbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihpbmZvLT5zaV9wdHIpOwogICBpZiAoc2lnbmFsX251bWJlciA9PSBCSU9OSUNfU0lHTkFMX0RFQlVHR0VSKSB7CisgICAgLy8gQXBwbGljYXRpb25zIGNhbiBzZXQgYWJvcnQgbWVzc2FnZXMgdmlhIGFuZHJvaWRfc2V0X2Fib3J0X21lc3NhZ2Ugd2l0aG91dAorICAgIC8vIGFjdHVhbGx5IGFib3J0aW5nOyBpZ25vcmUgdGhvc2UgbWVzc2FnZXMgaW4gbm9uLWZhdGFsIGR1bXBzLgorICAgIHByb2Nlc3NfaW5mby5hYm9ydF9tc2cgPSBudWxscHRyOwogICAgIGlmIChpbmZvLT5zaV9jb2RlID09IFNJX1FVRVVFICYmIGluZm8tPnNpX3BpZCA9PSBfX2dldHBpZCgpKSB7CiAgICAgICAvLyBBbGxvdyBmb3IgdGhlIGFib3J0IG1lc3NhZ2UgdG8gYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgdmlhIHRoZSBzaWdxdWV1ZSB2YWx1ZS4KICAgICAgIC8vIEtlZXAgdGhlIGJvdHRvbSBiaXQgaW50YWN0IGZvciByZXByZXNlbnRpbmcgd2hldGhlciB3ZSB3YW50IGEgYmFja3RyYWNlIG9yIGEgdG9tYnN0b25lLgpAQCAtNTYyLDggKzU2OSw2IEBACiAgICAgICAgIGluZm8tPnNpX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHNpX3ZhbCAmIDEpOwogICAgICAgfQogICAgIH0KLSAgfSBlbHNlIGlmIChnX2NhbGxiYWNrcy5nZXRfcHJvY2Vzc19pbmZvKSB7Ci0gICAgcHJvY2Vzc19pbmZvID0gZ19jYWxsYmFja3MuZ2V0X3Byb2Nlc3NfaW5mbygpOwogICB9CiAKICAgZ3dwX2FzYW5fY2FsbGJhY2tzX3QgZ3dwX2FzYW5fY2FsbGJhY2tzID0ge307CkBAIC03MjEsMTkgKzcyNiwxOSBAQAogICB9CiAKICAgc2l6ZV90IHRocmVhZF9zdGFja19wYWdlcyA9IDg7Ci0gIHZvaWQqIHRocmVhZF9zdGFja19hbGxvY2F0aW9uID0gbW1hcChudWxscHRyLCBQQUdFX1NJWkUgKiAodGhyZWFkX3N0YWNrX3BhZ2VzICsgMiksIFBST1RfTk9ORSwKKyAgdm9pZCogdGhyZWFkX3N0YWNrX2FsbG9jYXRpb24gPSBtbWFwKG51bGxwdHIsIGdldHBhZ2VzaXplKCkgKiAodGhyZWFkX3N0YWNrX3BhZ2VzICsgMiksIFBST1RfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApOwogICBpZiAodGhyZWFkX3N0YWNrX2FsbG9jYXRpb24gPT0gTUFQX0ZBSUxFRCkgewogICAgIGZhdGFsX2Vycm5vKCJmYWlsZWQgdG8gYWxsb2NhdGUgZGVidWdnZXJkIHRocmVhZCBzdGFjayIpOwogICB9CiAKLSAgY2hhciogc3RhY2sgPSBzdGF0aWNfY2FzdDxjaGFyKj4odGhyZWFkX3N0YWNrX2FsbG9jYXRpb24pICsgUEFHRV9TSVpFOwotICBpZiAobXByb3RlY3Qoc3RhY2ssIFBBR0VfU0laRSAqIHRocmVhZF9zdGFja19wYWdlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSkgIT0gMCkgeworICBjaGFyKiBzdGFjayA9IHN0YXRpY19jYXN0PGNoYXIqPih0aHJlYWRfc3RhY2tfYWxsb2NhdGlvbikgKyBnZXRwYWdlc2l6ZSgpOworICBpZiAobXByb3RlY3Qoc3RhY2ssIGdldHBhZ2VzaXplKCkgKiB0aHJlYWRfc3RhY2tfcGFnZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpICE9IDApIHsKICAgICBmYXRhbF9lcnJubygiZmFpbGVkIHRvIG1wcm90ZWN0IGRlYnVnZ2VyZCB0aHJlYWQgc3RhY2siKTsKICAgfQogCiAgIC8vIFN0YWNrIGdyb3dzIG5lZ2F0aXZlbHksIHNldCBpdCB0byB0aGUgbGFzdCBieXRlIGluIHRoZSBwYWdlLi4uCi0gIHN0YWNrID0gKHN0YWNrICsgdGhyZWFkX3N0YWNrX3BhZ2VzICogUEFHRV9TSVpFIC0gMSk7CisgIHN0YWNrID0gKHN0YWNrICsgdGhyZWFkX3N0YWNrX3BhZ2VzICogZ2V0cGFnZXNpemUoKSAtIDEpOwogICAvLyBhbmQgYWxpZ24gaXQuCiAgIHN0YWNrIC09IDE1OwogICBwc2V1ZG90aHJlYWRfc3RhY2sgPSBzdGFjazsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9pbmNsdWRlL2RlYnVnZ2VyZC9oYW5kbGVyLmggYi9kZWJ1Z2dlcmQvaW5jbHVkZS9kZWJ1Z2dlcmQvaGFuZGxlci5oCmluZGV4IGViYjUzNzIuLmRlMTJmYzYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9pbmNsdWRlL2RlYnVnZ2VyZC9oYW5kbGVyLmgKKysrIGIvZGVidWdnZXJkL2luY2x1ZGUvZGVidWdnZXJkL2hhbmRsZXIuaApAQCAtNDQsNiArNDQsNyBAQAogICBjb25zdCBjaGFyKiBzY3Vkb19yZWdpb25faW5mbzsKICAgY29uc3QgY2hhciogc2N1ZG9fcmluZ19idWZmZXI7CiAgIHNpemVfdCBzY3Vkb19yaW5nX2J1ZmZlcl9zaXplOworICBzaXplX3Qgc2N1ZG9fc3RhY2tfZGVwb3Rfc2l6ZTsKICAgYm9vbCByZWNvdmVyYWJsZV9nd3BfYXNhbl9jcmFzaDsKIH07CiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvdHlwZXMuaCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvdHlwZXMuaAppbmRleCA1YTJhN2FiLi4wNzViMTJjIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3R5cGVzLmgKKysrIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC9pbmNsdWRlL2xpYmRlYnVnZ2VyZC90eXBlcy5oCkBAIC01MSw2ICs1MSw3IEBACiAgIHVpbnRwdHJfdCBzY3Vkb19yZWdpb25faW5mbyA9IDA7CiAgIHVpbnRwdHJfdCBzY3Vkb19yaW5nX2J1ZmZlciA9IDA7CiAgIHNpemVfdCBzY3Vkb19yaW5nX2J1ZmZlcl9zaXplID0gMDsKKyAgc2l6ZV90IHNjdWRvX3N0YWNrX2RlcG90X3NpemUgPSAwOwogCiAgIGJvb2wgaGFzX2ZhdWx0X2FkZHJlc3MgPSBmYWxzZTsKICAgdWludHB0cl90IHVudGFnZ2VkX2ZhdWx0X2FkZHJlc3MgPSAwOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC9pbmNsdWRlL2xpYmRlYnVnZ2VyZC91dGlsaXR5LmggYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3V0aWxpdHkuaAppbmRleCAxOThkZTM3Li4yNmMyY2Q0IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3V0aWxpdHkuaAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3V0aWxpdHkuaApAQCAtOTEsOCArOTEsNiBAQAogdm9pZCBnZXRfc2lnbmFsX3NlbmRlcihjaGFyKiBidWYsIHNpemVfdCBuLCBjb25zdCBzaWdpbmZvX3QqKTsKIGNvbnN0IGNoYXIqIGdldF9zaWduYW1lKGNvbnN0IHNpZ2luZm9fdCopOwogY29uc3QgY2hhciogZ2V0X3NpZ2NvZGUoY29uc3Qgc2lnaW5mb190Kik7Ci1zdGQ6OnN0cmluZyBkZXNjcmliZV90YWdnZWRfYWRkcl9jdHJsKGxvbmcgY3RybCk7Ci1zdGQ6OnN0cmluZyBkZXNjcmliZV9wYWNfZW5hYmxlZF9rZXlzKGxvbmcga2V5cyk7CiAKIC8vIE51bWJlciBvZiBieXRlcyBwZXIgTVRFIGdyYW51bGUuCiBjb25zdGV4cHIgc2l6ZV90IGtUYWdHcmFudWxlU2l6ZSA9IDE2OwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC9zY3Vkby5jcHAgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3NjdWRvLmNwcAppbmRleCA1YTYyZmUxLi4zZmEzYmQwIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3NjdWRvLmNwcAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3NjdWRvLmNwcApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPGJpb25pYy9tYWNyb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgInRvbWJzdG9uZS5wYi5oIgogCkBAIC00MCw4ICs0MSw2IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgYXV0byBzdGFja19kZXBvdCA9IEFsbG9jQW5kUmVhZEZ1bGx5KHByb2Nlc3NfbWVtb3J5LCBwcm9jZXNzX2luZm8uc2N1ZG9fc3RhY2tfZGVwb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NjdWRvX2dldF9zdGFja19kZXBvdF9zaXplKCkpOwogICBhdXRvIHJlZ2lvbl9pbmZvID0gQWxsb2NBbmRSZWFkRnVsbHkocHJvY2Vzc19tZW1vcnksIHByb2Nlc3NfaW5mby5zY3Vkb19yZWdpb25faW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc2N1ZG9fZ2V0X3JlZ2lvbl9pbmZvX3NpemUoKSk7CiAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHJpbmdfYnVmZmVyOwpAQCAtNDksMjYgKzQ4LDMxIEBACiAgICAgcmluZ19idWZmZXIgPSBBbGxvY0FuZFJlYWRGdWxseShwcm9jZXNzX21lbW9yeSwgcHJvY2Vzc19pbmZvLnNjdWRvX3JpbmdfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19pbmZvLnNjdWRvX3JpbmdfYnVmZmVyX3NpemUpOwogICB9Ci0gIGlmICghc3RhY2tfZGVwb3QgfHwgIXJlZ2lvbl9pbmZvKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHN0YWNrX2RlcG90OworICBpZiAocHJvY2Vzc19pbmZvLnNjdWRvX3N0YWNrX2RlcG90X3NpemUgIT0gMCkgeworICAgIHN0YWNrX2RlcG90ID0gQWxsb2NBbmRSZWFkRnVsbHkocHJvY2Vzc19tZW1vcnksIHByb2Nlc3NfaW5mby5zY3Vkb19zdGFja19kZXBvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfaW5mby5zY3Vkb19zdGFja19kZXBvdF9zaXplKTsKKyAgfQorICBpZiAoIXJlZ2lvbl9pbmZvKSB7CiAgICAgcmV0dXJuOwogICB9CiAKICAgdW50YWdnZWRfZmF1bHRfYWRkcl8gPSBwcm9jZXNzX2luZm8udW50YWdnZWRfZmF1bHRfYWRkcmVzczsKLSAgdWludHB0cl90IGZhdWx0X3BhZ2UgPSB1bnRhZ2dlZF9mYXVsdF9hZGRyXyAmIH4oUEFHRV9TSVpFIC0gMSk7CisgIHVpbnRwdHJfdCBmYXVsdF9wYWdlID0gdW50YWdnZWRfZmF1bHRfYWRkcl8gJiB+KGdldHBhZ2VzaXplKCkgLSAxKTsKIAotICB1aW50cHRyX3QgbWVtb3J5X2JlZ2luID0gZmF1bHRfcGFnZSAtIFBBR0VfU0laRSAqIDE2OworICB1aW50cHRyX3QgbWVtb3J5X2JlZ2luID0gZmF1bHRfcGFnZSAtIGdldHBhZ2VzaXplKCkgKiAxNjsKICAgaWYgKG1lbW9yeV9iZWdpbiA+IGZhdWx0X3BhZ2UpIHsKICAgICByZXR1cm47CiAgIH0KIAotICB1aW50cHRyX3QgbWVtb3J5X2VuZCA9IGZhdWx0X3BhZ2UgKyBQQUdFX1NJWkUgKiAxNjsKKyAgdWludHB0cl90IG1lbW9yeV9lbmQgPSBmYXVsdF9wYWdlICsgZ2V0cGFnZXNpemUoKSAqIDE2OwogICBpZiAobWVtb3J5X2VuZCA8IGZhdWx0X3BhZ2UpIHsKICAgICByZXR1cm47CiAgIH0KIAogICBhdXRvIG1lbW9yeSA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPihtZW1vcnlfZW5kIC0gbWVtb3J5X2JlZ2luKTsKLSAgZm9yIChhdXRvIGkgPSBtZW1vcnlfYmVnaW47IGkgIT0gbWVtb3J5X2VuZDsgaSArPSBQQUdFX1NJWkUpIHsKLSAgICBwcm9jZXNzX21lbW9yeS0+UmVhZEZ1bGx5KGksIG1lbW9yeS5nZXQoKSArIGkgLSBtZW1vcnlfYmVnaW4sIFBBR0VfU0laRSk7CisgIGZvciAoYXV0byBpID0gbWVtb3J5X2JlZ2luOyBpICE9IG1lbW9yeV9lbmQ7IGkgKz0gZ2V0cGFnZXNpemUoKSkgeworICAgIHByb2Nlc3NfbWVtb3J5LT5SZWFkRnVsbHkoaSwgbWVtb3J5LmdldCgpICsgaSAtIG1lbW9yeV9iZWdpbiwgZ2V0cGFnZXNpemUoKSk7CiAgIH0KIAogICBhdXRvIG1lbW9yeV90YWdzID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KChtZW1vcnlfZW5kIC0gbWVtb3J5X2JlZ2luKSAvIGtUYWdHcmFudWxlU2l6ZSk7CkBAIC03Nyw3ICs4MSw4IEBACiAgIH0KIAogICBfX3NjdWRvX2dldF9lcnJvcl9pbmZvKCZlcnJvcl9pbmZvXywgcHJvY2Vzc19pbmZvLm1heWJlX3RhZ2dlZF9mYXVsdF9hZGRyZXNzLCBzdGFja19kZXBvdC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25faW5mby5nZXQoKSwgcmluZ19idWZmZXIuZ2V0KCksIG1lbW9yeS5nZXQoKSwgbWVtb3J5X3RhZ3MuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19pbmZvLnNjdWRvX3N0YWNrX2RlcG90X3NpemUsIHJlZ2lvbl9pbmZvLmdldCgpLCByaW5nX2J1ZmZlci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzX2luZm8uc2N1ZG9fcmluZ19idWZmZXJfc2l6ZSwgbWVtb3J5LmdldCgpLCBtZW1vcnlfdGFncy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfYmVnaW4sIG1lbW9yeV9lbmQgLSBtZW1vcnlfYmVnaW4pOwogfQogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3Rlc3QvdG9tYnN0b25lX3Byb3RvX3RvX3RleHRfdGVzdC5jcHAgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3Rlc3QvdG9tYnN0b25lX3Byb3RvX3RvX3RleHRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5MmFjMAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC90b21ic3RvbmVfcHJvdG9fdG9fdGV4dF90ZXN0LmNwcApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Rlc3RfdXRpbHMuaD4KKworI2luY2x1ZGUgImxpYmRlYnVnZ2VyZC90b21ic3RvbmUuaCIKKyNpbmNsdWRlICJ0b21ic3RvbmUucGIuaCIKKwordXNpbmcgQ2FsbGJhY2tUeXBlID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBib29sIHNob3VsZF9sb2cpPjsKKworY2xhc3MgVG9tYnN0b25lUHJvdG9Ub1RleHRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2b2lkIFNldFVwKCkgeworICAgIHRvbWJzdG9uZV8ucmVzZXQobmV3IFRvbWJzdG9uZSk7CisKKyAgICB0b21ic3RvbmVfLT5zZXRfYXJjaChBcmNoaXRlY3R1cmU6OkFSTTY0KTsKKyAgICB0b21ic3RvbmVfLT5zZXRfYnVpbGRfZmluZ2VycHJpbnQoIlRlc3QgZmluZ2VycHJpbnQiKTsKKyAgICB0b21ic3RvbmVfLT5zZXRfdGltZXN0YW1wKCIxOTcwLTAxLTAxIDAwOjAwOjAwIik7CisgICAgdG9tYnN0b25lXy0+c2V0X3BpZCgxMDApOworICAgIHRvbWJzdG9uZV8tPnNldF90aWQoMTAwKTsKKyAgICB0b21ic3RvbmVfLT5zZXRfdWlkKDApOworICAgIHRvbWJzdG9uZV8tPnNldF9zZWxpbnV4X2xhYmVsKCJub25lIik7CisKKyAgICBTaWduYWwgc2lnbmFsOworICAgIHNpZ25hbC5zZXRfbnVtYmVyKFNJR1NFR1YpOworICAgIHNpZ25hbC5zZXRfbmFtZSgiU0lHU0VHViIpOworICAgIHNpZ25hbC5zZXRfY29kZSgwKTsKKyAgICBzaWduYWwuc2V0X2NvZGVfbmFtZSgibm9uZSIpOworCisgICAgKnRvbWJzdG9uZV8tPm11dGFibGVfc2lnbmFsX2luZm8oKSA9IHNpZ25hbDsKKworICAgIFRocmVhZCB0aHJlYWQ7CisgICAgdGhyZWFkLnNldF9pZCgxMDApOworICAgIHRocmVhZC5zZXRfbmFtZSgibWFpbiIpOworICAgIHRocmVhZC5zZXRfdGFnZ2VkX2FkZHJfY3RybCgwKTsKKyAgICB0aHJlYWQuc2V0X3BhY19lbmFibGVkX2tleXMoMCk7CisKKyAgICBhdXRvJiB0aHJlYWRzID0gKnRvbWJzdG9uZV8tPm11dGFibGVfdGhyZWFkcygpOworICAgIHRocmVhZHNbMTAwXSA9IHRocmVhZDsKKyAgICBtYWluX3RocmVhZF8gPSAmdGhyZWFkc1sxMDBdOworICB9CisKKyAgdm9pZCBQcm90b1RvU3RyaW5nKCkgeworICAgIHRleHRfID0gIiI7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgIHRvbWJzdG9uZV9wcm90b190b190ZXh0KCp0b21ic3RvbmVfLCBbdGhpc10oY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIGJvb2wgc2hvdWxkX2xvZykgeworICAgICAgICAgIGlmIChzaG91bGRfbG9nKSB7CisgICAgICAgICAgICB0ZXh0XyArPSAiTE9HICI7CisgICAgICAgICAgfQorICAgICAgICAgIHRleHRfICs9IGxpbmUgKyAnXG4nOworICAgICAgICB9KSk7CisgIH0KKworICBUaHJlYWQqIG1haW5fdGhyZWFkXzsKKyAgc3RkOjpzdHJpbmcgdGV4dF87CisgIHN0ZDo6dW5pcXVlX3B0cjxUb21ic3RvbmU+IHRvbWJzdG9uZV87Cit9OworCitURVNUX0YoVG9tYnN0b25lUHJvdG9Ub1RleHRUZXN0LCB0YWdnZWRfYWRkcl9jdHJsKSB7CisgIG1haW5fdGhyZWFkXy0+c2V0X3RhZ2dlZF9hZGRyX2N0cmwoMCk7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLCAiTE9HIHRhZ2dlZF9hZGRyX2N0cmw6IDAwMDAwMDAwMDAwMDAwMDBcXG4iKTsKKworICBtYWluX3RocmVhZF8tPnNldF90YWdnZWRfYWRkcl9jdHJsKFBSX1RBR0dFRF9BRERSX0VOQUJMRSk7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLCAiTE9HIHRhZ2dlZF9hZGRyX2N0cmw6IDAwMDAwMDAwMDAwMDAwMDEgXFwoUFJfVEFHR0VEX0FERFJfRU5BQkxFXFwpXFxuIik7CisKKyAgbWFpbl90aHJlYWRfLT5zZXRfdGFnZ2VkX2FkZHJfY3RybChQUl9UQUdHRURfQUREUl9FTkFCTEUgfCBQUl9NVEVfVENGX1NZTkMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweGZmZmUgPDwgUFJfTVRFX1RBR19TSElGVCkpOworICBQcm90b1RvU3RyaW5nKCk7CisgIEVYUEVDVF9NQVRDSCh0ZXh0XywKKyAgICAgICAgICAgICAgICJMT0cgdGFnZ2VkX2FkZHJfY3RybDogMDAwMDAwMDAwMDA3ZmZmMyBcXChQUl9UQUdHRURfQUREUl9FTkFCTEUsIFBSX01URV9UQ0ZfU1lOQywgIgorICAgICAgICAgICAgICAgIm1hc2sgMHhmZmZlXFwpXFxuIik7CisKKyAgbWFpbl90aHJlYWRfLT5zZXRfdGFnZ2VkX2FkZHJfY3RybCgweGYwMDAwMDAwIHwgUFJfVEFHR0VEX0FERFJfRU5BQkxFIHwgUFJfTVRFX1RDRl9TWU5DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUl9NVEVfVENGX0FTWU5DIHwgKDB4ZmZmZSA8PCBQUl9NVEVfVEFHX1NISUZUKSk7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLAorICAgICAgICAgICAgICAgIkxPRyB0YWdnZWRfYWRkcl9jdHJsOiAwMDAwMDAwMGYwMDdmZmY3IFxcKFBSX1RBR0dFRF9BRERSX0VOQUJMRSwgUFJfTVRFX1RDRl9TWU5DLCAiCisgICAgICAgICAgICAgICAiUFJfTVRFX1RDRl9BU1lOQywgbWFzayAweGZmZmUsIHVua25vd24gMHhmMDAwMDAwMFxcKVxcbiIpOworfQorCitURVNUX0YoVG9tYnN0b25lUHJvdG9Ub1RleHRUZXN0LCBwYWNfZW5hYmxlZF9rZXlzKSB7CisgIG1haW5fdGhyZWFkXy0+c2V0X3BhY19lbmFibGVkX2tleXMoMCk7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLCAiTE9HIHBhY19lbmFibGVkX2tleXM6IDAwMDAwMDAwMDAwMDAwMDBcXG4iKTsKKworICBtYWluX3RocmVhZF8tPnNldF9wYWNfZW5hYmxlZF9rZXlzKFBSX1BBQ19BUElBS0VZKTsKKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sICJMT0cgcGFjX2VuYWJsZWRfa2V5czogMDAwMDAwMDAwMDAwMDAwMSBcXChQUl9QQUNfQVBJQUtFWVxcKVxcbiIpOworCisgIG1haW5fdGhyZWFkXy0+c2V0X3BhY19lbmFibGVkX2tleXMoUFJfUEFDX0FQSUFLRVkgfCBQUl9QQUNfQVBEQktFWSk7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLAorICAgICAgICAgICAgICAgIkxPRyBwYWNfZW5hYmxlZF9rZXlzOiAwMDAwMDAwMDAwMDAwMDA5IFxcKFBSX1BBQ19BUElBS0VZLCBQUl9QQUNfQVBEQktFWVxcKVxcbiIpOworCisgIG1haW5fdGhyZWFkXy0+c2V0X3BhY19lbmFibGVkX2tleXMoUFJfUEFDX0FQSUFLRVkgfCBQUl9QQUNfQVBEQktFWSB8IDB4MTAwMCk7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLAorICAgICAgICAgICAgICAgIkxPRyBwYWNfZW5hYmxlZF9rZXlzOiAwMDAwMDAwMDAwMDAxMDA5IFxcKFBSX1BBQ19BUElBS0VZLCBQUl9QQUNfQVBEQktFWSwgdW5rbm93biAiCisgICAgICAgICAgICAgICAiMHgxMDAwXFwpXFxuIik7Cit9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3Rlc3QvdXRpbGl0eV90ZXN0LmNwcCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC91dGlsaXR5X3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQzMzgwLi4wMDAwMDAwCi0tLSBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC91dGlsaXR5X3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotCi0jaW5jbHVkZSAibGliZGVidWdnZXJkL3V0aWxpdHkuaCIKLQotVEVTVChVdGlsaXR5VGVzdCwgZGVzY3JpYmVfdGFnZ2VkX2FkZHJfY3RybCkgewotICBFWFBFQ1RfRVEoIiIsIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwoMCkpOwotICBFWFBFQ1RfRVEoIiAoUFJfVEFHR0VEX0FERFJfRU5BQkxFKSIsIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwoUFJfVEFHR0VEX0FERFJfRU5BQkxFKSk7Ci0gIEVYUEVDVF9FUSgiIChQUl9UQUdHRURfQUREUl9FTkFCTEUsIFBSX01URV9UQ0ZfU1lOQywgbWFzayAweGZmZmUpIiwKLSAgICAgICAgICAgIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwoUFJfVEFHR0VEX0FERFJfRU5BQkxFIHwgUFJfTVRFX1RDRl9TWU5DIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmZmZSA8PCBQUl9NVEVfVEFHX1NISUZUKSkpOwotICBFWFBFQ1RfRVEoCi0gICAgICAiIChQUl9UQUdHRURfQUREUl9FTkFCTEUsIFBSX01URV9UQ0ZfU1lOQywgUFJfTVRFX1RDRl9BU1lOQywgbWFzayAweGZmZmUsIHVua25vd24gIgotICAgICAgIjB4ZjAwMDAwMDApIiwKLSAgICAgIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwoMHhmMDAwMDAwMCB8IFBSX1RBR0dFRF9BRERSX0VOQUJMRSB8IFBSX01URV9UQ0ZfU1lOQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSX01URV9UQ0ZfQVNZTkMgfCAoMHhmZmZlIDw8IFBSX01URV9UQUdfU0hJRlQpKSk7Ci19Ci0KLVRFU1QoVXRpbGl0eVRlc3QsIGRlc2NyaWJlX3BhY19lbmFibGVkX2tleXMpIHsKLSAgRVhQRUNUX0VRKCIiLCBkZXNjcmliZV9wYWNfZW5hYmxlZF9rZXlzKDApKTsKLSAgRVhQRUNUX0VRKCIgKFBSX1BBQ19BUElBS0VZKSIsIGRlc2NyaWJlX3BhY19lbmFibGVkX2tleXMoUFJfUEFDX0FQSUFLRVkpKTsKLSAgRVhQRUNUX0VRKCIgKFBSX1BBQ19BUElBS0VZLCBQUl9QQUNfQVBEQktFWSkiLAotICAgICAgICAgICAgZGVzY3JpYmVfcGFjX2VuYWJsZWRfa2V5cyhQUl9QQUNfQVBJQUtFWSB8IFBSX1BBQ19BUERCS0VZKSk7Ci0gIEVYUEVDVF9FUSgiIChQUl9QQUNfQVBJQUtFWSwgUFJfUEFDX0FQREJLRVksIHVua25vd24gMHgxMDAwKSIsCi0gICAgICAgICAgICBkZXNjcmliZV9wYWNfZW5hYmxlZF9rZXlzKFBSX1BBQ19BUElBS0VZIHwgUFJfUEFDX0FQREJLRVkgfCAweDEwMDApKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lX3Byb3RvLmNwcCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lX3Byb3RvLmNwcAppbmRleCA3YjJlMDY4Li43NDRiZmFiIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90by5jcHAKKysrIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC90b21ic3RvbmVfcHJvdG8uY3BwCkBAIC00OTMsMjcgKzQ5Myw0OCBAQAogICB9CiB9CiAKKy8vIFRoaXMgY3JlYXRlcyBhIGZha2UgbG9nIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQgd2hlbgorLy8gcmVhZGluZyB0aGUgbG9nLgorc3RhdGljIHZvaWQgYWRkX2Vycm9yX2xvZ19tc2coVG9tYnN0b25lKiB0b21ic3RvbmUsIGNvbnN0IHN0ZDo6c3RyaW5nJiYgZXJyb3JfbXNnKSB7CisgIExvZ0J1ZmZlciBidWZmZXI7CisgIGJ1ZmZlci5zZXRfbmFtZSgiRVJST1IiKTsKKworICBMb2dNZXNzYWdlKiBsb2dfbXNnID0gYnVmZmVyLmFkZF9sb2dzKCk7CisgIGxvZ19tc2ctPnNldF90aW1lc3RhbXAoIjAwLTAwIDAwOjAwOjAwLjAwMCIpOworICBsb2dfbXNnLT5zZXRfcGlkKDApOworICBsb2dfbXNnLT5zZXRfdGlkKDApOworICBsb2dfbXNnLT5zZXRfcHJpb3JpdHkoQU5EUk9JRF9MT0dfRVJST1IpOworICBsb2dfbXNnLT5zZXRfdGFnKCIiKTsKKyAgbG9nX21zZy0+c2V0X21lc3NhZ2UoZXJyb3JfbXNnKTsKKworICAqdG9tYnN0b25lLT5hZGRfbG9nX2J1ZmZlcnMoKSA9IHN0ZDo6bW92ZShidWZmZXIpOworCisgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgIiVzIiwgZXJyb3JfbXNnLmNfc3RyKCkpOworfQorCiBzdGF0aWMgdm9pZCBkdW1wX2xvZ19maWxlKFRvbWJzdG9uZSogdG9tYnN0b25lLCBjb25zdCBjaGFyKiBsb2dnZXIsIHBpZF90IHBpZCkgewogICBsb2dnZXJfbGlzdCogbG9nZ2VyX2xpc3QgPSBhbmRyb2lkX2xvZ2dlcl9saXN0X29wZW4oYW5kcm9pZF9uYW1lX3RvX2xvZ19pZChsb2dnZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9MT0dfTk9OQkxPQ0ssIGtNYXhMb2dNZXNzYWdlcywgcGlkKTsKKyAgaWYgKGxvZ2dlcl9saXN0ID09IG51bGxwdHIpIHsKKyAgICBhZGRfZXJyb3JfbG9nX21zZyh0b21ic3RvbmUsIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiQ2Fubm90IG9wZW4gbG9nIGZpbGUgJXMiLCBsb2dnZXIpKTsKKyAgICByZXR1cm47CisgIH0KIAogICBMb2dCdWZmZXIgYnVmZmVyOwotCiAgIHdoaWxlICh0cnVlKSB7CiAgICAgbG9nX21zZyBsb2dfZW50cnk7CiAgICAgc3NpemVfdCBhY3R1YWwgPSBhbmRyb2lkX2xvZ2dlcl9saXN0X3JlYWQobG9nZ2VyX2xpc3QsICZsb2dfZW50cnkpOwotCiAgICAgaWYgKGFjdHVhbCA8IDApIHsKICAgICAgIGlmIChhY3R1YWwgPT0gLUVJTlRSKSB7CiAgICAgICAgIC8vIGludGVycnVwdGVkIGJ5IHNpZ25hbCwgcmV0cnkKICAgICAgICAgY29udGludWU7CiAgICAgICB9Ci0gICAgICBpZiAoYWN0dWFsID09IC1FQUdBSU4pIHsKLSAgICAgICAgLy8gbm9uLWJsb2NraW5nIEVPRjsgd2UncmUgZG9uZQotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrOworICAgICAgLy8gRG9uJ3QgY29uc2lkZXIgRUFHQUlOIGFuIGVycm9yIHNpbmNlIHRoaXMgaXMgYSBub24tYmxvY2tpbmcgY2FsbC4KKyAgICAgIGlmIChhY3R1YWwgIT0gLUVBR0FJTikgeworICAgICAgICBhZGRfZXJyb3JfbG9nX21zZyh0b21ic3RvbmUsIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigicmVhZGluZyBsb2cgJXMgZmFpbGVkICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIsIHN0cmVycm9yKC1hY3R1YWwpKSk7CiAgICAgICB9CisgICAgICBicmVhazsKICAgICB9IGVsc2UgaWYgKGFjdHVhbCA9PSAwKSB7CiAgICAgICBicmVhazsKICAgICB9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmNwcCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lX3Byb3RvX3RvX3RleHQuY3BwCmluZGV4IDhlNmFiZGYuLmFkOTEzMjAgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lX3Byb3RvX3RvX3RleHQuY3BwCisrKyBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lX3Byb3RvX3RvX3RleHQuY3BwCkBAIC0yOCw4ICsyOCw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgPGFzeW5jX3NhZmUvbG9nLmg+CiAjaW5jbHVkZSA8YmlvbmljL21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogCiAjaW5jbHVkZSAidG9tYnN0b25lLnBiLmgiCiAKQEAgLTQxLDYgKzQxLDQyIEBACiAjZGVmaW5lIENCUyguLi4pIENCKGZhbHNlLCBfX1ZBX0FSR1NfXykKIHVzaW5nIENhbGxiYWNrVHlwZSA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYgbGluZSwgYm9vbCBzaG91bGRfbG9nKT47CiAKKyNkZWZpbmUgREVTQ1JJQkVfRkxBRyhmbGFnKSBcCisgIGlmICh2YWx1ZSAmIGZsYWcpIHsgICAgICAgXAorICAgIGRlc2MgKz0gIiwgIjsgICAgICAgICAgIFwKKyAgICBkZXNjICs9ICNmbGFnOyAgICAgICAgICBcCisgICAgdmFsdWUgJj0gfmZsYWc7ICAgICAgICAgXAorICB9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkZXNjcmliZV9lbmQobG9uZyB2YWx1ZSwgc3RkOjpzdHJpbmcmIGRlc2MpIHsKKyAgaWYgKHZhbHVlKSB7CisgICAgZGVzYyArPSBTdHJpbmdQcmludGYoIiwgdW5rbm93biAweCVseCIsIHZhbHVlKTsKKyAgfQorICByZXR1cm4gZGVzYy5lbXB0eSgpID8gIiIgOiAiICgiICsgZGVzYy5zdWJzdHIoMikgKyAiKSI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkZXNjcmliZV90YWdnZWRfYWRkcl9jdHJsKGxvbmcgdmFsdWUpIHsKKyAgc3RkOjpzdHJpbmcgZGVzYzsKKyAgREVTQ1JJQkVfRkxBRyhQUl9UQUdHRURfQUREUl9FTkFCTEUpOworICBERVNDUklCRV9GTEFHKFBSX01URV9UQ0ZfU1lOQyk7CisgIERFU0NSSUJFX0ZMQUcoUFJfTVRFX1RDRl9BU1lOQyk7CisgIGlmICh2YWx1ZSAmIFBSX01URV9UQUdfTUFTSykgeworICAgIGRlc2MgKz0gU3RyaW5nUHJpbnRmKCIsIG1hc2sgMHglMDRseCIsICh2YWx1ZSAmIFBSX01URV9UQUdfTUFTSykgPj4gUFJfTVRFX1RBR19TSElGVCk7CisgICAgdmFsdWUgJj0gflBSX01URV9UQUdfTUFTSzsKKyAgfQorICByZXR1cm4gZGVzY3JpYmVfZW5kKHZhbHVlLCBkZXNjKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGRlc2NyaWJlX3BhY19lbmFibGVkX2tleXMobG9uZyB2YWx1ZSkgeworICBzdGQ6OnN0cmluZyBkZXNjOworICBERVNDUklCRV9GTEFHKFBSX1BBQ19BUElBS0VZKTsKKyAgREVTQ1JJQkVfRkxBRyhQUl9QQUNfQVBJQktFWSk7CisgIERFU0NSSUJFX0ZMQUcoUFJfUEFDX0FQREFLRVkpOworICBERVNDUklCRV9GTEFHKFBSX1BBQ19BUERCS0VZKTsKKyAgREVTQ1JJQkVfRkxBRyhQUl9QQUNfQVBHQUtFWSk7CisgIHJldHVybiBkZXNjcmliZV9lbmQodmFsdWUsIGRlc2MpOworfQorCiBzdGF0aWMgY29uc3QgY2hhciogYWJpX3N0cmluZyhjb25zdCBUb21ic3RvbmUmIHRvbWJzdG9uZSkgewogICBzd2l0Y2ggKHRvbWJzdG9uZS5hcmNoKCkpIHsKICAgICBjYXNlIEFyY2hpdGVjdHVyZTo6QVJNMzI6CkBAIC04MSw2ICsxMTcsOCBAQAogICBpZiAoIXRvbWJzdG9uZS5jb21tYW5kX2xpbmUoKS5lbXB0eSgpKSB7CiAgICAgcHJvY2Vzc19uYW1lID0gdG9tYnN0b25lLmNvbW1hbmRfbGluZSgpWzBdLmNfc3RyKCk7CiAgICAgQ0Ioc2hvdWxkX2xvZywgIkNtZGxpbmU6ICVzIiwgYW5kcm9pZDo6YmFzZTo6Sm9pbih0b21ic3RvbmUuY29tbWFuZF9saW5lKCksICIgIikuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgQ0Ioc2hvdWxkX2xvZywgIkNtZGxpbmU6IDx1bmtub3duPiIpOwogICB9CiAgIENCKHNob3VsZF9sb2csICJwaWQ6ICVkLCB0aWQ6ICVkLCBuYW1lOiAlcyAgPj4+ICVzIDw8PCIsIHRvbWJzdG9uZS5waWQoKSwgdGhyZWFkLmlkKCksCiAgICAgIHRocmVhZC5uYW1lKCkuY19zdHIoKSwgcHJvY2Vzc19uYW1lKTsKQEAgLTEzNiw3ICsxNzQsOCBAQAogICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgYXN5bmNfc2FmZV9mYXRhbCgidW5rbm93biBhcmNoaXRlY3R1cmUiKTsKKyAgICAgIENCTCgiVW5rbm93biBhcmNoaXRlY3R1cmUgJWQgcHJpbnRpbmcgdGhyZWFkIHJlZ2lzdGVycyIsIHRvbWJzdG9uZS5hcmNoKCkpOworICAgICAgcmV0dXJuOwogICB9CiAKICAgZm9yIChjb25zdCBhdXRvJiByZWcgOiB0aHJlYWQucmVnaXN0ZXJzKCkpIHsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdXRpbGl0eS5jcHAgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3V0aWxpdHkuY3BwCmluZGV4IGQ3MWZjNmMuLjc0MmFjN2MgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdXRpbGl0eS5jcHAKKysrIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC91dGlsaXR5LmNwcApAQCAtMzgyLDggKzM4MiwxMCBAQAogICAgICAgICAgIHJldHVybiAiU0VHVl9NVEVBRVJSIjsKICAgICAgICAgY2FzZSBTRUdWX01URVNFUlI6CiAgICAgICAgICAgcmV0dXJuICJTRUdWX01URVNFUlIiOworICAgICAgICBjYXNlIFNFR1ZfQ1BFUlI6CisgICAgICAgICAgcmV0dXJuICJTRUdWX0NQRVJSIjsKICAgICAgIH0KLSAgICAgIHN0YXRpY19hc3NlcnQoTlNJR1NFR1YgPT0gU0VHVl9NVEVTRVJSLCAibWlzc2luZyBTRUdWXyogc2lfY29kZSIpOworICAgICAgc3RhdGljX2Fzc2VydChOU0lHU0VHViA9PSBTRUdWX0NQRVJSLCAibWlzc2luZyBTRUdWXyogc2lfY29kZSIpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBTSUdTWVM6CiAgICAgICBzd2l0Y2ggKHNpLT5zaV9jb2RlKSB7CkBAIC00NDMsNDIgKzQ0NSw2IEBACiAgIHJldHVybiAiPyI7CiB9CiAKLSNkZWZpbmUgREVTQ1JJQkVfRkxBRyhmbGFnKSBcCi0gIGlmICh2YWx1ZSAmIGZsYWcpIHsgICAgICAgXAotICAgIGRlc2MgKz0gIiwgIjsgICAgICAgICAgIFwKLSAgICBkZXNjICs9ICNmbGFnOyAgICAgICAgICBcCi0gICAgdmFsdWUgJj0gfmZsYWc7ICAgICAgICAgXAotICB9Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBkZXNjcmliZV9lbmQobG9uZyB2YWx1ZSwgc3RkOjpzdHJpbmcmIGRlc2MpIHsKLSAgaWYgKHZhbHVlKSB7Ci0gICAgZGVzYyArPSBTdHJpbmdQcmludGYoIiwgdW5rbm93biAweCVseCIsIHZhbHVlKTsKLSAgfQotICByZXR1cm4gZGVzYy5lbXB0eSgpID8gIiIgOiAiICgiICsgZGVzYy5zdWJzdHIoMikgKyAiKSI7Ci19Ci0KLXN0ZDo6c3RyaW5nIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwobG9uZyB2YWx1ZSkgewotICBzdGQ6OnN0cmluZyBkZXNjOwotICBERVNDUklCRV9GTEFHKFBSX1RBR0dFRF9BRERSX0VOQUJMRSk7Ci0gIERFU0NSSUJFX0ZMQUcoUFJfTVRFX1RDRl9TWU5DKTsKLSAgREVTQ1JJQkVfRkxBRyhQUl9NVEVfVENGX0FTWU5DKTsKLSAgaWYgKHZhbHVlICYgUFJfTVRFX1RBR19NQVNLKSB7Ci0gICAgZGVzYyArPSBTdHJpbmdQcmludGYoIiwgbWFzayAweCUwNGx4IiwgKHZhbHVlICYgUFJfTVRFX1RBR19NQVNLKSA+PiBQUl9NVEVfVEFHX1NISUZUKTsKLSAgICB2YWx1ZSAmPSB+UFJfTVRFX1RBR19NQVNLOwotICB9Ci0gIHJldHVybiBkZXNjcmliZV9lbmQodmFsdWUsIGRlc2MpOwotfQotCi1zdGQ6OnN0cmluZyBkZXNjcmliZV9wYWNfZW5hYmxlZF9rZXlzKGxvbmcgdmFsdWUpIHsKLSAgc3RkOjpzdHJpbmcgZGVzYzsKLSAgREVTQ1JJQkVfRkxBRyhQUl9QQUNfQVBJQUtFWSk7Ci0gIERFU0NSSUJFX0ZMQUcoUFJfUEFDX0FQSUJLRVkpOwotICBERVNDUklCRV9GTEFHKFBSX1BBQ19BUERBS0VZKTsKLSAgREVTQ1JJQkVfRkxBRyhQUl9QQUNfQVBEQktFWSk7Ci0gIERFU0NSSUJFX0ZMQUcoUFJfUEFDX0FQR0FLRVkpOwotICByZXR1cm4gZGVzY3JpYmVfZW5kKHZhbHVlLCBkZXNjKTsKLX0KLQogdm9pZCBsb2dfYmFja3RyYWNlKGxvZ190KiBsb2csIHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXIqIHVud2luZGVyLAogICAgICAgICAgICAgICAgICAgIHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXJEYXRhJiBkYXRhLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVucmVhZGFibGVfZWxmX2ZpbGVzOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3Byb3RvL0FuZHJvaWQuYnAgYi9kZWJ1Z2dlcmQvcHJvdG8vQW5kcm9pZC5icAppbmRleCA3M2NmNTczLi43YmU1ZDYxIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvcHJvdG8vQW5kcm9pZC5icAorKysgYi9kZWJ1Z2dlcmQvcHJvdG8vQW5kcm9pZC5icApAQCAtMzUsNiArMzUsMjEgQEAKICAgICAgICAgImNvbS5hbmRyb2lkLnJ1bnRpbWUiLAogICAgIF0sCiAKKyAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCiAgICAgdmVuZG9yX3JhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogfQorCitqYXZhX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlidG9tYnN0b25lX3Byb3RvX2phdmEiLAorICAgIHByb3RvOiB7CisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorICAgIHNyY3M6IFsKKyAgICAgICAgInRvbWJzdG9uZS5wcm90byIsCisgICAgXSwKKyAgICBqYXJqYXJfcnVsZXM6ICJqYXJqYXItcnVsZXMudHh0IiwKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorICAgIHN0YXRpY19saWJzOiBbImxpYnByb3RvYnVmLWphdmEtbGl0ZSJdLAorfQorCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvcHJvdG8vamFyamFyLXJ1bGVzLnR4dCBiL2RlYnVnZ2VyZC9wcm90by9qYXJqYXItcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODc4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQvcHJvdG8vamFyamFyLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGNvbS5nb29nbGUucHJvdG9idWYuKiogY29tLmFuZHJvaWQuc2VydmVyLm9zLnByb3RvYnVmLkAxCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvcHJvdG9jb2wuaCBiL2RlYnVnZ2VyZC9wcm90b2NvbC5oCmluZGV4IGI2MGNmNWIuLjc5MzQyOGEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9wcm90b2NvbC5oCisrKyBiL2RlYnVnZ2VyZC9wcm90b2NvbC5oCkBAIC02NSw3ICs2NSw3IEBACiB9OwogCiBlbnVtIGNsYXNzIEludGVyY2VwdFN0YXR1cyA6IHVpbnQ4X3QgewotICAvLyBSZXR1cm5lZCB3aGVuIGFuIGludGVyY2VwdCBvZiBhIGRpZmZlcmVudCB0eXBlIGhhcyBhbHJlYWR5IGJlZW4KKyAgLy8gUmV0dXJuZWQgd2hlbiBhbiBpbnRlcmNlcHQgb2YgdGhlIHNhbWUgdHlwZSBoYXMgYWxyZWFkeSBiZWVuCiAgIC8vIHJlZ2lzdGVyZWQgKGFuZCBpcyBhY3RpdmUpIGZvciBhIGdpdmVuIFBJRC4KICAga0ZhaWxlZEFscmVhZHlSZWdpc3RlcmVkLAogICAvLyBSZXR1cm5lZCBpbiBhbGwgb3RoZXIgZmFpbHVyZSBjYXNlcy4KQEAgLTk5LDYgKzk5LDcgQEAKICAgdWludHB0cl90IHNjdWRvX3JlZ2lvbl9pbmZvOwogICB1aW50cHRyX3Qgc2N1ZG9fcmluZ19idWZmZXI7CiAgIHNpemVfdCBzY3Vkb19yaW5nX2J1ZmZlcl9zaXplOworICBzaXplX3Qgc2N1ZG9fc3RhY2tfZGVwb3Rfc2l6ZTsKICAgYm9vbCByZWNvdmVyYWJsZV9nd3BfYXNhbl9jcmFzaDsKIH07CiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9ydXN0L3RvbWJzdG9uZWRfY2xpZW50L3NyYy9saWIucnMgYi9kZWJ1Z2dlcmQvcnVzdC90b21ic3RvbmVkX2NsaWVudC9zcmMvbGliLnJzCmluZGV4IDVjOGFiZWYuLmQxYjVlNjkgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9ydXN0L3RvbWJzdG9uZWRfY2xpZW50L3NyYy9saWIucnMKKysrIGIvZGVidWdnZXJkL3J1c3QvdG9tYnN0b25lZF9jbGllbnQvc3JjL2xpYi5ycwpAQCAtMzksMjAgKzM5LDI2IEBACiB9CiAKIGltcGwgVG9tYnN0b25lZENvbm5lY3Rpb24geworICAgIC8vLyAjIFNhZmV0eQorICAgIC8vLworICAgIC8vLyBUaGUgZmlsZSBkZXNjcmlwdG9ycyBtdXN0IGJlIHZhbGlkIGFuZCBvcGVuLgogICAgIHVuc2FmZSBmbiBmcm9tX3Jhd19mZHMoCiAgICAgICAgIHRvbWJzdG9uZWRfc29ja2V0OiBSYXdGZCwKICAgICAgICAgdGV4dF9vdXRwdXRfZmQ6IFJhd0ZkLAogICAgICAgICBwcm90b19vdXRwdXRfZmQ6IFJhd0ZkLAogICAgICkgLT4gU2VsZiB7CiAgICAgICAgIFNlbGYgewotICAgICAgICAgICAgdG9tYnN0b25lZF9zb2NrZXQ6IEZpbGU6OmZyb21fcmF3X2ZkKHRvbWJzdG9uZWRfc29ja2V0KSwKKyAgICAgICAgICAgIC8vIFNBRkVUWTogVGhlIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyB2YWxpZCBhbmQgb3Blbi4KKyAgICAgICAgICAgIHRvbWJzdG9uZWRfc29ja2V0OiB1bnNhZmUgeyBGaWxlOjpmcm9tX3Jhd19mZCh0b21ic3RvbmVkX3NvY2tldCkgfSwKICAgICAgICAgICAgIHRleHRfb3V0cHV0OiBpZiB0ZXh0X291dHB1dF9mZCA+PSAwIHsKLSAgICAgICAgICAgICAgICBTb21lKEZpbGU6OmZyb21fcmF3X2ZkKHRleHRfb3V0cHV0X2ZkKSkKKyAgICAgICAgICAgICAgICAvLyBTQUZFVFk6IFRoZSBjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgdmFsaWQgYW5kIG9wZW4uCisgICAgICAgICAgICAgICAgU29tZSh1bnNhZmUgeyBGaWxlOjpmcm9tX3Jhd19mZCh0ZXh0X291dHB1dF9mZCkgfSkKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTm9uZQogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHByb3RvX291dHB1dDogaWYgcHJvdG9fb3V0cHV0X2ZkID49IDAgewotICAgICAgICAgICAgICAgIFNvbWUoRmlsZTo6ZnJvbV9yYXdfZmQocHJvdG9fb3V0cHV0X2ZkKSkKKyAgICAgICAgICAgICAgICAvLyBTQUZFVFk6IFRoZSBjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgdmFsaWQgYW5kIG9wZW4uCisgICAgICAgICAgICAgICAgU29tZSh1bnNhZmUgeyBGaWxlOjpmcm9tX3Jhd19mZChwcm90b19vdXRwdXRfZmQpIH0pCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIE5vbmUKICAgICAgICAgICAgIH0sCkBAIC03MSw2ICs3Nyw4IEBACiAgICAgICAgICAgICAmbXV0IHByb3RvX291dHB1dF9mZCwKICAgICAgICAgICAgIGR1bXBfdHlwZSwKICAgICAgICAgKSB7CisgICAgICAgICAgICAvLyBTQUZFVFk6IElmIHRvbWJzdG9uZWRfY29ubmVjdF9maWxlcyByZXR1cm5zIHN1Y2Nlc3NmdWxseSB0aGVuIHRoZXkgZmlsZSBkZXNjcmlwdG9ycworICAgICAgICAgICAgLy8gYXJlIHZhbGlkIGFuZCBvcGVuLgogICAgICAgICAgICAgT2sodW5zYWZlIHsgU2VsZjo6ZnJvbV9yYXdfZmRzKHRvbWJzdG9uZWRfc29ja2V0LCB0ZXh0X291dHB1dF9mZCwgcHJvdG9fb3V0cHV0X2ZkKSB9KQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgRXJyKEVycm9yKQpAQCAtMTQ2LDggKzE1NCw2IEBACiAgICAgICAgICAgICAud3JpdGVfYWxsKGIidGVzdCBkYXRhIikKICAgICAgICAgICAgIC5leHBlY3QoIkZhaWxlZCB0byB3cml0ZSB0byB0ZXh0IG91dHB1dCBGRC4iKTsKIAotICAgICAgICBjb25uZWN0aW9uCi0gICAgICAgICAgICAubm90aWZ5X2NvbXBsZXRpb24oKQotICAgICAgICAgICAgLmV4cGVjdCgiRmFpbGVkIHRvIG5vdGlmeSBjb21wbGV0aW9uLiIpOworICAgICAgICBjb25uZWN0aW9uLm5vdGlmeV9jb21wbGV0aW9uKCkuZXhwZWN0KCJGYWlsZWQgdG8gbm90aWZ5IGNvbXBsZXRpb24uIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeSBiL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKaW5kZXggOGZkMDNjNC4uYTcwYWIyMCAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorKysgYi9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CkBAIC0yMCw2ICsyMCw3IEBACiBmYWNjZXNzYXQ6IDEKIHJlY3Ztc2c6IDEKIHJlY3Zmcm9tOiAxCitzZXRzb2Nrb3B0OiAxCiBzeXNpbmZvOiAxCiBwcm9jZXNzX3ZtX3JlYWR2OiAxCiB0Z2tpbGw6IDEKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybTY0LnBvbGljeSBiL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybTY0LnBvbGljeQppbmRleCA4MjQxZjBlLi5hZGY4NzM4IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm02NC5wb2xpY3kKKysrIGIvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtNjQucG9saWN5CkBAIC0xOSw2ICsxOSw3IEBACiBmYWNjZXNzYXQ6IDEKIHJlY3Ztc2c6IDEKIHJlY3Zmcm9tOiAxCitzZXRzb2Nrb3B0OiAxCiBzeXNpbmZvOiAxCiBwcm9jZXNzX3ZtX3JlYWR2OiAxCiB0Z2tpbGw6IDEKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLnBvbGljeS5kZWYgYi9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5wb2xpY3kuZGVmCmluZGV4IDBjYjhlMDguLjk3MmE1NzUgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLnBvbGljeS5kZWYKKysrIGIvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAucG9saWN5LmRlZgpAQCAtMjYsNiArMjYsNyBAQAogcmVjdm1zZzogMQogcmVjdmZyb206IDEKIHN5c2luZm86IDEKK3NldHNvY2tvcHQ6IDEKIAogcHJvY2Vzc192bV9yZWFkdjogMQogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5yaXNjdjY0LnBvbGljeSBiL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLnJpc2N2NjQucG9saWN5CmluZGV4IDIxODg3YWIuLjk0YTU2NzcgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLnJpc2N2NjQucG9saWN5CisrKyBiL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLnJpc2N2NjQucG9saWN5CkBAIC0xOSwxMiArMTksMTQgQEAKIGZhY2Nlc3NhdDogMQogcmVjdm1zZzogMQogcmVjdmZyb206IDEKK3NldHNvY2tvcHQ6IDEKK3N5c2luZm86IDEKIHByb2Nlc3Nfdm1fcmVhZHY6IDEKIHRna2lsbDogMQogcnRfc2lncHJvY21hc2s6IDEKIHJ0X3NpZ2FjdGlvbjogMQogcnRfdGdzaWdxdWV1ZWluZm86IDEKLXByY3RsOiBhcmcwID09IFBSX0dFVF9OT19ORVdfUFJJVlMgfHwgYXJnMCA9PSAweDUzNTY0ZDQxIHx8IGFyZzAgPT0gUFJfUEFDX1JFU0VUX0tFWVMKK3ByY3RsOiBhcmcwID09IFBSX0dFVF9OT19ORVdfUFJJVlMgfHwgYXJnMCA9PSAweDUzNTY0ZDQxCiBtYWR2aXNlOiAxCiBtcHJvdGVjdDogYXJnMiBpbiAweDF8MHgyCiBtdW5tYXA6IDEKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kgYi9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CmluZGV4IDhmZDAzYzQuLmE3MGFiMjAgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKKysrIGIvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQpAQCAtMjAsNiArMjAsNyBAQAogZmFjY2Vzc2F0OiAxCiByZWN2bXNnOiAxCiByZWN2ZnJvbTogMQorc2V0c29ja29wdDogMQogc3lzaW5mbzogMQogcHJvY2Vzc192bV9yZWFkdjogMQogdGdraWxsOiAxCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODZfNjQucG9saWN5IGIvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2XzY0LnBvbGljeQppbmRleCAyODFlMjMxLi45NGE1Njc3IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODZfNjQucG9saWN5CisrKyBiL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Nl82NC5wb2xpY3kKQEAgLTE5LDYgKzE5LDcgQEAKIGZhY2Nlc3NhdDogMQogcmVjdm1zZzogMQogcmVjdmZyb206IDEKK3NldHNvY2tvcHQ6IDEKIHN5c2luZm86IDEKIHByb2Nlc3Nfdm1fcmVhZHY6IDEKIHRna2lsbDogMQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3RvbWJzdG9uZWQvaW50ZXJjZXB0X21hbmFnZXIuY3BwIGIvZGVidWdnZXJkL3RvbWJzdG9uZWQvaW50ZXJjZXB0X21hbmFnZXIuY3BwCmluZGV4IDYxM2U2ZjUuLmFjN2I0MzEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC90b21ic3RvbmVkL2ludGVyY2VwdF9tYW5hZ2VyLmNwcAorKysgYi9kZWJ1Z2dlcmQvdG9tYnN0b25lZC9pbnRlcmNlcHRfbWFuYWdlci5jcHAKQEAgLTE5LDcgKzE5LDEwIEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSA8ZXZlbnQyL2V2ZW50Lmg+CiAjaW5jbHVkZSA8ZXZlbnQyL2xpc3RlbmVyLmg+CkBAIC0zNiw4ICszOSw3IEBACiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKIHN0YXRpYyB2b2lkIGludGVyY2VwdF9jbG9zZV9jYihldnV0aWxfc29ja2V0X3Qgc29ja2ZkLCBzaG9ydCBldmVudCwgdm9pZCogYXJnKSB7Ci0gIGF1dG8gaW50ZXJjZXB0ID0gcmVpbnRlcnByZXRfY2FzdDxJbnRlcmNlcHQqPihhcmcpOwotICBJbnRlcmNlcHRNYW5hZ2VyKiBpbnRlcmNlcHRfbWFuYWdlciA9IGludGVyY2VwdC0+aW50ZXJjZXB0X21hbmFnZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcmNlcHQ+IGludGVyY2VwdChyZWludGVycHJldF9jYXN0PEludGVyY2VwdCo+KGFyZykpOwogCiAgIENIRUNLX0VRKHNvY2tmZCwgaW50ZXJjZXB0LT5zb2NrZmQuZ2V0KCkpOwogCkBAIC00NiwxMzEgKzQ4LDEwOCBAQAogCiAgIC8vIE93bmVyc2hpcCBvZiBpbnRlcmNlcHQgZGlmZmVycyBiYXNlZCBvbiB3aGV0aGVyIHdlJ3ZlIHJlZ2lzdGVyZWQgaXQgd2l0aCBJbnRlcmNlcHRNYW5hZ2VyLgogICBpZiAoIWludGVyY2VwdC0+cmVnaXN0ZXJlZCkgewotICAgIGRlbGV0ZSBpbnRlcmNlcHQ7Ci0gIH0gZWxzZSB7Ci0gICAgYXV0byBpdCA9IGludGVyY2VwdF9tYW5hZ2VyLT5pbnRlcmNlcHRzLmZpbmQoaW50ZXJjZXB0LT5pbnRlcmNlcHRfcGlkKTsKLSAgICBpZiAoaXQgPT0gaW50ZXJjZXB0X21hbmFnZXItPmludGVyY2VwdHMuZW5kKCkpIHsKLSAgICAgIExPRyhGQVRBTCkgPDwgImludGVyY2VwdCBjbG9zZSBjYWxsYmFjayBjYWxsZWQgYWZ0ZXIgaW50ZXJjZXB0IHdhcyBhbHJlYWR5IHJlbW92ZWQ/IjsKLSAgICB9Ci0gICAgaWYgKGl0LT5zZWNvbmQuZ2V0KCkgIT0gaW50ZXJjZXB0KSB7Ci0gICAgICBMT0coRkFUQUwpIDw8ICJpbnRlcmNlcHQgY2xvc2UgY2FsbGJhY2sgaGFzIGRpZmZlcmVudCBJbnRlcmNlcHQgZnJvbSBJbnRlcmNlcHRNYW5hZ2VyPyI7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciogcmVhc29uOwotICAgIGlmICgoZXZlbnQgJiBFVl9USU1FT1VUKSAhPSAwKSB7Ci0gICAgICByZWFzb24gPSAiZHVlIHRvIHRpbWVvdXQiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZWFzb24gPSAiZHVlIHRvIGlucHV0IjsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgImludGVyY2VwdCBmb3IgcGlkICIgPDwgaW50ZXJjZXB0LT5pbnRlcmNlcHRfcGlkIDw8ICIgYW5kIHR5cGUgIgotICAgICAgICAgICAgICA8PCBpbnRlcmNlcHQtPmR1bXBfdHlwZSA8PCAiIHRlcm1pbmF0ZWQ6ICIgPDwgcmVhc29uOwotICAgIGludGVyY2VwdF9tYW5hZ2VyLT5pbnRlcmNlcHRzLmVyYXNlKGl0KTsKKyAgICBMT0coV0FSTklORykgPDwgImludGVyY2VwdCBmb3IgcGlkICIgPDwgaW50ZXJjZXB0LT5waWQgPDwgIiBhbmQgdHlwZSAiIDw8IGludGVyY2VwdC0+ZHVtcF90eXBlCisgICAgICAgICAgICAgICAgIDw8ICIgY2xvc2VkIGJlZm9yZSBiZWluZyByZWdpc3RlcmVkLiI7CisgICAgcmV0dXJuOwogICB9CisKKyAgY29uc3QgY2hhciogcmVhc29uID0gKGV2ZW50ICYgRVZfVElNRU9VVCkgPyAiZHVlIHRvIHRpbWVvdXQiIDogImR1ZSB0byBpbnB1dCI7CisgIExPRyhJTkZPKSA8PCAiaW50ZXJjZXB0IGZvciBwaWQgIiA8PCBpbnRlcmNlcHQtPnBpZCA8PCAiIGFuZCB0eXBlICIgPDwgaW50ZXJjZXB0LT5kdW1wX3R5cGUKKyAgICAgICAgICAgIDw8ICIgdGVybWluYXRlZDogIiA8PCByZWFzb247CiB9CiAKLXN0YXRpYyBib29sIGlzX2ludGVyY2VwdF9yZXF1ZXN0X3ZhbGlkKGNvbnN0IEludGVyY2VwdFJlcXVlc3QmIHJlcXVlc3QpIHsKLSAgaWYgKHJlcXVlc3QucGlkIDw9IDAgfHwgcmVxdWVzdC5waWQgPiBzdGQ6Om51bWVyaWNfbGltaXRzPHBpZF90Pjo6bWF4KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Cit2b2lkIEludGVyY2VwdE1hbmFnZXI6OlVucmVnaXN0ZXIoSW50ZXJjZXB0KiBpbnRlcmNlcHQpIHsKKyAgQ0hFQ0soaW50ZXJjZXB0LT5yZWdpc3RlcmVkKTsKKyAgYXV0byBwaWRfZW50cnkgPSBpbnRlcmNlcHRzLmZpbmQoaW50ZXJjZXB0LT5waWQpOworICBpZiAocGlkX2VudHJ5ID09IGludGVyY2VwdHMuZW5kKCkpIHsKKyAgICBMT0coRkFUQUwpIDw8ICJObyBpbnRlcmNlcHRzIGZvdW5kIGZvciBwaWQgIiA8PCBpbnRlcmNlcHQtPnBpZDsKKyAgfQorICBhdXRvJiBkdW1wX3R5cGVfaGFzaCA9IHBpZF9lbnRyeS0+c2Vjb25kOworICBhdXRvIGR1bXBfdHlwZV9lbnRyeSA9IGR1bXBfdHlwZV9oYXNoLmZpbmQoaW50ZXJjZXB0LT5kdW1wX3R5cGUpOworICBpZiAoZHVtcF90eXBlX2VudHJ5ID09IGR1bXBfdHlwZV9oYXNoLmVuZCgpKSB7CisgICAgTE9HKEZBVEFMKSA8PCAiVW5rbm93biBpbnRlcmNlcHQgIiA8PCBpbnRlcmNlcHQtPnBpZCA8PCAiICIgPDwgaW50ZXJjZXB0LT5kdW1wX3R5cGU7CisgIH0KKyAgaWYgKGludGVyY2VwdCAhPSBkdW1wX3R5cGVfZW50cnktPnNlY29uZCkgeworICAgIExPRyhGQVRBTCkgPDwgIk1pc21hdGNoIHBvaW50ZXIgdHJ5aW5nIHRvIHVucmVnaXN0ZXIgaW50ZXJjZXB0ICIgPDwgaW50ZXJjZXB0LT5waWQgPDwgIiAiCisgICAgICAgICAgICAgICA8PCBpbnRlcmNlcHQtPmR1bXBfdHlwZTsKICAgfQogCi0gIGlmIChyZXF1ZXN0LmR1bXBfdHlwZSA8IDAgfHwgcmVxdWVzdC5kdW1wX3R5cGUgPiBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSkgewotICAgIHJldHVybiBmYWxzZTsKKyAgZHVtcF90eXBlX2hhc2guZXJhc2UoZHVtcF90eXBlX2VudHJ5KTsKKyAgaWYgKGR1bXBfdHlwZV9oYXNoLmVtcHR5KCkpIHsKKyAgICBpbnRlcmNlcHRzLmVyYXNlKHBpZF9lbnRyeSk7CiAgIH0KLQotICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZXJjZXB0X3JlcXVlc3RfY2IoZXZ1dGlsX3NvY2tldF90IHNvY2tmZCwgc2hvcnQgZXYsIHZvaWQqIGFyZykgewotICBhdXRvIGludGVyY2VwdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8SW50ZXJjZXB0Kj4oYXJnKTsKKyAgc3RkOjp1bmlxdWVfcHRyPEludGVyY2VwdD4gaW50ZXJjZXB0KHJlaW50ZXJwcmV0X2Nhc3Q8SW50ZXJjZXB0Kj4oYXJnKSk7CiAgIEludGVyY2VwdE1hbmFnZXIqIGludGVyY2VwdF9tYW5hZ2VyID0gaW50ZXJjZXB0LT5pbnRlcmNlcHRfbWFuYWdlcjsKIAogICBDSEVDS19FUShzb2NrZmQsIGludGVyY2VwdC0+c29ja2ZkLmdldCgpKTsKIAogICBpZiAoKGV2ICYgRVZfVElNRU9VVCkgIT0gMCkgewogICAgIExPRyhXQVJOSU5HKSA8PCAidG9tYnN0b25lZCBkaWRuJ3QgcmVjZWl2ZSBJbnRlcmNlcHRSZXF1ZXN0IGJlZm9yZSB0aW1lb3V0IjsKLSAgICBnb3RvIGZhaWw7CisgICAgcmV0dXJuOwogICB9IGVsc2UgaWYgKChldiAmIEVWX1JFQUQpID09IDApIHsKICAgICBMT0coV0FSTklORykgPDwgInRvbWJzdG9uZWQgcmVjZWl2ZWQgdW5leHBlY3RlZCBldmVudCBvbiBpbnRlcmNlcHQgc29ja2V0IjsKLSAgICBnb3RvIGZhaWw7CisgICAgcmV0dXJuOwogICB9CiAKLSAgewotICAgIHVuaXF1ZV9mZCByY3ZfZmQ7Ci0gICAgSW50ZXJjZXB0UmVxdWVzdCBpbnRlcmNlcHRfcmVxdWVzdDsKLSAgICBzc2l6ZV90IHJlc3VsdCA9Ci0gICAgICAgIFJlY2VpdmVGaWxlRGVzY3JpcHRvcnMoc29ja2ZkLCAmaW50ZXJjZXB0X3JlcXVlc3QsIHNpemVvZihpbnRlcmNlcHRfcmVxdWVzdCksICZyY3ZfZmQpOworICB1bmlxdWVfZmQgcmN2X2ZkOworICBJbnRlcmNlcHRSZXF1ZXN0IGludGVyY2VwdF9yZXF1ZXN0OworICBzc2l6ZV90IHJlc3VsdCA9CisgICAgICBSZWNlaXZlRmlsZURlc2NyaXB0b3JzKHNvY2tmZCwgJmludGVyY2VwdF9yZXF1ZXN0LCBzaXplb2YoaW50ZXJjZXB0X3JlcXVlc3QpLCAmcmN2X2ZkKTsKIAotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgIFBMT0coV0FSTklORykgPDwgImZhaWxlZCB0byByZWFkIGZyb20gaW50ZXJjZXB0IHNvY2tldCI7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gc2l6ZW9mKGludGVyY2VwdF9yZXF1ZXN0KSkgewotICAgICAgTE9HKFdBUk5JTkcpIDw8ICJpbnRlcmNlcHQgc29ja2V0IHJlY2VpdmVkIHNob3J0IHJlYWQgb2YgbGVuZ3RoICIgPDwgcmVzdWx0IDw8ICIgKGV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICA8PCBzaXplb2YoaW50ZXJjZXB0X3JlcXVlc3QpIDw8ICIpIjsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvLyBNb3ZlIHRoZSByZWNlaXZlZCBGRCB0byB0aGUgdXBwZXIgaGFsZiwgaW4gb3JkZXIgdG8gbW9yZSBlYXNpbHkgbm90aWNlIEZEIGxlYWtzLgotICAgIGludCBtb3ZlZF9mZCA9IGZjbnRsKHJjdl9mZC5nZXQoKSwgRl9EVVBGRCwgNTEyKTsKLSAgICBpZiAobW92ZWRfZmQgPT0gLTEpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiZmFpbGVkIHRvIG1vdmUgcmVjZWl2ZWQgZmQgKCIgPDwgcmN2X2ZkLmdldCgpIDw8ICIpIjsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gICAgcmN2X2ZkLnJlc2V0KG1vdmVkX2ZkKTsKLQotICAgIC8vIFdlIHRydXN0IHRoZSBvdGhlciBzaWRlLCBzbyBvbmx5IGRvIG1pbmltYWwgdmFsaWRpdHkgY2hlY2tpbmcuCi0gICAgaWYgKCFpc19pbnRlcmNlcHRfcmVxdWVzdF92YWxpZChpbnRlcmNlcHRfcmVxdWVzdCkpIHsKLSAgICAgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307Ci0gICAgICByZXNwb25zZS5zdGF0dXMgPSBJbnRlcmNlcHRTdGF0dXM6OmtGYWlsZWQ7Ci0gICAgICBzbnByaW50ZihyZXNwb25zZS5lcnJvcl9tZXNzYWdlLCBzaXplb2YocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSksICJpbnZhbGlkIGludGVyY2VwdCByZXF1ZXN0Iik7Ci0gICAgICBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoc29ja2ZkLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpKTsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpbnRlcmNlcHQtPmludGVyY2VwdF9waWQgPSBpbnRlcmNlcHRfcmVxdWVzdC5waWQ7Ci0gICAgaW50ZXJjZXB0LT5kdW1wX3R5cGUgPSBpbnRlcmNlcHRfcmVxdWVzdC5kdW1wX3R5cGU7Ci0KLSAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAgICBpZiAoaW50ZXJjZXB0X21hbmFnZXItPmludGVyY2VwdHMuY291bnQoaW50ZXJjZXB0X3JlcXVlc3QucGlkKSA+IDApIHsKLSAgICAgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307Ci0gICAgICByZXNwb25zZS5zdGF0dXMgPSBJbnRlcmNlcHRTdGF0dXM6OmtGYWlsZWRBbHJlYWR5UmVnaXN0ZXJlZDsKLSAgICAgIHNucHJpbnRmKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UsIHNpemVvZihyZXNwb25zZS5lcnJvcl9tZXNzYWdlKSwKLSAgICAgICAgICAgICAgICJwaWQgJSIgUFJJZDMyICIgYWxyZWFkeSBpbnRlcmNlcHRlZCwgdHlwZSAlZCIsIGludGVyY2VwdF9yZXF1ZXN0LnBpZCwKLSAgICAgICAgICAgICAgIGludGVyY2VwdF9yZXF1ZXN0LmR1bXBfdHlwZSk7Ci0gICAgICBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoc29ja2ZkLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpKTsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOwotICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIC8vIExldCB0aGUgb3RoZXIgc2lkZSBrbm93IHRoYXQgdGhlIGludGVyY2VwdCBoYXMgYmVlbiByZWdpc3RlcmVkLCBub3cgdGhhdCB3ZSBrbm93IHdlIGNhbid0Ci0gICAgLy8gZmFpbC4gdG9tYnN0b25lZCBpcyBzaW5nbGUgdGhyZWFkZWQsIHNvIHRoaXMgaXNuJ3QgcmFjeS4KLSAgICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OwotICAgIHJlc3BvbnNlLnN0YXR1cyA9IEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQ7Ci0gICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShzb2NrZmQsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSkpID09IC0xKSB7Ci0gICAgICBQTE9HKFdBUk5JTkcpIDw8ICJmYWlsZWQgdG8gbm90aWZ5IGludGVyY2VwdG9yIG9mIHJlZ2lzdHJhdGlvbiI7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaW50ZXJjZXB0LT5vdXRwdXRfZmQgPSBzdGQ6Om1vdmUocmN2X2ZkKTsKLSAgICBpbnRlcmNlcHRfbWFuYWdlci0+aW50ZXJjZXB0c1tpbnRlcmNlcHRfcmVxdWVzdC5waWRdID0gc3RkOjp1bmlxdWVfcHRyPEludGVyY2VwdD4oaW50ZXJjZXB0KTsKLSAgICBpbnRlcmNlcHQtPnJlZ2lzdGVyZWQgPSB0cnVlOwotCi0gICAgTE9HKElORk8pIDw8ICJyZWdpc3RlcmVkIGludGVyY2VwdCBmb3IgcGlkICIgPDwgaW50ZXJjZXB0X3JlcXVlc3QucGlkIDw8ICIgYW5kIHR5cGUgIgotICAgICAgICAgICAgICA8PCBpbnRlcmNlcHRfcmVxdWVzdC5kdW1wX3R5cGU7Ci0KLSAgICAvLyBSZWdpc3RlciBhIGRpZmZlcmVudCByZWFkIGV2ZW50IG9uIHRoZSBzb2NrZXQgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIGludGVyY2VwdHMgaWYgdGhlIHNvY2tldAotICAgIC8vIGNsb3NlcyAoZS5nLiBpZiBhIHVzZXIgQ1RSTC1DJ3MgdGhlIHByb2Nlc3MgdGhhdCByZXF1ZXN0ZWQgdGhlIGludGVyY2VwdCkuCi0gICAgZXZlbnRfYXNzaWduKGludGVyY2VwdC0+aW50ZXJjZXB0X2V2ZW50LCBpbnRlcmNlcHRfbWFuYWdlci0+YmFzZSwgc29ja2ZkLCBFVl9SRUFEIHwgRVZfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgaW50ZXJjZXB0X2Nsb3NlX2NiLCBhcmcpOwotCi0gICAgc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsudHZfc2VjID0gMTAgKiBhbmRyb2lkOjpiYXNlOjpId1RpbWVvdXRNdWx0aXBsaWVyKCksIC50dl91c2VjID0gMH07Ci0gICAgZXZlbnRfYWRkKGludGVyY2VwdC0+aW50ZXJjZXB0X2V2ZW50LCAmdGltZW91dCk7CisgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICBQTE9HKFdBUk5JTkcpIDw8ICJmYWlsZWQgdG8gcmVhZCBmcm9tIGludGVyY2VwdCBzb2NrZXQiOworICAgIHJldHVybjsKKyAgfQorICBpZiAocmVzdWx0ICE9IHNpemVvZihpbnRlcmNlcHRfcmVxdWVzdCkpIHsKKyAgICBMT0coV0FSTklORykgPDwgImludGVyY2VwdCBzb2NrZXQgcmVjZWl2ZWQgc2hvcnQgcmVhZCBvZiBsZW5ndGggIiA8PCByZXN1bHQgPDwgIiAoZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgICA8PCBzaXplb2YoaW50ZXJjZXB0X3JlcXVlc3QpIDw8ICIpIjsKKyAgICByZXR1cm47CiAgIH0KIAotICByZXR1cm47CisgIC8vIE1vdmUgdGhlIHJlY2VpdmVkIEZEIHRvIHRoZSB1cHBlciBoYWxmLCBpbiBvcmRlciB0byBtb3JlIGVhc2lseSBub3RpY2UgRkQgbGVha3MuCisgIGludCBtb3ZlZF9mZCA9IGZjbnRsKHJjdl9mZC5nZXQoKSwgRl9EVVBGRCwgNTEyKTsKKyAgaWYgKG1vdmVkX2ZkID09IC0xKSB7CisgICAgTE9HKFdBUk5JTkcpIDw8ICJmYWlsZWQgdG8gbW92ZSByZWNlaXZlZCBmZCAoIiA8PCByY3ZfZmQuZ2V0KCkgPDwgIikiOworICAgIHJldHVybjsKKyAgfQorICByY3ZfZmQucmVzZXQobW92ZWRfZmQpOwogCi1mYWlsOgotICBkZWxldGUgaW50ZXJjZXB0OworICAvLyBTZWUgaWYgd2UgY2FuIHByb3Blcmx5IHJlZ2lzdGVyIHRoZSBpbnRlcmNlcHQuCisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIGlmICghaW50ZXJjZXB0X21hbmFnZXItPkNhblJlZ2lzdGVyKGludGVyY2VwdF9yZXF1ZXN0LCByZXNwb25zZSkpIHsKKyAgICBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoc29ja2ZkLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpKTsKKyAgICBMT0coV0FSTklORykgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBMZXQgdGhlIG90aGVyIHNpZGUga25vdyB0aGF0IHRoZSBpbnRlcmNlcHQgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgbm93IHRoYXQgd2Uga25vdyB3ZSBjYW4ndAorICAvLyBmYWlsLiB0b21ic3RvbmVkIGlzIHNpbmdsZSB0aHJlYWRlZCwgc28gdGhpcyBpc24ndCByYWN5LgorICByZXNwb25zZS5zdGF0dXMgPSBJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkOworICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKHNvY2tmZCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSkgPT0gLTEpIHsKKyAgICBQTE9HKFdBUk5JTkcpIDw8ICJmYWlsZWQgdG8gbm90aWZ5IGludGVyY2VwdG9yIG9mIHJlZ2lzdHJhdGlvbiI7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50ZXJjZXB0LT5waWQgPSBpbnRlcmNlcHRfcmVxdWVzdC5waWQ7CisgIGludGVyY2VwdC0+ZHVtcF90eXBlID0gaW50ZXJjZXB0X3JlcXVlc3QuZHVtcF90eXBlOworICBpbnRlcmNlcHQtPm91dHB1dF9mZCA9IHN0ZDo6bW92ZShyY3ZfZmQpOworICBpbnRlcmNlcHRfbWFuYWdlci0+UmVnaXN0ZXIoaW50ZXJjZXB0LmdldCgpKTsKKworICBMT0coSU5GTykgPDwgInJlZ2lzdGVyZWQgaW50ZXJjZXB0IGZvciBwaWQgIiA8PCBpbnRlcmNlcHRfcmVxdWVzdC5waWQgPDwgIiBhbmQgdHlwZSAiCisgICAgICAgICAgICA8PCBpbnRlcmNlcHRfcmVxdWVzdC5kdW1wX3R5cGU7CisKKyAgLy8gUmVnaXN0ZXIgYSBkaWZmZXJlbnQgcmVhZCBldmVudCBvbiB0aGUgc29ja2V0IHNvIHRoYXQgd2UgY2FuIHJlbW92ZSBpbnRlcmNlcHRzIGlmIHRoZSBzb2NrZXQKKyAgLy8gY2xvc2VzIChlLmcuIGlmIGEgdXNlciBDVFJMLUMncyB0aGUgcHJvY2VzcyB0aGF0IHJlcXVlc3RlZCB0aGUgaW50ZXJjZXB0KS4KKyAgZXZlbnRfYXNzaWduKGludGVyY2VwdC0+aW50ZXJjZXB0X2V2ZW50LCBpbnRlcmNlcHRfbWFuYWdlci0+YmFzZSwgc29ja2ZkLCBFVl9SRUFEIHwgRVZfVElNRU9VVCwKKyAgICAgICAgICAgICAgIGludGVyY2VwdF9jbG9zZV9jYiwgYXJnKTsKKworICAvLyBJZiBubyByZXF1ZXN0IGNvbWVzIGluLCB0aGVuIHRoaXMgd2lsbCBjbG9zZSB0aGUgaW50ZXJjZXB0IGFuZCBmcmVlIHRoZSBwb2ludGVyLgorICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0ID0gey50dl9zZWMgPSAxMCAqIGFuZHJvaWQ6OmJhc2U6Okh3VGltZW91dE11bHRpcGxpZXIoKSwgLnR2X3VzZWMgPSAwfTsKKyAgZXZlbnRfYWRkKGludGVyY2VwdC0+aW50ZXJjZXB0X2V2ZW50LCAmdGltZW91dCk7CisgIGludGVyY2VwdC5yZWxlYXNlKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVyY2VwdF9hY2NlcHRfY2IoZXZjb25ubGlzdGVuZXIqIGxpc3RlbmVyLCBldnV0aWxfc29ja2V0X3Qgc29ja2ZkLCBzb2NrYWRkciosIGludCwKQEAgLTE4Nyw0MSArMTY2LDk3IEBACiAgIGV2ZW50X2FkZChpbnRlcmNlcHRfZXZlbnQsICZ0aW1lb3V0KTsKIH0KIAorSW50ZXJjZXB0Ojp+SW50ZXJjZXB0KCkgeworICBldmVudF9mcmVlKGludGVyY2VwdF9ldmVudCk7CisgIGlmIChyZWdpc3RlcmVkKSB7CisgICAgQ0hFQ0soaW50ZXJjZXB0X21hbmFnZXIgIT0gbnVsbHB0cik7CisgICAgaW50ZXJjZXB0X21hbmFnZXItPlVucmVnaXN0ZXIodGhpcyk7CisgIH0KK30KKwogSW50ZXJjZXB0TWFuYWdlcjo6SW50ZXJjZXB0TWFuYWdlcihldmVudF9iYXNlKiBiYXNlLCBpbnQgaW50ZXJjZXB0X3NvY2tldCkgOiBiYXNlKGJhc2UpIHsKICAgdGhpcy0+bGlzdGVuZXIgPSBldmNvbm5saXN0ZW5lcl9uZXcoYmFzZSwgaW50ZXJjZXB0X2FjY2VwdF9jYiwgdGhpcywgTEVWX09QVF9DTE9TRV9PTl9GUkVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYWNrbG9nICovIC0xLCBpbnRlcmNlcHRfc29ja2V0KTsKIH0KIAotYm9vbCBkdW1wX3R5cGVzX2NvbXBhdGlibGUoRGVidWdnZXJkRHVtcFR5cGUgaW50ZXJjZXB0b3IsIERlYnVnZ2VyZER1bXBUeXBlIGR1bXApIHsKLSAgaWYgKGludGVyY2VwdG9yID09IGR1bXApIHsKLSAgICByZXR1cm4gdHJ1ZTsKK3N0YXRpYyBEZWJ1Z2dlcmREdW1wVHlwZSBjYW5vbmljYWxfZHVtcF90eXBlKGNvbnN0IERlYnVnZ2VyZER1bXBUeXBlIGR1bXBfdHlwZSkgeworICAvLyBrRGVidWdnZXJkVG9tYnN0b25lIGFuZCBrRGVidWdnZXJkVG9tYnN0b25lUHJvdG8gc2hvdWxkIGJlIHRyZWF0ZWQgYXMKKyAgLy8gYSBzaW5nbGUgZHVtcF90eXBlIGZvciBpbnRlcmNlcHRzIChrRGVidWdnZXJkVG9tYnN0b25lKS4KKyAgaWYgKGR1bXBfdHlwZSA9PSBrRGVidWdnZXJkVG9tYnN0b25lUHJvdG8pIHsKKyAgICByZXR1cm4ga0RlYnVnZ2VyZFRvbWJzdG9uZTsKICAgfQotCi0gIGlmIChpbnRlcmNlcHRvciA9PSBrRGVidWdnZXJkVG9tYnN0b25lICYmIGR1bXAgPT0ga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBkdW1wX3R5cGU7CiB9CiAKLWJvb2wgSW50ZXJjZXB0TWFuYWdlcjo6R2V0SW50ZXJjZXB0KHBpZF90IHBpZCwgRGVidWdnZXJkRHVtcFR5cGUgZHVtcF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBvdXRfZmQpIHsKLSAgYXV0byBpdCA9IHRoaXMtPmludGVyY2VwdHMuZmluZChwaWQpOwotICBpZiAoaXQgPT0gdGhpcy0+aW50ZXJjZXB0cy5lbmQoKSkgeworSW50ZXJjZXB0KiBJbnRlcmNlcHRNYW5hZ2VyOjpHZXQoY29uc3QgcGlkX3QgcGlkLCBjb25zdCBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wX3R5cGUpIHsKKyAgYXV0byBwaWRfZW50cnkgPSBpbnRlcmNlcHRzLmZpbmQocGlkKTsKKyAgaWYgKHBpZF9lbnRyeSA9PSBpbnRlcmNlcHRzLmVuZCgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBjb25zdCBhdXRvJiBkdW1wX3R5cGVfaGFzaCA9IHBpZF9lbnRyeS0+c2Vjb25kOworICBhdXRvIGR1bXBfdHlwZV9lbnRyeSA9IGR1bXBfdHlwZV9oYXNoLmZpbmQoY2Fub25pY2FsX2R1bXBfdHlwZShkdW1wX3R5cGUpKTsKKyAgaWYgKGR1bXBfdHlwZV9lbnRyeSA9PSBkdW1wX3R5cGVfaGFzaC5lbmQoKSkgeworICAgIGlmIChkdW1wX3R5cGUgIT0ga0RlYnVnZ2VyZEFueUludGVyY2VwdCkgeworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIC8vIElmIGRvaW5nIGEgZHVtcCB3aXRoIGFuIGFueSBpbnRlcmNlcHQsIG9ubHkgYWxsb3cgYW4gYW55IHRvIG1hdGNoCisgICAgLy8gYSBzaW5nbGUgaW50ZXJjZXB0LiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZHVtcCB0eXBlcyB3aXRoIGludGVyY2VwdHMKKyAgICAvLyB0aGVuIHRoZXJlIHdvdWxkIGJlIG5vIHdheSB0byBmaWd1cmUgb3V0IHdoaWNoIHRvIHVzZS4KKyAgICBpZiAoZHVtcF90eXBlX2hhc2guc2l6ZSgpICE9IDEpIHsKKyAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IGludGVyY2VwdCB1c2luZyBrRGVidWdnZXJkQW55SW50ZXJjZXB0OiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJjZXB0IHJlZ2lzdGVyZWQgZm9yIHBpZCAiCisgICAgICAgICAgICAgICAgICAgPDwgcGlkOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGR1bXBfdHlwZV9lbnRyeSA9IGR1bXBfdHlwZV9oYXNoLmJlZ2luKCk7CisgIH0KKyAgcmV0dXJuIGR1bXBfdHlwZV9lbnRyeS0+c2Vjb25kOworfQorCitib29sIEludGVyY2VwdE1hbmFnZXI6OkNhblJlZ2lzdGVyKGNvbnN0IEludGVyY2VwdFJlcXVlc3QmIHJlcXVlc3QsIEludGVyY2VwdFJlc3BvbnNlJiByZXNwb25zZSkgeworICBpZiAocmVxdWVzdC5waWQgPD0gMCB8fCByZXF1ZXN0LnBpZCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8cGlkX3Q+OjptYXgoKSkgeworICAgIHJlc3BvbnNlLnN0YXR1cyA9IEludGVyY2VwdFN0YXR1czo6a0ZhaWxlZDsKKyAgICBzbnByaW50ZihyZXNwb25zZS5lcnJvcl9tZXNzYWdlLCBzaXplb2YocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSksCisgICAgICAgICAgICAgImludmFsaWQgaW50ZXJjZXB0IHJlcXVlc3Q6IGJhZCBwaWQgJSIgUFJJZDMyLCByZXF1ZXN0LnBpZCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChyZXF1ZXN0LmR1bXBfdHlwZSA8IDAgfHwgcmVxdWVzdC5kdW1wX3R5cGUgPiBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSkgeworICAgIHJlc3BvbnNlLnN0YXR1cyA9IEludGVyY2VwdFN0YXR1czo6a0ZhaWxlZDsKKyAgICBzbnByaW50ZihyZXNwb25zZS5lcnJvcl9tZXNzYWdlLCBzaXplb2YocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSksCisgICAgICAgICAgICAgImludmFsaWQgaW50ZXJjZXB0IHJlcXVlc3Q6IGJhZCBkdW1wIHR5cGUgJXMiLCBnZXRfZHVtcF90eXBlX25hbWUocmVxdWVzdC5kdW1wX3R5cGUpKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBpZiAoZHVtcF90eXBlID09IGtEZWJ1Z2dlcmRBbnlJbnRlcmNlcHQpIHsKLSAgICBMT0coSU5GTykgPDwgImZvdW5kIHJlZ2lzdGVyZWQgaW50ZXJjZXB0IG9mIHR5cGUgIiA8PCBpdC0+c2Vjb25kLT5kdW1wX3R5cGUKLSAgICAgICAgICAgICAgPDwgIiBmb3IgcmVxdWVzdGVkIHR5cGUga0RlYnVnZ2VyZEFueUludGVyY2VwdCI7Ci0gIH0gZWxzZSBpZiAoIWR1bXBfdHlwZXNfY29tcGF0aWJsZShpdC0+c2Vjb25kLT5kdW1wX3R5cGUsIGR1bXBfdHlwZSkpIHsKLSAgICBMT0coV0FSTklORykgPDwgImZvdW5kIG5vbi1tYXRjaGluZyBpbnRlcmNlcHQgb2YgdHlwZSAiIDw8IGl0LT5zZWNvbmQtPmR1bXBfdHlwZQotICAgICAgICAgICAgICAgICA8PCAiIGZvciByZXF1ZXN0ZWQgdHlwZTogIiA8PCBkdW1wX3R5cGU7CisgIGlmIChHZXQocmVxdWVzdC5waWQsIHJlcXVlc3QuZHVtcF90eXBlKSAhPSBudWxscHRyKSB7CisgICAgcmVzcG9uc2Uuc3RhdHVzID0gSW50ZXJjZXB0U3RhdHVzOjprRmFpbGVkQWxyZWFkeVJlZ2lzdGVyZWQ7CisgICAgc25wcmludGYocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSwgc2l6ZW9mKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UpLAorICAgICAgICAgICAgICJwaWQgJSIgUFJJZDMyICIgYWxyZWFkeSByZWdpc3RlcmVkLCB0eXBlICVzIiwgcmVxdWVzdC5waWQsCisgICAgICAgICAgICAgZ2V0X2R1bXBfdHlwZV9uYW1lKHJlcXVlc3QuZHVtcF90eXBlKSk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgYXV0byBpbnRlcmNlcHQgPSBzdGQ6Om1vdmUoaXQtPnNlY29uZCk7Ci0gIHRoaXMtPmludGVyY2VwdHMuZXJhc2UoaXQpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJbnRlcmNlcHRNYW5hZ2VyOjpSZWdpc3RlcihJbnRlcmNlcHQqIGludGVyY2VwdCkgeworICBDSEVDSyghaW50ZXJjZXB0LT5yZWdpc3RlcmVkKTsKKyAgYXV0byYgZHVtcF90eXBlX2hhc2ggPSBpbnRlcmNlcHRzW2ludGVyY2VwdC0+cGlkXTsKKyAgZHVtcF90eXBlX2hhc2hbY2Fub25pY2FsX2R1bXBfdHlwZShpbnRlcmNlcHQtPmR1bXBfdHlwZSldID0gaW50ZXJjZXB0OworICBpbnRlcmNlcHQtPnJlZ2lzdGVyZWQgPSB0cnVlOworfQorCitib29sIEludGVyY2VwdE1hbmFnZXI6OkZpbmRJbnRlcmNlcHQocGlkX3QgcGlkLCBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBvdXRfZmQpIHsKKyAgSW50ZXJjZXB0KiBpbnRlcmNlcHQgPSBHZXQocGlkLCBkdW1wX3R5cGUpOworICBpZiAoaW50ZXJjZXB0ID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoZHVtcF90eXBlICE9IGludGVyY2VwdC0+ZHVtcF90eXBlKSB7CisgICAgTE9HKElORk8pIDw8ICJmb3VuZCByZWdpc3RlcmVkIGludGVyY2VwdCBvZiB0eXBlICIgPDwgaW50ZXJjZXB0LT5kdW1wX3R5cGUKKyAgICAgICAgICAgICAgPDwgIiBmb3IgcmVxdWVzdGVkIHR5cGUgIiA8PCBkdW1wX3R5cGU7CisgIH0KIAogICBMT0coSU5GTykgPDwgImZvdW5kIGludGVyY2VwdCBmZCAiIDw8IGludGVyY2VwdC0+b3V0cHV0X2ZkLmdldCgpIDw8ICIgZm9yIHBpZCAiIDw8IHBpZAogICAgICAgICAgICAgPDwgIiBhbmQgdHlwZSAiIDw8IGludGVyY2VwdC0+ZHVtcF90eXBlOwpAQCAtMjMwLDUgKzI2NSw4IEBACiAgIFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShpbnRlcmNlcHQtPnNvY2tmZCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSk7CiAgICpvdXRfZmQgPSBzdGQ6Om1vdmUoaW50ZXJjZXB0LT5vdXRwdXRfZmQpOwogCisgIC8vIERlbGV0ZSB0aGUgaW50ZXJjZXB0IGRhdGEsIHdoaWNoIHdpbGwgdW5yZWdpc3RlciB0aGUgaW50ZXJjZXB0IGFuZCByZW1vdmUgdGhlIHRpbWVvdXQgZXZlbnQuCisgIGRlbGV0ZSBpbnRlcmNlcHQ7CisKICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvdG9tYnN0b25lZC9pbnRlcmNlcHRfbWFuYWdlci5oIGIvZGVidWdnZXJkL3RvbWJzdG9uZWQvaW50ZXJjZXB0X21hbmFnZXIuaAppbmRleCBhMTFkNTY1Li5kYzEzYWE5IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvdG9tYnN0b25lZC9pbnRlcmNlcHRfbWFuYWdlci5oCisrKyBiL2RlYnVnZ2VyZC90b21ic3RvbmVkL2ludGVyY2VwdF9tYW5hZ2VyLmgKQEAgLTI4LDE3ICsyOCwxNyBAQAogI2luY2x1ZGUgImR1bXBfdHlwZS5oIgogCiBzdHJ1Y3QgSW50ZXJjZXB0TWFuYWdlcjsKK3N0cnVjdCBJbnRlcmNlcHRSZXF1ZXN0Oworc3RydWN0IEludGVyY2VwdFJlc3BvbnNlOwogCiBzdHJ1Y3QgSW50ZXJjZXB0IHsKLSAgfkludGVyY2VwdCgpIHsKLSAgICBldmVudF9mcmVlKGludGVyY2VwdF9ldmVudCk7Ci0gIH0KKyAgfkludGVyY2VwdCgpOwogCiAgIEludGVyY2VwdE1hbmFnZXIqIGludGVyY2VwdF9tYW5hZ2VyID0gbnVsbHB0cjsKICAgZXZlbnQqIGludGVyY2VwdF9ldmVudCA9IG51bGxwdHI7CiAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBzb2NrZmQ7CiAKLSAgcGlkX3QgaW50ZXJjZXB0X3BpZCA9IC0xOworICBwaWRfdCBwaWQgPSAtMTsKICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIG91dHB1dF9mZDsKICAgYm9vbCByZWdpc3RlcmVkID0gZmFsc2U7CiAgIERlYnVnZ2VyZER1bXBUeXBlIGR1bXBfdHlwZSA9IGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2U7CkBAIC00NiwxMiArNDYsMTcgQEAKIAogc3RydWN0IEludGVyY2VwdE1hbmFnZXIgewogICBldmVudF9iYXNlKiBiYXNlOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8cGlkX3QsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcmNlcHQ+PiBpbnRlcmNlcHRzOworICBzdGQ6OnVub3JkZXJlZF9tYXA8cGlkX3QsIHN0ZDo6dW5vcmRlcmVkX21hcDxEZWJ1Z2dlcmREdW1wVHlwZSwgSW50ZXJjZXB0Kj4+IGludGVyY2VwdHM7CiAgIGV2Y29ubmxpc3RlbmVyKiBsaXN0ZW5lciA9IG51bGxwdHI7CiAKICAgSW50ZXJjZXB0TWFuYWdlcihldmVudF9iYXNlKiBfTm9ubnVsbCBiYXNlLCBpbnQgaW50ZXJjZXB0X3NvY2tldCk7CiAgIEludGVyY2VwdE1hbmFnZXIoSW50ZXJjZXB0TWFuYWdlciYgY29weSkgPSBkZWxldGU7CiAgIEludGVyY2VwdE1hbmFnZXIoSW50ZXJjZXB0TWFuYWdlciYmIG1vdmUpID0gZGVsZXRlOwogCi0gIGJvb2wgR2V0SW50ZXJjZXB0KHBpZF90IHBpZCwgRGVidWdnZXJkRHVtcFR5cGUgZHVtcF90eXBlLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIG91dF9mZCk7CisgIGJvb2wgQ2FuUmVnaXN0ZXIoY29uc3QgSW50ZXJjZXB0UmVxdWVzdCYgcmVxdWVzdCwgSW50ZXJjZXB0UmVzcG9uc2UmIHJlc3BvbnNlKTsKKyAgSW50ZXJjZXB0KiBHZXQoY29uc3QgcGlkX3QgcGlkLCBjb25zdCBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wX3R5cGUpOworICB2b2lkIFJlZ2lzdGVyKEludGVyY2VwdCogaW50ZXJjZXB0KTsKKyAgdm9pZCBVbnJlZ2lzdGVyKEludGVyY2VwdCogaW50ZXJjZXB0KTsKKworICBib29sIEZpbmRJbnRlcmNlcHQocGlkX3QgcGlkLCBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wX3R5cGUsIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogb3V0X2ZkKTsKIH07CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvdG9tYnN0b25lZC90b21ic3RvbmVkLmNwcCBiL2RlYnVnZ2VyZC90b21ic3RvbmVkL3RvbWJzdG9uZWQuY3BwCmluZGV4IDUwNTU4ZjcuLmNmNzkwNGYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC90b21ic3RvbmVkL3RvbWJzdG9uZWQuY3BwCisrKyBiL2RlYnVnZ2VyZC90b21ic3RvbmVkL3RvbWJzdG9uZWQuY3BwCkBAIC0yODMsOSArMjgzLDcgQEAKIAogc3RhdGljIHZvaWQgcGVyZm9ybV9yZXF1ZXN0KHN0ZDo6dW5pcXVlX3B0cjxDcmFzaD4gY3Jhc2gpIHsKICAgdW5pcXVlX2ZkIG91dHB1dF9mZDsKLSAgYm9vbCBpbnRlcmNlcHRlZCA9Ci0gICAgICBpbnRlcmNlcHRfbWFuYWdlci0+R2V0SW50ZXJjZXB0KGNyYXNoLT5jcmFzaF9waWQsIGNyYXNoLT5jcmFzaF90eXBlLCAmb3V0cHV0X2ZkKTsKLSAgaWYgKGludGVyY2VwdGVkKSB7CisgIGlmIChpbnRlcmNlcHRfbWFuYWdlci0+RmluZEludGVyY2VwdChjcmFzaC0+Y3Jhc2hfcGlkLCBjcmFzaC0+Y3Jhc2hfdHlwZSwgJm91dHB1dF9mZCkpIHsKICAgICBpZiAoY3Jhc2gtPmNyYXNoX3R5cGUgPT0ga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvKSB7CiAgICAgICBjcmFzaC0+b3V0cHV0LnByb3RvID0gQ3Jhc2hBcnRpZmFjdDo6ZGV2bnVsbCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2Zhc3Rib290L0FuZHJvaWQuYnAgYi9mYXN0Ym9vdC9BbmRyb2lkLmJwCmluZGV4IDc3OTRjNGIuLmMwNDQ1ZjMgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L0FuZHJvaWQuYnAKKysrIGIvZmFzdGJvb3QvQW5kcm9pZC5icApAQCAtMTcwLDcgKzE3MCw3IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmZhc3Rib290QDEuMSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmZhc3Rib290LVYxLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjItbmRrIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLVYzLW5kayIsCiAgICAgICAgICJsaWJhc3luY2lvIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyX25kayIsCkBAIC0xOTYsNiArMTk2LDcgQEAKICAgICAgICAgImxpYmZhc3Rib290c2hpbSIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3ciLAogICAgICAgICAibGlibHo0IiwKKyAgICAgICAgImxpYnpzdGQiLAogICAgICAgICAibGlic25hcHNob3Rfbm9iaW5kZXIiLAogICAgICAgICAidXBkYXRlX21ldGFkYXRhLXByb3RvcyIsCiAgICAgICAgICJsaWJ1cmluZyIsCkBAIC00NDUsMyArNDQ2LDE0IEBACiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCiB9CisKK3B5dGhvbl90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJmYXN0Ym9vdF9pbnRlZ3JhdGlvbl90ZXN0IiwKKyAgICBtYWluOiAidGVzdF9mYXN0Ym9vdC5weSIsCisgICAgc3JjczogWyJ0ZXN0X2Zhc3Rib290LnB5Il0sCisgICAgZGF0YTogWyI6ZmFzdGJvb3QiXSwKKyAgICB0ZXN0X2NvbmZpZzogImZhc3Rib290X2ludGVncmF0aW9uX3Rlc3QueG1sIiwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgdW5pdF90ZXN0OiBmYWxzZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvUkVBRE1FLm1kIGIvZmFzdGJvb3QvUkVBRE1FLm1kCmluZGV4IDYzZGI1YzMuLjY5OTZkNGEgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L1JFQURNRS5tZAorKysgYi9mYXN0Ym9vdC9SRUFETUUubWQKQEAgLTI1LDcgKzI1LDcgQEAKICMjIFRyYW5zcG9ydCBhbmQgRnJhbWluZwogCiAxLiBIb3N0IHNlbmRzIGEgY29tbWFuZCwgd2hpY2ggaXMgYW4gYXNjaWkgc3RyaW5nIGluIGEgc2luZ2xlCi0gICBwYWNrZXQgbm8gZ3JlYXRlciB0aGFuIDY0IGJ5dGVzLgorICAgcGFja2V0IG5vIGdyZWF0ZXIgdGhhbiA0MDk2IGJ5dGVzLgogCiAyLiBDbGllbnQgcmVzcG9uc2Ugd2l0aCBhIHNpbmdsZSBwYWNrZXQgbm8gZ3JlYXRlciB0aGFuIDI1NiBieXRlcy4KICAgIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSByZXNwb25zZSBhcmUgIk9LQVkiLCAiRkFJTCIsICJEQVRBIiwKQEAgLTE2NSw2ICsxNjUsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIG5ldyBib290bG9hZGVyLgogCiAKKyMjIEZsYXNoaW5nIExvZ2ljCisKK0Zhc3Rib290IGJpbmFyeSB3aWxsIGZvbGxvdyBkaXJlY3Rpb25zIGxpc3RlZCBvdXQgZmFzdGJvb3QtaW5mby50eHQKK2J1aWxkIGFydGlmYWN0IGZvciBmYXN0Ym9vdCBmbGFzaGFsbCAmJiBmYXN0Ym9vdCB1cGRhdGUgY29tYW1uZHMuCitUaGlzIGJ1aWxkIGFydGlmYWN0IHdpbGwgbGl2ZSBpbnNpZGUgb2YgQU5EUk9JRF9QUk9EVUNUX09VVCAmJgordGFyZ2V0X2ZpbGVzX3BhY2thZ2UgJiYgdXBkYXRlcGFja2FnZS4KKworCitUaGUgY3VycmVudGx5IGRlZmluZWQgY29tbWFuZHMgYXJlOgorCisgICAgZmxhc2ggJXMgICAgICAgICAgIEZsYXNoIGEgZ2l2ZW4gcGFydGl0aW9uLiBPcHRpb25hbCBhcmd1bWVudHMgaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICAgICAtLXNsb3Qtb3RoZXIsIHtmaWxlbmFtZV9wYXRofSwgLS1hcHBseS12Ym1ldGEKKworICAgIHJlYm9vdCAlcyAgICAgICAgICBSZWJvb3QgdG8gZWl0aGVyIGJvb3Rsb2FkZXIgb3IgZmFzdGJvb3RkCisKKyAgICB1cGRhdGUtc3VwZXIgICAgICAgVXBkYXRlcyB0aGUgc3VwZXIgcGFydGl0aW9uCisKKyAgICBpZi13aXBlICAgICAgICAgICAgQ29uZGl0aW9uYWxseSBydW4gc29tZSBvdGhlciBmdW5jdGlvbmFsaXR5IGlmCisgICAgICAgICAgICAgICAgICAgICAgIHdpcGUgaXMgc3BlY2lmaWVkCisKKyAgICBlcmFzZSAlcyAgICAgICAgICAgRXJhc2UgYSBnaXZlbiBwYXJ0aXRpb24gKGNhbiBvbmx5IGJlIHVzZWQgaW4gY29uanVuY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgIHdpdGggaWYtd2lwZSAtPiBlZy4gaWYtd2lwZSBlcmFzZSBjYWNoZQorCitGbGFzaGluZyBPcHRpbWl6YXRpb246CisKKyAgICBBZnRlciBnZW5lcmF0aW5nIHRoZSBsaXN0IG9mIHRhc2tzIHRvIGV4ZWN1dGUsIEZhc3Rib290IHdpbGwgdHJ5IGFuZAorICAgIG9wdGltaXplIHRoZSBmbGFzaGluZyBvZiB0aGUgZHluYW1pYyBwYXJ0aXRpb25zIGJ5IGNvbnN0cnVjdGluZyBhbgorICAgIG9wdGltaXplZCBmbGFzaCBzdXBlciB0YXNrLiBGYXN0Ym9vdCB3aWxsIGV4cGxpY2l0bHkgcGF0dGVybiBtYXRjaCB0aGUKKyAgICBmb2xsb3dpbmcgY29tbWFuZHMgYW5kIHRyeSBhbmQgY29uY2F0ZW5hdGUgaXQgaW50byB0aGlzIHRhc2suIChkb2luZyBzbworICAgIHdpbGwgYWxsb3cgdXMgdG8gYXZvaWQgdGhlIHJlYm9vdCBpbnRvIHVzZXJzcGFjZSBmYXN0Ym9vdGQgd2hpY2ggdGFrZXMKKyAgICBzaWduaWZpY2FudCB0aW1lKQorCisgICAgLy9PcHRpbWl6YWJsZSBCbG9jaworICAgIHJlYm9vdCBmYXN0Ym9vdAorICAgIHVwZGF0ZS1zdXBlciAgICAgICAgICAgICAgICAgICAgICAgIC0tLT4gZ2VuZXJhdGUgb3B0aW1pemVkIGZsYXNoIHN1cGVyIHRhc2sKKyAgICAkRk9SIEVBQ0gge2R5bmFtaWMgcGFydGl0aW9ufQorICAgICAgICBmbGFzaCB7ZHluYW1pYyBwYXJ0aXRpb259CiAKICMjIENsaWVudCBWYXJpYWJsZXMKIApkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvY29uc3RhbnRzLmggYi9mYXN0Ym9vdC9jb25zdGFudHMuaAppbmRleCBhZDE2OWQxLi5hZjRkMWViIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9jb25zdGFudHMuaAorKysgYi9mYXN0Ym9vdC9jb25zdGFudHMuaApAQCAtNjksNiArNjksNyBAQAogI2RlZmluZSBGQl9WQVJfVkFSSUFOVCAidmFyaWFudCIKICNkZWZpbmUgRkJfVkFSX09GRl9NT0RFX0NIQVJHRV9TVEFURSAib2ZmLW1vZGUtY2hhcmdlIgogI2RlZmluZSBGQl9WQVJfQkFUVEVSWV9WT0xUQUdFICJiYXR0ZXJ5LXZvbHRhZ2UiCisjZGVmaW5lIEZCX1ZBUl9CQVRURVJZX1NPQyAiYmF0dGVyeS1zb2MiCiAjZGVmaW5lIEZCX1ZBUl9CQVRURVJZX1NPQ19PSyAiYmF0dGVyeS1zb2Mtb2siCiAjZGVmaW5lIEZCX1ZBUl9TVVBFUl9QQVJUSVRJT05fTkFNRSAic3VwZXItcGFydGl0aW9uLW5hbWUiCiAjZGVmaW5lIEZCX1ZBUl9TTkFQU0hPVF9VUERBVEVfU1RBVFVTICJzbmFwc2hvdC11cGRhdGUtc3RhdHVzIgpAQCAtODEsMyArODIsNSBAQAogI2RlZmluZSBGQl9WQVJfVFJFQkxFX0VOQUJMRUQgInRyZWJsZS1lbmFibGVkIgogI2RlZmluZSBGQl9WQVJfTUFYX0ZFVENIX1NJWkUgIm1heC1mZXRjaC1zaXplIgogI2RlZmluZSBGQl9WQVJfRE1FU0cgImRtZXNnIgorI2RlZmluZSBGQl9WQVJfQkFUVEVSWV9TRVJJQUxfTlVNQkVSICJiYXR0ZXJ5LXNlcmlhbC1udW1iZXIiCisjZGVmaW5lIEZCX1ZBUl9CQVRURVJZX1BBUlRfU1RBVFVTICJiYXR0ZXJ5LXBhcnQtc3RhdHVzIgpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZGV2aWNlL2NvbW1hbmRzLmNwcCBiL2Zhc3Rib290L2RldmljZS9jb21tYW5kcy5jcHAKaW5kZXggZTkyOWY0Mi4uZTUyMmY0ZCAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZGV2aWNlL2NvbW1hbmRzLmNwcAorKysgYi9mYXN0Ym9vdC9kZXZpY2UvY29tbWFuZHMuY3BwCkBAIC0xMzQsNiArMTM0LDcgQEAKICAgICAgICAge0ZCX1ZBUl9JU19GT1JDRV9ERUJVR0dBQkxFLCB7R2V0SXNGb3JjZURlYnVnZ2FibGUsIG51bGxwdHJ9fSwKICAgICAgICAge0ZCX1ZBUl9PRkZfTU9ERV9DSEFSR0VfU1RBVEUsIHtHZXRPZmZNb2RlQ2hhcmdlU3RhdGUsIG51bGxwdHJ9fSwKICAgICAgICAge0ZCX1ZBUl9CQVRURVJZX1ZPTFRBR0UsIHtHZXRCYXR0ZXJ5Vm9sdGFnZSwgbnVsbHB0cn19LAorICAgICAgICB7RkJfVkFSX0JBVFRFUllfU09DLCB7R2V0QmF0dGVyeVNvQywgbnVsbHB0cn19LAogICAgICAgICB7RkJfVkFSX0JBVFRFUllfU09DX09LLCB7R2V0QmF0dGVyeVNvQ09rLCBudWxscHRyfX0sCiAgICAgICAgIHtGQl9WQVJfSFdfUkVWSVNJT04sIHtHZXRIYXJkd2FyZVJldmlzaW9uLCBudWxscHRyfX0sCiAgICAgICAgIHtGQl9WQVJfU1VQRVJfUEFSVElUSU9OX05BTUUsIHtHZXRTdXBlclBhcnRpdGlvbk5hbWUsIG51bGxwdHJ9fSwKQEAgLTE0Niw2ICsxNDcsOCBAQAogICAgICAgICB7RkJfVkFSX1NFQ1VSSVRZX1BBVENIX0xFVkVMLCB7R2V0U2VjdXJpdHlQYXRjaExldmVsLCBudWxscHRyfX0sCiAgICAgICAgIHtGQl9WQVJfVFJFQkxFX0VOQUJMRUQsIHtHZXRUcmVibGVFbmFibGVkLCBudWxscHRyfX0sCiAgICAgICAgIHtGQl9WQVJfTUFYX0ZFVENIX1NJWkUsIHtHZXRNYXhGZXRjaFNpemUsIG51bGxwdHJ9fSwKKyAgICAgICAge0ZCX1ZBUl9CQVRURVJZX1NFUklBTF9OVU1CRVIsIHtHZXRCYXR0ZXJ5U2VyaWFsTnVtYmVyLCBudWxscHRyfX0sCisgICAgICAgIHtGQl9WQVJfQkFUVEVSWV9QQVJUX1NUQVRVUywge0dldEJhdHRlcnlQYXJ0U3RhdHVzLCBudWxscHRyfX0sCiB9OwogCiBzdGF0aWMgYm9vbCBHZXRWYXJBbGwoRmFzdGJvb3REZXZpY2UqIGRldmljZSkgewpAQCAtNjM5LDYgKzY0MiwxMiBAQAogICAgIHJldHVybiBVcGRhdGVTdXBlcihkZXZpY2UsIGFyZ3NbMV0sIHdpcGUpOwogfQogCitzdGF0aWMgYm9vbCBJc0xvY2tlZERzdSgpIHsKKyAgICBzdGQ6OnN0cmluZyBhY3RpdmVfZHN1OworICAgIGFuZHJvaWQ6OmdzaTo6R2V0QWN0aXZlRHN1KCZhY3RpdmVfZHN1KTsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoYWN0aXZlX2RzdSwgIi5sb2NrIik7Cit9CisKIGJvb2wgR3NpSGFuZGxlcihGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKICAgICBpZiAoYXJncy5zaXplKCkgIT0gMikgewogICAgICAgICByZXR1cm4gZGV2aWNlLT5Xcml0ZUZhaWwoIkludmFsaWQgYXJndW1lbnRzIik7CkBAIC02NTMsNiArNjYyLDExIEBACiAgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlU3RhdHVzKEZhc3Rib290UmVzdWx0OjpGQUlMLCAiTm8gR1NJIGlzIGluc3RhbGxlZCIpOwogICAgIH0KIAorICAgIGlmICgoYXJnc1sxXSA9PSAid2lwZSIgfHwgYXJnc1sxXSA9PSAiZGlzYWJsZSIpICYmIEdldERldmljZUxvY2tTdGF0dXMoKSAmJiBJc0xvY2tlZERzdSgpKSB7CisgICAgICAgIC8vIEJsb2NrIGNvbW1hbmRzIHRoYXQgbW9kaWZ5IHRoZSBzdGF0ZXMgb2YgbG9ja2VkIERTVQorICAgICAgICByZXR1cm4gZGV2aWNlLT5Xcml0ZUZhaWwoIkNvbW1hbmQgbm90IGF2YWlsYWJsZSBvbiBsb2NrZWQgRFNVL2RldmljZXMiKTsKKyAgICB9CisKICAgICBpZiAoYXJnc1sxXSA9PSAid2lwZSIpIHsKICAgICAgICAgaWYgKCFhbmRyb2lkOjpnc2k6OlVuaW5zdGFsbEdzaSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLT5Xcml0ZVN0YXR1cyhGYXN0Ym9vdFJlc3VsdDo6RkFJTCwgc3RyZXJyb3IoZXJybm8pKTsKQEAgLTY2MSw2ICs2NzUsMTcgQEAKICAgICAgICAgaWYgKCFhbmRyb2lkOjpnc2k6OkRpc2FibGVHc2koKSkgewogICAgICAgICAgICAgcmV0dXJuIGRldmljZS0+V3JpdGVTdGF0dXMoRmFzdGJvb3RSZXN1bHQ6OkZBSUwsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFyZ3NbMV0gPT0gInN0YXR1cyIpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYWN0aXZlX2RzdTsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpnc2k6OklzR3NpUnVubmluZygpKSB7CisgICAgICAgICAgICBkZXZpY2UtPldyaXRlSW5mbygiTm90IHJ1bm5pbmciKTsKKyAgICAgICAgfSBlbHNlIGlmICghYW5kcm9pZDo6Z3NpOjpHZXRBY3RpdmVEc3UoJmFjdGl2ZV9kc3UpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlLT5Xcml0ZUZhaWwoc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRldmljZS0+V3JpdGVJbmZvKCJSdW5uaW5nIGFjdGl2ZSBEU1U6ICIgKyBhY3RpdmVfZHN1KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbCgiSW52YWxpZCBhcmd1bWVudHMiKTsKICAgICB9CiAgICAgcmV0dXJuIGRldmljZS0+V3JpdGVTdGF0dXMoRmFzdGJvb3RSZXN1bHQ6Ok9LQVksICJTdWNjZXNzIik7CiB9CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9kZXZpY2UvZmFzdGJvb3RfZGV2aWNlLmNwcCBiL2Zhc3Rib290L2RldmljZS9mYXN0Ym9vdF9kZXZpY2UuY3BwCmluZGV4IDZiNmE5ODIuLjBkYzRlOTcgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2RldmljZS9mYXN0Ym9vdF9kZXZpY2UuY3BwCisrKyBiL2Zhc3Rib290L2RldmljZS9mYXN0Ym9vdF9kZXZpY2UuY3BwCkBAIC0xNTEsNyArMTUxLDggQEAKIH0KIAogQm9vdENvbnRyb2xDbGllbnQqIEZhc3Rib290RGV2aWNlOjpib290MV8xKCkgY29uc3QgewotICAgIGlmIChib290X2NvbnRyb2xfaGFsXy0+R2V0VmVyc2lvbigpID49IGFuZHJvaWQ6OmhhbDo6Qm9vdENvbnRyb2xWZXJzaW9uOjpCT09UQ1RMX1YxXzEpIHsKKyAgICBpZiAoYm9vdF9jb250cm9sX2hhbF8gJiYKKyAgICAgICAgYm9vdF9jb250cm9sX2hhbF8tPkdldFZlcnNpb24oKSA+PSBhbmRyb2lkOjpoYWw6OkJvb3RDb250cm9sVmVyc2lvbjo6Qk9PVENUTF9WMV8xKSB7CiAgICAgICAgIHJldHVybiBib290X2NvbnRyb2xfaGFsXy5nZXQoKTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9kZXZpY2UvdmFyaWFibGVzLmNwcCBiL2Zhc3Rib290L2RldmljZS92YXJpYWJsZXMuY3BwCmluZGV4IGQyYTc5NDcuLjc3MjEwYWIgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2RldmljZS92YXJpYWJsZXMuY3BwCisrKyBiL2Zhc3Rib290L2RldmljZS92YXJpYWJsZXMuY3BwCkBAIC0xMzAsNiArMTMwLDIxIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgR2V0QmF0dGVyeVNvQ0hlbHBlcihGYXN0Ym9vdERldmljZSogZGV2aWNlLCBpbnQzMl90KiBiYXR0ZXJ5X3NvYykgeworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OkhlYWx0aEluZm87CisKKyAgICBhdXRvIGhlYWx0aF9oYWwgPSBkZXZpY2UtPmhlYWx0aF9oYWwoKTsKKyAgICBpZiAoIWhlYWx0aF9oYWwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEhlYWx0aEluZm8gaGVhbHRoX2luZm87CisgICAgYXV0byByZXMgPSBoZWFsdGhfaGFsLT5nZXRIZWFsdGhJbmZvKCZoZWFsdGhfaW5mbyk7CisgICAgaWYgKCFyZXMuaXNPaygpKSByZXR1cm4gZmFsc2U7CisgICAgKmJhdHRlcnlfc29jID0gaGVhbHRoX2luZm8uYmF0dGVyeUxldmVsOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIEdldEJhdHRlcnlTb0NPayhGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIC8qIGFyZ3MgKi8sCiAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSkgewogICAgIGludDMyX3QgYmF0dGVyeV92b2x0YWdlID0gMDsKQEAgLTE4NSw2ICsyMDAsMTcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgR2V0QmF0dGVyeVNvQyhGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIC8qIGFyZ3MgKi8sCisgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UpIHsKKyAgICBpbnQzMl90IGJhdHRlcnlfc29jID0gMDsKKyAgICBpZiAoR2V0QmF0dGVyeVNvQ0hlbHBlcihkZXZpY2UsICZiYXR0ZXJ5X3NvYykpIHsKKyAgICAgICAgKm1lc3NhZ2UgPSBzdGQ6OnRvX3N0cmluZyhiYXR0ZXJ5X3NvYyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAqbWVzc2FnZSA9ICJVbmFibGUgdG8gZ2V0IGJhdHRlcnkgc29jIjsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGJvb2wgR2V0Q3VycmVudFNsb3QoRmFzdGJvb3REZXZpY2UqIGRldmljZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAvKiBhcmdzICovLAogICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSkgewogICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeCA9IGRldmljZS0+R2V0Q3VycmVudFNsb3QoKTsKQEAgLTU0NCwzICs1NzAsNzkgQEAKIAogICAgIHJldHVybiB0cnVlOwogfQorCitib29sIEdldEJhdHRlcnlTZXJpYWxOdW1iZXIoRmFzdGJvb3REZXZpY2UqIGRldmljZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSkgeworICAgIGF1dG8gaGVhbHRoX2hhbCA9IGRldmljZS0+aGVhbHRoX2hhbCgpOworICAgIGlmICghaGVhbHRoX2hhbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKEdldERldmljZUxvY2tTdGF0dXMoKSkgeworICAgICAgICByZXR1cm4gZGV2aWNlLT5Xcml0ZUZhaWwoIkRldmljZSBpcyBsb2NrZWQiKTsKKyAgICB9CisKKyAgICAqbWVzc2FnZSA9ICJ1bnN1cHBvcnRlZCI7CisKKyAgICBpbnQzMl90IHZlcnNpb24gPSAwOworICAgIGF1dG8gcmVzID0gaGVhbHRoX2hhbC0+Z2V0SW50ZXJmYWNlVmVyc2lvbigmdmVyc2lvbik7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbCgiVW5hYmxlIHRvIHF1ZXJ5IGJhdHRlcnkgZGF0YSIpOworICAgIH0KKyAgICBpZiAodmVyc2lvbiA+PSAzKSB7CisgICAgICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OkJhdHRlcnlIZWFsdGhEYXRhOworCisgICAgICAgIEJhdHRlcnlIZWFsdGhEYXRhIGRhdGE7CisgICAgICAgIGF1dG8gcmVzID0gaGVhbHRoX2hhbC0+Z2V0QmF0dGVyeUhlYWx0aERhdGEoJmRhdGEpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbCgiVW5hYmxlIHRvIHF1ZXJ5IGJhdHRlcnkgZGF0YSIpOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhLmJhdHRlcnlTZXJpYWxOdW1iZXIpIHsKKyAgICAgICAgICAgICptZXNzYWdlID0gKmRhdGEuYmF0dGVyeVNlcmlhbE51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHZXRCYXR0ZXJ5UGFydFN0YXR1cyhGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSkgeworICAgIGF1dG8gaGVhbHRoX2hhbCA9IGRldmljZS0+aGVhbHRoX2hhbCgpOworICAgIGlmICghaGVhbHRoX2hhbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6QmF0dGVyeVBhcnRTdGF0dXM7CisKKyAgICBCYXR0ZXJ5UGFydFN0YXR1cyBzdGF0dXMgPSBCYXR0ZXJ5UGFydFN0YXR1czo6VU5TVVBQT1JURUQ7CisKKyAgICBpbnQzMl90IHZlcnNpb24gPSAwOworICAgIGF1dG8gcmVzID0gaGVhbHRoX2hhbC0+Z2V0SW50ZXJmYWNlVmVyc2lvbigmdmVyc2lvbik7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbCgiVW5hYmxlIHRvIHF1ZXJ5IGJhdHRlcnkgZGF0YSIpOworICAgIH0KKyAgICBpZiAodmVyc2lvbiA+PSAzKSB7CisgICAgICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OkJhdHRlcnlIZWFsdGhEYXRhOworCisgICAgICAgIEJhdHRlcnlIZWFsdGhEYXRhIGRhdGE7CisgICAgICAgIGF1dG8gcmVzID0gaGVhbHRoX2hhbC0+Z2V0QmF0dGVyeUhlYWx0aERhdGEoJmRhdGEpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbCgiVW5hYmxlIHRvIHF1ZXJ5IGJhdHRlcnkgZGF0YSIpOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGRhdGEuYmF0dGVyeVBhcnRTdGF0dXM7CisgICAgfQorICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQmF0dGVyeVBhcnRTdGF0dXM6OlVOU1VQUE9SVEVEOgorICAgICAgICAgICAgKm1lc3NhZ2UgPSAidW5zdXBwb3J0ZWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmF0dGVyeVBhcnRTdGF0dXM6Ok9SSUdJTkFMOgorICAgICAgICAgICAgKm1lc3NhZ2UgPSAib3JpZ2luYWwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmF0dGVyeVBhcnRTdGF0dXM6OlJFUExBQ0VEOgorICAgICAgICAgICAgKm1lc3NhZ2UgPSAicmVwbGFjZWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqbWVzc2FnZSA9ICJ1bmtub3duIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2Zhc3Rib290L2RldmljZS92YXJpYWJsZXMuaCBiL2Zhc3Rib290L2RldmljZS92YXJpYWJsZXMuaAppbmRleCAzYjJkNDg0Li45OWQxMzU1IDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9kZXZpY2UvdmFyaWFibGVzLmgKKysrIGIvZmFzdGJvb3QvZGV2aWNlL3ZhcmlhYmxlcy5oCkBAIC02Myw4ICs2MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UpOwogYm9vbCBHZXRCYXR0ZXJ5Vm9sdGFnZShGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtZXNzYWdlKTsKK2Jvb2wgR2V0QmF0dGVyeVNvQyhGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UpOwogYm9vbCBHZXRCYXR0ZXJ5U29DT2soRmFzdGJvb3REZXZpY2UqIGRldmljZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLAogICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UpOworYm9vbCBHZXRCYXR0ZXJ5U2VyaWFsTnVtYmVyKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSk7Citib29sIEdldEJhdHRlcnlQYXJ0U3RhdHVzKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UpOwogYm9vbCBHZXRTdXBlclBhcnRpdGlvbk5hbWUoRmFzdGJvb3REZXZpY2UqIGRldmljZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UpOwogYm9vbCBHZXRTbmFwc2hvdFVwZGF0ZVN0YXR1cyhGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9mYXN0Ym9vdC5jcHAgYi9mYXN0Ym9vdC9mYXN0Ym9vdC5jcHAKaW5kZXggY2RjZDAzNi4uMTJhMWRkYyAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZmFzdGJvb3QuY3BwCisrKyBiL2Zhc3Rib290L2Zhc3Rib290LmNwcApAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAiZmFzdGJvb3QuaCIKIAotI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGdldG9wdC5oPgpAQCAtNDQsMTIgKzQzLDEwIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxyZWdleD4KLSNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0aHJlYWQ+CiAjaW5jbHVkZSA8dXRpbGl0eT4KQEAgLTc2LDkgKzczLDkgQEAKICNpbmNsdWRlICJjb25zdGFudHMuaCIKICNpbmNsdWRlICJkaWFnbm9zZV91c2IuaCIKICNpbmNsdWRlICJmYXN0Ym9vdF9kcml2ZXIuaCIKKyNpbmNsdWRlICJmYXN0Ym9vdF9kcml2ZXJfaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiZnMuaCIKICNpbmNsdWRlICJzdG9yYWdlLmgiCi0jaW5jbHVkZSAic3VwZXJfZmxhc2hfaGVscGVyLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgInRjcC5oIgogI2luY2x1ZGUgInRyYW5zcG9ydC5oIgpAQCAtOTIsOSArODksMTAgQEAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlNwbGl0OwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6VHJpbTsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OnN0cmluZ19saXRlcmFsczsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVyczsKIAorI2RlZmluZSBGQVNUQk9PVF9JTkZPX1ZFUlNJT04gMQorCiBzdGF0aWMgY29uc3QgY2hhciogc2VyaWFsID0gbnVsbHB0cjsKIAogc3RhdGljIGJvb2wgZ19sb25nX2xpc3RpbmcgPSBmYWxzZTsKQEAgLTEwMiw3ICsxMDAsNiBAQAogLy8gbGlic3BhcnNlIHdpbGwgc3VwcG9ydCBJTlRfTUFYLCBidXQgdGhpcyByZXN1bHRzIGluIGxhcmdlIGFsbG9jYXRpb25zLCBzbwogLy8gbGV0J3Mga2VlcCBpdCBhdCAxR0IgdG8gYXZvaWQgbWVtb3J5IHByZXNzdXJlIG9uIHRoZSBob3N0Lgogc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IFJFU1BBUlNFX0xJTUlUID0gMSAqIDEwMjQgKiAxMDI0ICogMTAyNDsKLXN0YXRpYyB1aW50NjRfdCBzcGFyc2VfbGltaXQgPSAwOwogc3RhdGljIGludDY0X3QgdGFyZ2V0X3NwYXJzZV9saW1pdCA9IC0xOwogCiBzdGF0aWMgdW5zaWduZWQgZ19iYXNlX2FkZHIgPSAweDEwMDAwMDAwOwpAQCAtMTE4LDYgKzExNSw5IEBACiBzdGF0aWMgc3RkOjp2ZWN0b3I8SW1hZ2U+IGltYWdlcyA9IHsKICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgIHsgImJvb3QiLCAgICAgImJvb3QuaW1nIiwgICAgICAgICAiYm9vdC5zaWciLCAgICAgImJvb3QiLCAgICAgZmFsc2UsIEltYWdlVHlwZTo6Qm9vdENyaXRpY2FsIH0sCisgICAgeyAiYm9vdGxvYWRlciIsCisgICAgICAgICAgICAgICAgICAiYm9vdGxvYWRlci5pbWciLCAgICIiLCAgICAgICAgICAgICAiYm9vdGxvYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgSW1hZ2VUeXBlOjpFeHRyYSB9LAogICAgIHsgImluaXRfYm9vdCIsCiAgICAgICAgICAgICAgICAgICAiaW5pdF9ib290LmltZyIsICAgICJpbml0X2Jvb3Quc2lnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0X2Jvb3QiLApAQCAtMTMwLDYgKzEzMCw3IEBACiAgICAgeyAib2RtX2Rsa20iLCAib2RtX2Rsa20uaW1nIiwgICAgICJvZG1fZGxrbS5zaWciLCAib2RtX2Rsa20iLCB0cnVlLCAgSW1hZ2VUeXBlOjpOb3JtYWwgfSwKICAgICB7ICJwcm9kdWN0IiwgICJwcm9kdWN0LmltZyIsICAgICAgInByb2R1Y3Quc2lnIiwgICJwcm9kdWN0IiwgIHRydWUsICBJbWFnZVR5cGU6Ok5vcm1hbCB9LAogICAgIHsgInB2bWZ3IiwgICAgInB2bWZ3LmltZyIsICAgICAgICAicHZtZncuc2lnIiwgICAgInB2bWZ3IiwgICAgdHJ1ZSwgIEltYWdlVHlwZTo6Qm9vdENyaXRpY2FsIH0sCisgICAgeyAicmFkaW8iLCAgICAicmFkaW8uaW1nIiwgICAgICAgICIiLCAgICAgICAgICAgICAicmFkaW8iLCAgICB0cnVlLCAgSW1hZ2VUeXBlOjpFeHRyYSB9LAogICAgIHsgInJlY292ZXJ5IiwgInJlY292ZXJ5LmltZyIsICAgICAicmVjb3Zlcnkuc2lnIiwgInJlY292ZXJ5IiwgdHJ1ZSwgIEltYWdlVHlwZTo6Qm9vdENyaXRpY2FsIH0sCiAgICAgeyAic3VwZXIiLCAgICAic3VwZXIuaW1nIiwgICAgICAgICJzdXBlci5zaWciLCAgICAic3VwZXIiLCAgICB0cnVlLCAgSW1hZ2VUeXBlOjpFeHRyYSB9LAogICAgIHsgInN5c3RlbSIsICAgInN5c3RlbS5pbWciLCAgICAgICAic3lzdGVtLnNpZyIsICAgInN5c3RlbSIsICAgZmFsc2UsIEltYWdlVHlwZTo6Tm9ybWFsIH0sCkBAIC0xNzIsNyArMTczLDcgQEAKICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiB9OwogCi1zdGF0aWMgY2hhciogZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSB7CitjaGFyKiBnZXRfYW5kcm9pZF9wcm9kdWN0X291dCgpIHsKICAgICBjaGFyKiBkaXIgPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKICAgICBpZiAoZGlyID09IG51bGxwdHIgfHwgZGlyWzBdID09ICdcMCcpIHsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0zNDQsMjMgKzM0NSwyMSBAQAogLy8KIC8vIFRoZSByZXR1cm5lZCBUcmFuc3BvcnQgaXMgYSBzaW5nbGV0b24sIHNvIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHNhbWUKIC8vIG9iamVjdCwgYW5kIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSB0aGUgcmV0dXJuZWQgVHJhbnNwb3J0Lgotc3RhdGljIFRyYW5zcG9ydCogb3Blbl9kZXZpY2UoY29uc3QgY2hhciogbG9jYWxfc2VyaWFsLCBib29sIHdhaXRfZm9yX2RldmljZSA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFubm91bmNlID0gdHJ1ZSkgeworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IG9wZW5fZGV2aWNlKGNvbnN0IGNoYXIqIGxvY2FsX3NlcmlhbCwgYm9vbCB3YWl0X2Zvcl9kZXZpY2UgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYW5ub3VuY2UgPSB0cnVlKSB7CiAgICAgY29uc3QgUmVzdWx0PE5ldHdvcmtTZXJpYWwsIEZhc3Rib290RXJyb3I+IG5ldHdvcmtfc2VyaWFsID0gUGFyc2VOZXR3b3JrU2VyaWFsKGxvY2FsX3NlcmlhbCk7CiAKLSAgICBUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IG51bGxwdHI7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gdHJhbnNwb3J0OwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIGlmIChuZXR3b3JrX3NlcmlhbC5vaygpKSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKICAgICAgICAgICAgIGlmIChuZXR3b3JrX3NlcmlhbC0+cHJvdG9jb2wgPT0gU29ja2V0OjpQcm90b2NvbDo6a1RjcCkgewotICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHRjcDo6Q29ubmVjdChuZXR3b3JrX3NlcmlhbC0+YWRkcmVzcywgbmV0d29ya19zZXJpYWwtPnBvcnQsICZlcnJvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gdGNwOjpDb25uZWN0KG5ldHdvcmtfc2VyaWFsLT5hZGRyZXNzLCBuZXR3b3JrX3NlcmlhbC0+cG9ydCwgJmVycm9yKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV0d29ya19zZXJpYWwtPnByb3RvY29sID09IFNvY2tldDo6UHJvdG9jb2w6OmtVZHApIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSB1ZHA6OkNvbm5lY3QobmV0d29ya19zZXJpYWwtPmFkZHJlc3MsIG5ldHdvcmtfc2VyaWFsLT5wb3J0LCAmZXJyb3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHVkcDo6Q29ubmVjdChuZXR3b3JrX3NlcmlhbC0+YWRkcmVzcywgbmV0d29ya19zZXJpYWwtPnBvcnQsICZlcnJvcik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbHB0ciAmJiBhbm5vdW5jZSkgeworICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQgJiYgYW5ub3VuY2UpIHsKICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJlcnJvcjogIiA8PCBlcnJvcjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChuZXR3b3JrX3NlcmlhbC5lcnJvcigpLmNvZGUoKSA9PQpAQCAtMzcyLDEyICszNzEsMTIgQEAKICAgICAgICAgICAgIEV4cGVjdChuZXR3b3JrX3NlcmlhbCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHRyYW5zcG9ydCkgewogICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghd2FpdF9mb3JfZGV2aWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYW5ub3VuY2UpIHsKQEAgLTM4OCwxMyArMzg3LDEzIEBACiAgICAgfQogfQogCi1zdGF0aWMgVHJhbnNwb3J0KiBOZXR3b3JrRGV2aWNlQ29ubmVjdGVkKGJvb2wgcHJpbnQgPSBmYWxzZSkgewotICAgIFRyYW5zcG9ydCogdHJhbnNwb3J0ID0gbnVsbHB0cjsKLSAgICBUcmFuc3BvcnQqIHJlc3VsdCA9IG51bGxwdHI7CitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gTmV0d29ya0RldmljZUNvbm5lY3RlZChib29sIHByaW50ID0gZmFsc2UpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gcmVzdWx0OwogCiAgICAgQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2Ugc3RvcmFnZTsKICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gZGV2aWNlczsKLSAgICB7CisgICAgaWYgKHN0b3JhZ2UuRXhpc3RzKCkpIHsKICAgICAgICAgRmlsZUxvY2sgbG9jayA9IHN0b3JhZ2UuTG9jaygpOwogICAgICAgICBkZXZpY2VzID0gc3RvcmFnZS5SZWFkRGV2aWNlcyhsb2NrKTsKICAgICB9CkBAIC00MDMsMTEgKzQwMiwxMSBAQAogICAgICAgICB0cmFuc3BvcnQgPSBvcGVuX2RldmljZShkZXZpY2UuY19zdHIoKSwgZmFsc2UsIGZhbHNlKTsKIAogICAgICAgICBpZiAocHJpbnQpIHsKLSAgICAgICAgICAgIFByaW50RGV2aWNlKGRldmljZS5jX3N0cigpLCB0cmFuc3BvcnQgPT0gbnVsbHB0ciA/ICJvZmZsaW5lIiA6ICJmYXN0Ym9vdCIpOworICAgICAgICAgICAgUHJpbnREZXZpY2UoZGV2aWNlLmNfc3RyKCksIHRyYW5zcG9ydCA/ICJmYXN0Ym9vdCIgOiAib2ZmbGluZSIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0cmFuc3BvcnQ7CisgICAgICAgIGlmICh0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN0ZDo6bW92ZSh0cmFuc3BvcnQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MjUsMjEgKzQyNCwyMSBAQAogLy8KIC8vIFRoZSByZXR1cm5lZCBUcmFuc3BvcnQgaXMgYSBzaW5nbGV0b24sIHNvIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHNhbWUKIC8vIG9iamVjdCwgYW5kIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGRlbGV0ZSB0aGUgcmV0dXJuZWQgVHJhbnNwb3J0Lgotc3RhdGljIFRyYW5zcG9ydCogb3Blbl9kZXZpY2UoKSB7CitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gb3Blbl9kZXZpY2UoKSB7CiAgICAgaWYgKHNlcmlhbCAhPSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBvcGVuX2RldmljZShzZXJpYWwpOwogICAgIH0KIAogICAgIGJvb2wgYW5ub3VuY2UgPSB0cnVlOwotICAgIFRyYW5zcG9ydCogdHJhbnNwb3J0ID0gbnVsbHB0cjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiB0cmFuc3BvcnQ7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgdHJhbnNwb3J0ID0gdXNiX29wZW4obWF0Y2hfZmFzdGJvb3QobnVsbHB0cikpOwotICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHRyYW5zcG9ydCkgewogICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKICAgICAgICAgfQogCiAgICAgICAgIHRyYW5zcG9ydCA9IE5ldHdvcmtEZXZpY2VDb25uZWN0ZWQoKTsKLSAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmICh0cmFuc3BvcnQpIHsKICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CiAgICAgICAgIH0KIApAQCAtNDQ5LDYgKzQ0OCw4IEBACiAgICAgICAgIH0KICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKICAgICB9CisKKyAgICByZXR1cm4gdHJhbnNwb3J0OwogfQogCiBzdGF0aWMgaW50IENvbm5lY3QoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewpAQCAtNDYwLDggKzQ2MSw3IEBACiAgICAgY29uc3QgY2hhciogbG9jYWxfc2VyaWFsID0gKmFyZ3Y7CiAgICAgRXhwZWN0KFBhcnNlTmV0d29ya1NlcmlhbChsb2NhbF9zZXJpYWwpKTsKIAotICAgIGNvbnN0IFRyYW5zcG9ydCogdHJhbnNwb3J0ID0gb3Blbl9kZXZpY2UobG9jYWxfc2VyaWFsLCBmYWxzZSk7Ci0gICAgaWYgKHRyYW5zcG9ydCA9PSBudWxscHRyKSB7CisgICAgaWYgKCFvcGVuX2RldmljZShsb2NhbF9zZXJpYWwsIGZhbHNlKSkgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKQEAgLTUyNSw2ICs1MjUsNyBAQAogICAgIHVzYl9vcGVuKGxpc3RfZGV2aWNlc19jYWxsYmFjayk7CiAgICAgTmV0d29ya0RldmljZUNvbm5lY3RlZCgvKiBwcmludCAqLyB0cnVlKTsKIH0KKwogdm9pZCBzeW50YXhfZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgImZhc3Rib290OiB1c2FnZTogIik7CiAKQEAgLTU3MCw3ICs1NzEsOCBAQAogICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgYSBmbGFzaCBwYXJ0aXRpb24uXG4iCiAgICAgICAgICAgICAiIHNldF9hY3RpdmUgU0xPVCAgICAgICAgICAgIFNldCB0aGUgYWN0aXZlIHNsb3QuXG4iCiAgICAgICAgICAgICAiIG9lbSBbQ09NTUFORC4uLl0gICAgICAgICAgIEV4ZWN1dGUgT0VNLXNwZWNpZmljIGNvbW1hbmQuXG4iCi0gICAgICAgICAgICAiIGdzaSB3aXBlfGRpc2FibGUgICAgICAgICAgIFdpcGUgb3IgZGlzYWJsZSBhIEdTSSBpbnN0YWxsYXRpb24gKGZhc3Rib290ZCBvbmx5KS5cbiIKKyAgICAgICAgICAgICIgZ3NpIHdpcGV8ZGlzYWJsZXxzdGF0dXMgICAgV2lwZSwgZGlzYWJsZSBvciBzaG93IHN0YXR1cyBvZiBhIEdTSSBpbnN0YWxsYXRpb25cbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZhc3Rib290ZCBvbmx5KS5cbiIKICAgICAgICAgICAgICIgd2lwZS1zdXBlciBbU1VQRVJfRU1QVFldICAgV2lwZSB0aGUgc3VwZXIgcGFydGl0aW9uLiBUaGlzIHdpbGwgcmVzZXQgaXQgdG9cbiIKICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbiBhbiBlbXB0eSBzZXQgb2YgZGVmYXVsdCBkeW5hbWljIHBhcnRpdGlvbnMuXG4iCiAgICAgICAgICAgICAiIGNyZWF0ZS1sb2dpY2FsLXBhcnRpdGlvbiBOQU1FIFNJWkVcbiIKQEAgLTYyOCw2ICs2MzAsOSBAQAogICAgICAgICAgICAgIiAtLXNraXAtcmVib290ICAgICAgICAgICAgICBEb24ndCByZWJvb3QgZGV2aWNlIGFmdGVyIGZsYXNoaW5nLlxuIgogICAgICAgICAgICAgIiAtLWRpc2FibGUtdmVyaXR5ICAgICAgICAgICBTZXRzIGRpc2FibGUtdmVyaXR5IHdoZW4gZmxhc2hpbmcgdmJtZXRhLlxuIgogICAgICAgICAgICAgIiAtLWRpc2FibGUtdmVyaWZpY2F0aW9uICAgICBTZXRzIGRpc2FibGUtdmVyaWZpY2F0aW9uIHdoZW4gZmxhc2hpbmcgdmJtZXRhLlxuIgorICAgICAgICAgICAgIiAtLWRpc2FibGUtc3VwZXItb3B0aW1pemF0aW9uXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIG9wdGltaXphdGlvbnMgb24gZmxhc2hpbmcgc3VwZXIgcGFydGl0aW9uLlxuIgorICAgICAgICAgICAgIiAtLWRpc2FibGUtZmFzdGJvb3QtaW5mbyAgICBXaWxsIGNvbGxlY3RzIHRhc2tzIGZyb20gaW1hZ2UgbGlzdCByYXRoZXIgdGhhbiAkT1VUL2Zhc3Rib290LWluZm8udHh0LlxuIgogICAgICAgICAgICAgIiAtLWZzLW9wdGlvbnM9T1BUSU9OWyxPUFRJT05dXG4iCiAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSBmaWxlc3lzdGVtIGZlYXR1cmVzLiBPUFRJT04gc3VwcG9ydHMgY2FzZWZvbGQsIHByb2ppZCwgY29tcHJlc3NcbiIKICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSAtLXVuYnVmZmVyZWQ/CkBAIC03NzMsNyArNzc4LDcgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyB1bmlxdWVfZmQgdW56aXBfdG9fZmlsZShaaXBBcmNoaXZlSGFuZGxlIHppcCwgY29uc3QgY2hhciogZW50cnlfbmFtZSkgeworc3RhdGljIHVuaXF1ZV9mZCBVbnppcFRvRmlsZShaaXBBcmNoaXZlSGFuZGxlIHppcCwgY29uc3QgY2hhciogZW50cnlfbmFtZSkgewogICAgIHVuaXF1ZV9mZCBmZChtYWtlX3RlbXBvcmFyeV9mZChlbnRyeV9uYW1lKSk7CiAKICAgICBaaXBFbnRyeTY0IHppcF9lbnRyeTsKQEAgLTk5NSw3ICsxMDAwLDcgQEAKICAgICByZXR1cm4gcmVzcGFyc2VfZmlsZShzLmdldCgpLCBtYXhfc2l6ZSk7CiB9CiAKLXN0YXRpYyB1aW50NjRfdCBnZXRfdWludF92YXIoY29uc3QgY2hhciogdmFyX25hbWUpIHsKK3N0YXRpYyB1aW50NjRfdCBnZXRfdWludF92YXIoY29uc3QgY2hhciogdmFyX25hbWUsIGZhc3Rib290OjpJRmFzdEJvb3REcml2ZXIqIGZiKSB7CiAgICAgc3RkOjpzdHJpbmcgdmFsdWVfc3RyOwogICAgIGlmIChmYi0+R2V0VmFyKHZhcl9uYW1lLCAmdmFsdWVfc3RyKSAhPSBmYXN0Ym9vdDo6U1VDQ0VTUyB8fCB2YWx1ZV9zdHIuZW1wdHkoKSkgewogICAgICAgICB2ZXJib3NlKCJ0YXJnZXQgZGlkbid0IHJlcG9ydCAlcyIsIHZhcl9uYW1lKTsKQEAgLTEwMTQsMTMgKzEwMTksMTMgQEAKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKLWludDY0X3QgZ2V0X3NwYXJzZV9saW1pdChpbnQ2NF90IHNpemUpIHsKLSAgICBpbnQ2NF90IGxpbWl0ID0gc3BhcnNlX2xpbWl0OworaW50NjRfdCBnZXRfc3BhcnNlX2xpbWl0KGludDY0X3Qgc2l6ZSwgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgeworICAgIGludDY0X3QgbGltaXQgPSBpbnQ2NF90KGZwLT5zcGFyc2VfbGltaXQpOwogICAgIGlmIChsaW1pdCA9PSAwKSB7CiAgICAgICAgIC8vIFVubGltaXRlZCwgc28gc2VlIHdoYXQgdGhlIHRhcmdldCBkZXZpY2UncyBsaW1pdCBpcy4KICAgICAgICAgLy8gVE9ETzogc2hvdWxkbid0IHdlIGFwcGx5IHRoaXMgbGltaXQgZXZlbiBpZiB5b3UndmUgdXNlZCAtUz8KICAgICAgICAgaWYgKHRhcmdldF9zcGFyc2VfbGltaXQgPT0gLTEpIHsKLSAgICAgICAgICAgIHRhcmdldF9zcGFyc2VfbGltaXQgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihnZXRfdWludF92YXIoIm1heC1kb3dubG9hZC1zaXplIikpOworICAgICAgICAgICAgdGFyZ2V0X3NwYXJzZV9saW1pdCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGdldF91aW50X3ZhcigibWF4LWRvd25sb2FkLXNpemUiLCBmcC0+ZmIpKTsKICAgICAgICAgfQogICAgICAgICBpZiAodGFyZ2V0X3NwYXJzZV9saW1pdCA+IDApIHsKICAgICAgICAgICAgIGxpbWl0ID0gdGFyZ2V0X3NwYXJzZV9saW1pdDsKQEAgLTEwMzYsNyArMTA0MSw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBib29sIGxvYWRfYnVmX2ZkKHVuaXF1ZV9mZCBmZCwgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmKSB7CitzdGF0aWMgYm9vbCBsb2FkX2J1Zl9mZCh1bmlxdWVfZmQgZmQsIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIqIGJ1ZiwgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgewogICAgIGludDY0X3Qgc3ogPSBnZXRfZmlsZV9zaXplKGZkKTsKICAgICBpZiAoc3ogPT0gLTEpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA0OSwxMiArMTA1NCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHNwYXJzZV9maWxlX2Rlc3Ryb3kocyk7CisgICAgICAgIGJ1Zi0+ZmlsZV90eXBlID0gRkJfQlVGRkVSX1NQQVJTRTsKICAgICB9IGVsc2UgewogICAgICAgICBidWYtPmltYWdlX3NpemUgPSBzejsKKyAgICAgICAgYnVmLT5maWxlX3R5cGUgPSBGQl9CVUZGRVJfRkQ7CiAgICAgfQogCiAgICAgbHNlZWsoZmQuZ2V0KCksIDAsIFNFRUtfU0VUKTsKLSAgICBpbnQ2NF90IGxpbWl0ID0gZ2V0X3NwYXJzZV9saW1pdChzeik7CisgICAgaW50NjRfdCBsaW1pdCA9IGdldF9zcGFyc2VfbGltaXQoc3osIGZwKTsKICAgICBidWYtPmZkID0gc3RkOjptb3ZlKGZkKTsKICAgICBpZiAobGltaXQpIHsKICAgICAgICAgYnVmLT5maWxlcyA9IGxvYWRfc3BhcnNlX2ZpbGVzKGJ1Zi0+ZmQuZ2V0KCksIGxpbWl0KTsKQEAgLTEwNzAsMTMgKzEwNzcsMTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGJvb2wgbG9hZF9idWYoY29uc3QgY2hhciogZm5hbWUsIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIqIGJ1Zikgeworc3RhdGljIGJvb2wgbG9hZF9idWYoY29uc3QgY2hhciogZm5hbWUsIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIqIGJ1ZiwgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgewogICAgIHVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihmbmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSkpKTsKIAogICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICBhdXRvIHBhdGggPSBmaW5kX2l0ZW1fZ2l2ZW5fbmFtZShmbmFtZSk7Ci0gICAgICAgIGZkID0gdW5pcXVlX2ZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHBhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0JJTkFSWSkpKTsKLSAgICAgICAgaWYgKGZkID09IC0xKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBzdHJ1Y3Qgc3RhdCBzOwpAQCAtMTA4OCw3ICsxMDkzLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBsb2FkX2J1Zl9mZChzdGQ6Om1vdmUoZmQpLCBidWYpOworICAgIHJldHVybiBsb2FkX2J1Zl9mZChzdGQ6Om1vdmUoZmQpLCBidWYsIGZwKTsKIH0KIAogc3RhdGljIHZvaWQgcmV3cml0ZV92Ym1ldGFfYnVmZmVyKHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIqIGJ1ZiwgYm9vbCB2Ym1ldGFfaW5fYm9vdCkgewpAQCAtMTE4MywxMSArMTE4OCwyMSBAQAogICAgIHJldHVybiBwYXJ0aXRpb25fc2l6ZTsKIH0KIAotc3RhdGljIHZvaWQgY29weV9hdmJfZm9vdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIqIGJ1Zikgeworc3RhdGljIHZvaWQgY29weV9hdmJfZm9vdGVyKGNvbnN0IEltYWdlU291cmNlKiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmKSB7CiAgICAgaWYgKGJ1Zi0+c3ogPCBBVkJfRk9PVEVSX1NJWkUgfHwgaXNfbG9naWNhbChwYXJ0aXRpb24pIHx8Ci0gICAgICAgIHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UocGFydGl0aW9uKSkgeworICAgICAgICBzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKHNvdXJjZSwgcGFydGl0aW9uKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgLy8gSWYgdGhlIGltYWdlIGlzIHNwYXJzZSwgbW92aW5nIHRoZSBmb290ZXIgd2lsbCBzaW1wbHkgY29ycnVwdCB0aGUgc3BhcnNlCisgICAgLy8gZm9ybWF0LCBzbyBjdXJyZW50bHkgd2UgZG9uJ3Qgc3VwcG9ydCBtb3ZpbmcgdGhlIGZvb3RlciBvbiBzcGFyc2UgZmlsZXMuCisgICAgaWYgKGJ1Zi0+ZmlsZV90eXBlID09IEZCX0JVRkZFUl9TUEFSU0UpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiV2FybmluZzogc2tpcCBjb3B5aW5nICIgPDwgcGFydGl0aW9uIDw8ICIgaW1hZ2UgYXZiIGZvb3RlciBkdWUgdG8gc3BhcnNlICIKKyAgICAgICAgICAgICAgICAgICA8PCAiaW1hZ2UuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIC8vIElmIG92ZXJmbG93cyBhbmQgbmVnYXRpdmUsIGl0IHNob3VsZCBiZSA8IGJ1Zi0+c3ouCiAgICAgaW50NjRfdCBwYXJ0aXRpb25fc2l6ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGdldF9wYXJ0aXRpb25fc2l6ZShwYXJ0aXRpb24pKTsKIApAQCAtMTI0Miw5ICsxMjU3LDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGZsYXNoX2J1Zihjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uLCBzdHJ1Y3QgZmFzdGJvb3RfYnVmZmVyKiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBhcHBseV92Ym1ldGEpIHsKLSAgICBjb3B5X2F2Yl9mb290ZXIocGFydGl0aW9uLCBidWYpOworc3RhdGljIHZvaWQgZmxhc2hfYnVmKGNvbnN0IEltYWdlU291cmNlKiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmLCBjb25zdCBib29sIGFwcGx5X3ZibWV0YSkgeworICAgIGNvcHlfYXZiX2Zvb3Rlcihzb3VyY2UsIHBhcnRpdGlvbiwgYnVmKTsKIAogICAgIC8vIFJld3JpdGUgdmJtZXRhIGlmIHRoYXQncyB3aGF0IHdlJ3JlIGZsYXNoaW5nIGFuZCBtb2RpZmljYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLgogICAgIGlmIChnX2Rpc2FibGVfdmVyaXR5IHx8IGdfZGlzYWJsZV92ZXJpZmljYXRpb24pIHsKQEAgLTEyNzgsNyArMTI5Myw3IEBACiAgICAgcmV0dXJuIGN1cnJlbnRfc2xvdDsKIH0KIAotc3RhdGljIGludCBnZXRfc2xvdF9jb3VudCgpIHsKK3N0YXRpYyBpbnQgZ2V0X3Nsb3RfY291bnQoZmFzdGJvb3Q6OklGYXN0Qm9vdERyaXZlciogZmIpIHsKICAgICBzdGQ6OnN0cmluZyB2YXI7CiAgICAgaW50IGNvdW50ID0gMDsKICAgICBpZiAoZmItPkdldFZhcigic2xvdC1jb3VudCIsICZ2YXIpICE9IGZhc3Rib290OjpTVUNDRVNTIHx8CkBAIC0xMjg4LDggKzEzMDMsOCBAQAogICAgIHJldHVybiBjb3VudDsKIH0KIAotYm9vbCBzdXBwb3J0c19BQigpIHsKLSAgICByZXR1cm4gZ2V0X3Nsb3RfY291bnQoKSA+PSAyOworYm9vbCBzdXBwb3J0c19BQihmYXN0Ym9vdDo6SUZhc3RCb290RHJpdmVyKiBmYikgeworICAgIHJldHVybiBnZXRfc2xvdF9jb3VudChmYikgPj0gMjsKIH0KIAogLy8gR2l2ZW4gYSBjdXJyZW50IHNsb3QsIHRoaXMgcmV0dXJucyB3aGF0IHRoZSAnb3RoZXInIHNsb3QgaXMuCkBAIC0xMzAxLDcgKzEzMTYsNyBAQAogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X290aGVyX3Nsb3QoY29uc3Qgc3RkOjpzdHJpbmcmIGN1cnJlbnRfc2xvdCkgewotICAgIHJldHVybiBnZXRfb3RoZXJfc2xvdChjdXJyZW50X3Nsb3QsIGdldF9zbG90X2NvdW50KCkpOworICAgIHJldHVybiBnZXRfb3RoZXJfc2xvdChjdXJyZW50X3Nsb3QsIGdldF9zbG90X2NvdW50KGZiKSk7CiB9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfb3RoZXJfc2xvdChpbnQgY291bnQpIHsKQEAgLTEzMDksNyArMTMyNCw3IEBACiB9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfb3RoZXJfc2xvdCgpIHsKLSAgICByZXR1cm4gZ2V0X290aGVyX3Nsb3QoZ2V0X2N1cnJlbnRfc2xvdCgpLCBnZXRfc2xvdF9jb3VudCgpKTsKKyAgICByZXR1cm4gZ2V0X290aGVyX3Nsb3QoZ2V0X2N1cnJlbnRfc2xvdCgpLCBnZXRfc2xvdF9jb3VudChmYikpOwogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgdmVyaWZ5X3Nsb3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3RfbmFtZSwgYm9vbCBhbGxvd19hbGwpIHsKQEAgLTEzMTgsNyArMTMzMyw3IEBACiAgICAgICAgIGlmIChhbGxvd19hbGwpIHsKICAgICAgICAgICAgIHJldHVybiAiYWxsIjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IGdldF9zbG90X2NvdW50KCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBnZXRfc2xvdF9jb3VudChmYik7CiAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuICJhIjsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMzI3LDcgKzEzNDIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50IGNvdW50ID0gZ2V0X3Nsb3RfY291bnQoKTsKKyAgICBpbnQgY291bnQgPSBnZXRfc2xvdF9jb3VudChmYik7CiAgICAgaWYgKGNvdW50ID09IDApIGRpZSgiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgc2xvdHMiKTsKIAogICAgIGlmIChzbG90ID09ICJvdGhlciIpIHsKQEAgLTE0MDAsNyArMTQxNSw3IEBACiAgICAgICAgICAgICAgICAgc2xvdC5jX3N0cigpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaGFzX3Nsb3QgPT0gInllcyIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0X3Nsb3RfY291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldF9zbG90X2NvdW50KGZiKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZG9fZm9yX3BhcnRpdGlvbihwYXJ0LCBzdGQ6OnN0cmluZygxLCAoY2hhcikoaSArICdhJykpLCBmdW5jLCBmb3JjZV9zbG90KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTE0MTEsMTggKzE0MjYsMTEgQEAKICAgICB9CiB9CiAKLWJvb2wgaXNfcmV0cm9maXRfZGV2aWNlKCkgewotICAgIHN0ZDo6c3RyaW5nIHZhbHVlOwotICAgIGlmIChmYi0+R2V0VmFyKCJzdXBlci1wYXJ0aXRpb24tbmFtZSIsICZ2YWx1ZSkgIT0gZmFzdGJvb3Q6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aCh2YWx1ZSwgInN5c3RlbV8iKTsKLX0KLQogLy8gRmV0Y2ggYSBwYXJ0aXRpb24gZnJvbSB0aGUgZGV2aWNlIHRvIGEgZ2l2ZW4gZmQuIFRoaXMgaXMgYSB3cmFwcGVyIG92ZXIgRmV0Y2hUb0ZkIHRvIGZldGNoCiAvLyB0aGUgZnVsbCBpbWFnZS4KLXN0YXRpYyB1aW50NjRfdCBmZXRjaF9wYXJ0aXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgYm9ycm93ZWRfZmQgZmQpIHsKLSAgICB1aW50NjRfdCBmZXRjaF9zaXplID0gZ2V0X3VpbnRfdmFyKEZCX1ZBUl9NQVhfRkVUQ0hfU0laRSk7CitzdGF0aWMgdWludDY0X3QgZmV0Y2hfcGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sIGJvcnJvd2VkX2ZkIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0Ym9vdDo6SUZhc3RCb290RHJpdmVyKiBmYikgeworICAgIHVpbnQ2NF90IGZldGNoX3NpemUgPSBnZXRfdWludF92YXIoRkJfVkFSX01BWF9GRVRDSF9TSVpFLCBmYik7CiAgICAgaWYgKGZldGNoX3NpemUgPT0gMCkgewogICAgICAgICBkaWUoIlVuYWJsZSB0byBnZXQgJXMuIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IGZldGNoIGNvbW1hbmQuIiwgRkJfVkFSX01BWF9GRVRDSF9TSVpFKTsKICAgICB9CkBAIC0xNDQ0LDE3ICsxNDUyLDE4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGRvX2ZldGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90X292ZXJyaWRlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dGZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRmaWxlLCBmYXN0Ym9vdDo6SUZhc3RCb290RHJpdmVyKiBmYikgewogICAgIHVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkoCiAgICAgICAgICAgICBvcGVuKG91dGZpbGUuY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQyB8IE9fQklOQVJZLCAwNjQ0KSkpOwotICAgIGF1dG8gZmV0Y2ggPSBzdGQ6OmJpbmQoZmV0Y2hfcGFydGl0aW9uLCBfMSwgYm9ycm93ZWRfZmQoZmQpKTsKKyAgICBhdXRvIGZldGNoID0gc3RkOjpiaW5kKGZldGNoX3BhcnRpdGlvbiwgXzEsIGJvcnJvd2VkX2ZkKGZkKSwgZmIpOwogICAgIGRvX2Zvcl9wYXJ0aXRpb25zKHBhcnRpdGlvbiwgc2xvdF9vdmVycmlkZSwgZmV0Y2gsIGZhbHNlIC8qIGZvcmNlIHNsb3QgKi8pOwogfQogCiAvLyBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgbm90IGZsYXNoaW5nIGEgdmVuZG9yIGJvb3QgaW1hZ2UuIElmIGZsYXNoaW5nIGEgdmVuZG9yIGJvb3QgaW1hZ2UsCiAvLyByZXBhY2sgdmVuZG9yX2Jvb3QgaW1hZ2Ugd2l0aCBhbiB1cGRhdGVkIHJhbWRpc2suIEFmdGVyIGV4ZWN1dGlvbiwgYnVmIGlzIHNldAogLy8gdG8gdGhlIG5ldyBpbWFnZSB0byBmbGFzaCwgYW5kIHJldHVybiB2YWx1ZSBpcyB0aGUgcmVhbCBwYXJ0aXRpb24gbmFtZSB0byBmbGFzaC4KLXN0YXRpYyBzdGQ6OnN0cmluZyByZXBhY2tfcmFtZGlzayhjb25zdCBjaGFyKiBwbmFtZSwgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmKSB7CitzdGF0aWMgc3RkOjpzdHJpbmcgcmVwYWNrX3JhbWRpc2soY29uc3QgY2hhciogcG5hbWUsIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0Ym9vdDo6SUZhc3RCb290RHJpdmVyKiBmYikgewogICAgIHN0ZDo6c3RyaW5nX3ZpZXcgcG5hbWVfc3Z7cG5hbWV9OwogCiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHBuYW1lX3N2LCAidmVuZG9yX2Jvb3Q6IikgJiYKQEAgLTE0NzIsNyArMTQ4MSw3IEBACiAgICAgc3RkOjpzdHJpbmcgcmFtZGlzayhwbmFtZV9zdi5zdWJzdHIocG5hbWVfc3YuZmluZCgnOicpICsgMSkpOwogCiAgICAgdW5pcXVlX2ZkIHZlbmRvcl9ib290KG1ha2VfdGVtcG9yYXJ5X2ZkKCJ2ZW5kb3IgYm9vdCByZXBhY2siKSk7Ci0gICAgdWludDY0X3QgdmVuZG9yX2Jvb3Rfc2l6ZSA9IGZldGNoX3BhcnRpdGlvbihwYXJ0aXRpb24sIHZlbmRvcl9ib290KTsKKyAgICB1aW50NjRfdCB2ZW5kb3JfYm9vdF9zaXplID0gZmV0Y2hfcGFydGl0aW9uKHBhcnRpdGlvbiwgdmVuZG9yX2Jvb3QsIGZiKTsKICAgICBhdXRvIHJlcGFja19yZXMgPSByZXBsYWNlX3ZlbmRvcl9yYW1kaXNrKHZlbmRvcl9ib290LCB2ZW5kb3JfYm9vdF9zaXplLCByYW1kaXNrLCBidWYtPmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJ1Zi0+c3opKTsKICAgICBpZiAoIXJlcGFja19yZXMub2soKSkgewpAQCAtMTQ4NSwyNCArMTQ5NCw0MSBAQAogICAgIHJldHVybiBwYXJ0aXRpb247CiB9CiAKLXZvaWQgZG9fZmxhc2goY29uc3QgY2hhciogcG5hbWUsIGNvbnN0IGNoYXIqIGZuYW1lLCBjb25zdCBib29sIGFwcGx5X3ZibWV0YSkgewordm9pZCBkb19mbGFzaChjb25zdCBjaGFyKiBwbmFtZSwgY29uc3QgY2hhciogZm5hbWUsIGNvbnN0IGJvb2wgYXBwbHlfdmJtZXRhLAorICAgICAgICAgICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKSB7CisgICAgaWYgKCFmcCkgeworICAgICAgICBkaWUoImRvIGZsYXNoIHdhcyBjYWxsZWQgd2l0aG91dCBhIHZhbGlkIGZsYXNoaW5nIHBsYW4iKTsKKyAgICB9CiAgICAgdmVyYm9zZSgiRG8gZmxhc2ggJXMgJXMiLCBwbmFtZSwgZm5hbWUpOwogICAgIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIgYnVmOwogCi0gICAgaWYgKCFsb2FkX2J1ZihmbmFtZSwgJmJ1ZikpIHsKKyAgICBpZiAoZnAtPnNvdXJjZSkgeworICAgICAgICB1bmlxdWVfZmQgZmQgPSBmcC0+c291cmNlLT5PcGVuRmlsZShmbmFtZSk7CisgICAgICAgIGlmIChmZCA8IDAgfHwgIWxvYWRfYnVmX2ZkKHN0ZDo6bW92ZShmZCksICZidWYsIGZwKSkgeworICAgICAgICAgICAgZGllKCJjb3VsZCBub3QgbG9hZCAnJXMnOiAlcyIsIGZuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHNpZ25hdHVyZV9kYXRhOworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX3N0cmluZyhmbmFtZSk7CisgICAgICAgIGlmIChmcC0+c291cmNlLT5SZWFkRmlsZShmaWxlX3N0cmluZy5zdWJzdHIoMCwgZmlsZV9zdHJpbmcuZmluZCgnLicpKSArICIuc2lnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmVfZGF0YSkpIHsKKyAgICAgICAgICAgIGZiLT5Eb3dubG9hZCgic2lnbmF0dXJlIiwgc2lnbmF0dXJlX2RhdGEpOworICAgICAgICAgICAgZmItPlJhd0NvbW1hbmQoInNpZ25hdHVyZSIsICJpbnN0YWxsaW5nIHNpZ25hdHVyZSIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghbG9hZF9idWYoZm5hbWUsICZidWYsIGZwKSkgewogICAgICAgICBkaWUoImNhbm5vdCBsb2FkICclcyc6ICVzIiwgZm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgfQorCiAgICAgaWYgKGlzX2xvZ2ljYWwocG5hbWUpKSB7CiAgICAgICAgIGZiLT5SZXNpemVQYXJ0aXRpb24ocG5hbWUsIHN0ZDo6dG9fc3RyaW5nKGJ1Zi5pbWFnZV9zaXplKSk7CiAgICAgfQotICAgIHN0ZDo6c3RyaW5nIGZsYXNoX3BuYW1lID0gcmVwYWNrX3JhbWRpc2socG5hbWUsICZidWYpOwotICAgIGZsYXNoX2J1ZihmbGFzaF9wbmFtZSwgJmJ1ZiwgYXBwbHlfdmJtZXRhKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFzaF9wbmFtZSA9IHJlcGFja19yYW1kaXNrKHBuYW1lLCAmYnVmLCBmcC0+ZmIpOworICAgIGZsYXNoX2J1ZihmcC0+c291cmNlLmdldCgpLCBmbGFzaF9wbmFtZSwgJmJ1ZiwgYXBwbHlfdmJtZXRhKTsKIH0KIAogLy8gU2V0cyBzbG90X292ZXJyaWRlIGFzIHRoZSBhY3RpdmUgc2xvdC4gSWYgc2xvdF9vdmVycmlkZSBpcyBibGFuaywKIC8vIHNldCBjdXJyZW50IHNsb3QgYXMgYWN0aXZlIGluc3RlYWQuIFRoaXMgY2xlYXJzIHNsb3QtdW5ib290YWJsZS4KIHN0YXRpYyB2b2lkIHNldF9hY3RpdmUoY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3Rfb3ZlcnJpZGUpIHsKLSAgICBpZiAoIXN1cHBvcnRzX0FCKCkpIHJldHVybjsKKyAgICBpZiAoIXN1cHBvcnRzX0FCKGZiKSkgcmV0dXJuOwogCiAgICAgaWYgKHNsb3Rfb3ZlcnJpZGUgIT0gIiIpIHsKICAgICAgICAgZmItPlNldEFjdGl2ZShzbG90X292ZXJyaWRlKTsKQEAgLTE1MjEsOSArMTU0Nyw3IEBACiAKIHZvaWQgcmVib290X3RvX3VzZXJzcGFjZV9mYXN0Ym9vdCgpIHsKICAgICBmYi0+UmVib290VG8oImZhc3Rib290Iik7Ci0KLSAgICBhdXRvKiBvbGRfdHJhbnNwb3J0ID0gZmItPnNldF90cmFuc3BvcnQobnVsbHB0cik7Ci0gICAgZGVsZXRlIG9sZF90cmFuc3BvcnQ7CisgICAgZmItPnNldF90cmFuc3BvcnQobnVsbHB0cik7CiAKICAgICAvLyBHaXZlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gdGltZSB0byBjbG9zZS4KICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwpAQCAtMTU5MCw3ICsxNjE0LDcgQEAKICAgICBpZiAoaW1nX25hbWUuZW1wdHkoKSkgewogICAgICAgICBpbWdfbmFtZSA9IHBhcnRpdGlvbiArICIuaW1nIjsKICAgICB9Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rmxhc2hUYXNrPihzbG90LCBwYXJ0aXRpb24sIGltZ19uYW1lLCBhcHBseV92Ym1ldGEpOworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZsYXNoVGFzaz4oc2xvdCwgcGFydGl0aW9uLCBpbWdfbmFtZSwgYXBwbHlfdmJtZXRhLCBmcCk7CiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxSZWJvb3RUYXNrPiBQYXJzZVJlYm9vdENvbW1hbmQoY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwKQEAgLTE2MzcsMTQgKzE2NjEsMjIgQEAKICAgICByZXR1cm4gdGFzazsKIH0KIAotdm9pZCBBZGRSZXNpemVUYXNrcyhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+KiB0YXNrcykgeworYm9vbCBBZGRSZXNpemVUYXNrcyhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+KiB0YXNrcykgewogICAgIC8vIGV4cGFuZHMgInJlc2l6ZS1wYXJ0aXRpb25zIiBpbnRvIGluZGl2aWR1YWwgY29tbWFuZHMgOiByZXNpemUge29zX3BhcnRpdGlvbl8xfSwgcmVzaXplCiAgICAgLy8ge29zX3BhcnRpdGlvbl8yfSwgZXRjLgogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gcmVzaXplX3Rhc2tzOwogICAgIHN0ZDo6b3B0aW9uYWw8c2l6ZV90PiBsb2M7CisgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gY29udGVudHM7CisgICAgaWYgKCFmcC0+c291cmNlLT5SZWFkRmlsZSgic3VwZXJfZW1wdHkuaW1nIiwgJmNvbnRlbnRzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gbWV0YWRhdGEgPSBhbmRyb2lkOjpmc19tZ3I6OlJlYWRGcm9tSW1hZ2VCbG9iKGNvbnRlbnRzLmRhdGEoKSwgY29udGVudHMuc2l6ZSgpKTsKKyAgICBpZiAoIW1ldGFkYXRhKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXNrcy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKGF1dG8gZmxhc2hfdGFzayA9IHRhc2tzLT5hdChpKS0+QXNGbGFzaFRhc2soKSkgewotICAgICAgICAgICAgaWYgKHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UoZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpKSkgeworICAgICAgICAgICAgaWYgKEZsYXNoVGFzazo6SXNEeW5hbWljUGFydGl0aW9uKGZwLT5zb3VyY2UuZ2V0KCksIGZsYXNoX3Rhc2spKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFsb2MpIHsKICAgICAgICAgICAgICAgICAgICAgbG9jID0gaTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNjU2LDM1ICsxNjg4LDIyIEBACiAgICAgLy8gaWYgbm8gbG9naWNhbCBwYXJ0aXRpb25zIChhbHRob3VnaCBzaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIHN5c3RlbSB3aWxsIGFsd2F5cyBuZWVkIHRvIGJlCiAgICAgLy8gZmxhc2hlZCkKICAgICBpZiAoIWxvYykgewotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgdGFza3MtPmluc2VydCh0YXNrcy0+YmVnaW4oKSArIGxvYy52YWx1ZSgpLCBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihyZXNpemVfdGFza3MuYmVnaW4oKSksCiAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihyZXNpemVfdGFza3MuZW5kKCkpKTsKLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBib29sIElzTnVtYmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7Ci0gICAgYm9vbCBwZXJpb2QgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotICAgICAgICBpZiAoIWlzZGlnaXQoc1tpXSkpIHsKLSAgICAgICAgICAgIGlmICghcGVyaW9kICYmIHNbaV0gPT0gJy4nICYmIGkgIT0gMCAmJiBpICE9IHMubGVuZ3RoKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgcGVyaW9kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgYm9vbCBJc0lnbm9yZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmQpIHsKLSAgICBpZiAoY29tbWFuZFswXVswXSA9PSAnIycpIHsKKyAgICBpZiAoY29tbWFuZC5zaXplKCkgPT0gMCB8fCBjb21tYW5kWzBdWzBdID09ICcjJykgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIENoZWNrRmFzdGJvb3RJbmZvUmVxdWlyZW1lbnRzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29tbWFuZCkgeworYm9vbCBDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhvc3RfdG9vbF92ZXJzaW9uKSB7CiAgICAgaWYgKGNvbW1hbmQuc2l6ZSgpICE9IDIpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAidW5rbm93biBjaGFyYWN0ZXJzIGluIHZlcnNpb24gaW5mbyBpbiBmYXN0Ym9vdC1pbmZvLnR4dCAtPiAiCiAgICAgICAgICAgICAgICAgICAgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihjb21tYW5kLCAiICIpOwpAQCAtMTY5NiwxOCArMTcxNSwyMCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFJc051bWJlcihjb21tYW5kWzFdKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJ2ZXJzaW9uIG51bWJlciBjb250YWlucyBub24tbnVtZXJpYyB2YWx1ZXMgaW4gZmFzdGJvb3QtaW5mby50eHQgLT4gIgorICAgIHVpbnQzMl90IGZhc3Rib290X2luZm9fdmVyc2lvbjsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlVWludChjb21tYW5kWzFdLCAmZmFzdGJvb3RfaW5mb192ZXJzaW9uKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJ2ZXJzaW9uIG51bWJlciBjb250YWlucyBub24tbnVtZXJpYyBjaGFyYWN0ZXJzIGluIGZhc3Rib290LWluZm8udHh0IC0+ICIKICAgICAgICAgICAgICAgICAgICA8PCBhbmRyb2lkOjpiYXNlOjpKb2luKGNvbW1hbmQsICIgIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBMT0coVkVSQk9TRSkgPDwgIkNoZWNraW5nICdmYXN0Ym9vdC1pbmZvLnR4dCB2ZXJzaW9uJyI7Ci0gICAgaWYgKGNvbW1hbmRbMV0gPCBQTEFURk9STV9UT09MU19WRVJTSU9OKSB7CisgICAgaWYgKGZhc3Rib290X2luZm9fdmVyc2lvbiA8PSBob3N0X3Rvb2xfdmVyc2lvbikgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKICAgICBMT0coRVJST1IpIDw8ICJmYXNib290LWluZm8udHh0IHZlcnNpb246ICIgPDwgY29tbWFuZFsxXQotICAgICAgICAgICAgICAgPDwgIiBub3QgY29tcGF0aWJsZSB3aXRoIGhvc3QgdG9vbCB2ZXJzaW9uIC0tPiAiIDw8IFBMQVRGT1JNX1RPT0xTX1ZFUlNJT047CisgICAgICAgICAgICAgICA8PCAiIG5vdCBjb21wYXRpYmxlIHdpdGggaG9zdCB0b29sIHZlcnNpb24gLS0+ICIgPDwgaG9zdF90b29sX3ZlcnNpb247CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xNzIxLDcgKzE3NDIsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvbW1hbmQuc2l6ZSgpID4gMSAmJiBjb21tYW5kWzBdID09ICJ2ZXJzaW9uIikgewotICAgICAgICAgICAgaWYgKCFDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhjb21tYW5kKSkgeworICAgICAgICAgICAgaWYgKCFDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhjb21tYW5kLCBGQVNUQk9PVF9JTkZPX1ZFUlNJT04pKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CkBAIC0xNzMzLDQ0ICsxNzU0LDIyIEBACiAgICAgICAgIH0KICAgICAgICAgYXV0byB0YXNrID0gUGFyc2VGYXN0Ym9vdEluZm9MaW5lKGZwLCBjb21tYW5kKTsKICAgICAgICAgaWYgKCF0YXNrKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciB3aGVuIHBhcnNpbmcgZmFzdGJvb3QtaW5mby50eHQsIGZhbGxpbmcgYmFjayBvbiBIYXJkY29kZWQgbGlzdDogIgotICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZXh0OwogICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICB9CiAgICAgICAgIHRhc2tzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUodGFzaykpOwogICAgIH0KLSAgICBpZiAoYXV0byBmbGFzaF9zdXBlcl90YXNrID0gRmxhc2hTdXBlckxheW91dFRhc2s6OkluaXRpYWxpemVGcm9tVGFza3MoZnAsIHRhc2tzKSkgewotICAgICAgICBhdXRvIGl0ID0gdGFza3MuYmVnaW4oKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGF1dG8gZmxhc2hfdGFzayA9IHRhc2tzW2ldLT5Bc0ZsYXNoVGFzaygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UoZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXV0byB3aXBlX3Rhc2sgPSB0YXNrc1tpXS0+QXNXaXBlVGFzaygpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdCsrOwotICAgICAgICB9Ci0gICAgICAgIHRhc2tzLmluc2VydChpdCwgc3RkOjptb3ZlKGZsYXNoX3N1cGVyX3Rhc2spKTsKKworICAgIGlmIChhdXRvIGZsYXNoX3N1cGVyX3Rhc2sgPSBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazo6SW5pdGlhbGl6ZShmcCwgdGFza3MpKSB7CisgICAgICAgIHRhc2tzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZmxhc2hfc3VwZXJfdGFzaykpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFkZFJlc2l6ZVRhc2tzKGZwLCAmdGFza3MpOworICAgICAgICBpZiAoIUFkZFJlc2l6ZVRhc2tzKGZwLCAmdGFza3MpKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBhZGQgcmVzaXplIHRhc2tzIjsKKyAgICAgICAgfQogICAgIH0KKwogICAgIHJldHVybiB0YXNrczsKIH0KIAotc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiBQYXJzZUZhc3Rib290SW5mbyhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBzdGQ6Omlmc3RyZWFtJiBmcykgewotICAgIGlmICghZnMgfHwgZnMuZW9mKCkpIHJldHVybiB7fTsKLQotICAgIHN0ZDo6c3RyaW5nIHRleHQ7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGU7Ci0gICAgLy8gR2V0IG9zX3BhcnRpdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJlc2l6ZWQKLSAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGZzLCB0ZXh0KSkgewotICAgICAgICBmaWxlLmVtcGxhY2VfYmFjayh0ZXh0KTsKLSAgICB9Ci0gICAgcmV0dXJuIFBhcnNlRmFzdGJvb3RJbmZvKGZwLCBmaWxlKTsKLX0KLQogRmxhc2hBbGxUb29sOjpGbGFzaEFsbFRvb2woRmxhc2hpbmdQbGFuKiBmcCkgOiBmcF8oZnApIHt9CiAKIHZvaWQgRmxhc2hBbGxUb29sOjpGbGFzaCgpIHsKQEAgLTE3ODYsMjcgKzE3ODUsMzkgQEAKICAgICB9CiAKICAgICBEZXRlcm1pbmVTbG90KCk7Ci0gICAgQ29sbGVjdEltYWdlcygpOwogCiAgICAgQ2FuY2VsU25hcHNob3RJZk5lZWRlZCgpOwogCi0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGZpbmRfaXRlbV9naXZlbl9uYW1lKCJmYXN0Ym9vdC1pbmZvLnR4dCIpOwotICAgIHN0ZDo6aWZzdHJlYW0gc3RyZWFtKHBhdGgpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gdGFza3MgPSBQYXJzZUZhc3Rib290SW5mbyhmcF8sIHN0cmVhbSk7Ci0gICAgaWYgKHRhc2tzLmVtcHR5KCkpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGbGFzaGluZyBmcm9tIGhhcmRjb2RlZCBpbWFnZXMuIGZhc3Rib290LWluZm8udHh0IGlzIGVtcHR5IG9yIGRvZXMgbm90ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJleGlzdCI7Ci0gICAgICAgIEhhcmRjb2RlZEZsYXNoKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJGbGFzaGluZyBmcm9tIGZhc3Rib290LWluZm8udHh0IjsKLSAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykgeworICAgIHRhc2tzXyA9IENvbGxlY3RUYXNrcygpOworCisgICAgZm9yIChhdXRvJiB0YXNrIDogdGFza3NfKSB7CiAgICAgICAgIHRhc2stPlJ1bigpOwogICAgIH0KLSAgICBpZiAoZnBfLT53YW50c193aXBlKSB7Ci0gICAgICAgIC8vIGF2b2lkIGFkZGluZyBkdXBsaWNhdGUgd2lwZSB0YXNrcyBpbiBmYXN0Ym9vdCBtYWluIGNvZGUuCi0gICAgICAgIGZwXy0+d2FudHNfd2lwZSA9IGZhbHNlOworICAgIHJldHVybjsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiBGbGFzaEFsbFRvb2w6OkNvbGxlY3RUYXNrcygpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzOworICAgIGlmIChmcF8tPnNob3VsZF91c2VfZmFzdGJvb3RfaW5mbykgeworICAgICAgICB0YXNrcyA9IENvbGxlY3RUYXNrc0Zyb21GYXN0Ym9vdEluZm8oKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHRhc2tzID0gQ29sbGVjdFRhc2tzRnJvbUltYWdlTGlzdCgpOwogICAgIH0KKyAgICBpZiAoZnBfLT5leGNsdWRlX2R5bmFtaWNfcGFydGl0aW9ucykgeworICAgICAgICBhdXRvIGlzX25vbl9zdGF0aWNfZmxhc2hfdGFzayA9IFsmXShjb25zdCBhdXRvJiB0YXNrKSAtPiBib29sIHsKKyAgICAgICAgICAgIGlmIChhdXRvIGZsYXNoX3Rhc2sgPSB0YXNrLT5Bc0ZsYXNoVGFzaygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKGZwXy0+c291cmNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFzaF90YXNrLT5HZXRQYXJ0aXRpb25BbmRTbG90KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfTsKKyAgICAgICAgdGFza3MuZXJhc2Uoc3RkOjpyZW1vdmVfaWYodGFza3MuYmVnaW4oKSwgdGFza3MuZW5kKCksIGlzX25vbl9zdGF0aWNfZmxhc2hfdGFzayksCisgICAgICAgICAgICAgICAgICAgIHRhc2tzLmVuZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHRhc2tzOwogfQogCiB2b2lkIEZsYXNoQWxsVG9vbDo6Q2hlY2tSZXF1aXJlbWVudHMoKSB7CkBAIC0xODMzLDcgKzE4NDQsNyBAQAogICAgICAgICBmcF8tPnNlY29uZGFyeV9zbG90ID0gZ2V0X290aGVyX3Nsb3QoKTsKICAgICB9CiAgICAgaWYgKGZwXy0+c2Vjb25kYXJ5X3Nsb3QgPT0gIiIpIHsKLSAgICAgICAgaWYgKHN1cHBvcnRzX0FCKCkpIHsKKyAgICAgICAgaWYgKHN1cHBvcnRzX0FCKGZiKSkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBDb3VsZCBub3QgZGV0ZXJtaW5lIHNsb3QgZm9yIHNlY29uZGFyeSBpbWFnZXMuIElnbm9yaW5nLlxuIik7CiAgICAgICAgIH0KICAgICAgICAgZnBfLT5za2lwX3NlY29uZGFyeSA9IHRydWU7CkBAIC0xODU3LDg5ICsxODY4LDY1IEBACiAgICAgfQogfQogCi12b2lkIEZsYXNoQWxsVG9vbDo6SGFyZGNvZGVkRmxhc2goKSB7CitzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IEZsYXNoQWxsVG9vbDo6Q29sbGVjdFRhc2tzRnJvbUltYWdlTGlzdCgpIHsKICAgICBDb2xsZWN0SW1hZ2VzKCk7CiAgICAgLy8gRmlyc3QgZmxhc2ggYm9vdCBwYXJ0aXRpb25zLiBXZSBhbGxvdyB0aGlzIHRvIGhhcHBlbiBlaXRoZXIgaW4gdXNlcnNwYWNlCiAgICAgLy8gb3IgaW4gYm9vdGxvYWRlciBmYXN0Ym9vdC4KLSAgICBGbGFzaEltYWdlcyhib290X2ltYWdlc18pOwotCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiB0YXNrczsKKyAgICBBZGRGbGFzaFRhc2tzKGJvb3RfaW1hZ2VzXywgdGFza3MpOwogCi0gICAgaWYgKGF1dG8gZmxhc2hfc3VwZXJfdGFzayA9IEZsYXNoU3VwZXJMYXlvdXRUYXNrOjpJbml0aWFsaXplKGZwXywgb3NfaW1hZ2VzXykpIHsKKyAgICAvLyBTeW5jIHRoZSBzdXBlciBwYXJ0aXRpb24uIFRoaXMgd2lsbCByZWJvb3QgdG8gdXNlcnNwYWNlIGZhc3Rib290IGlmIG5lZWRlZC4KKyAgICB0YXNrcy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxVcGRhdGVTdXBlclRhc2s+KGZwXykpOworCisgICAgQWRkRmxhc2hUYXNrcyhvc19pbWFnZXNfLCB0YXNrcyk7CisKKyAgICBpZiAoYXV0byBmbGFzaF9zdXBlcl90YXNrID0gT3B0aW1pemVkRmxhc2hTdXBlclRhc2s6OkluaXRpYWxpemUoZnBfLCB0YXNrcykpIHsKICAgICAgICAgdGFza3MuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShmbGFzaF9zdXBlcl90YXNrKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gU3luYyB0aGUgc3VwZXIgcGFydGl0aW9uLiBUaGlzIHdpbGwgcmVib290IHRvIHVzZXJzcGFjZSBmYXN0Ym9vdCBpZiBuZWVkZWQuCi0gICAgICAgIHRhc2tzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFVwZGF0ZVN1cGVyVGFzaz4oZnBfKSk7CiAgICAgICAgIC8vIFJlc2l6ZSBhbnkgbG9naWNhbCBwYXJ0aXRpb24gdG8gMCwgc28gZWFjaCBwYXJ0aXRpb24gaXMgcmVzZXQgdG8gMAogICAgICAgICAvLyBleHRlbnRzLCBhbmQgd2lsbCBhY2hpZXZlIG1vcmUgb3B0aW1hbCBhbGxvY2F0aW9uLgotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIFtpbWFnZSwgc2xvdF0gOiBvc19pbWFnZXNfKSB7Ci0gICAgICAgICAgICAvLyBSZXRyb2ZpdCBkZXZpY2VzIGhhdmUgdHdvIHN1cGVyIHBhcnRpdGlvbnMsIG5hbWVkIHN1cGVyX2EgYW5kIHN1cGVyX2IuCi0gICAgICAgICAgICAvLyBPbiB0aGVzZSBkZXZpY2VzLCBzZWNvbmRhcnkgc2xvdHMgbXVzdCBiZSBmbGFzaGVkIGFzIHBoeXNpY2FsCi0gICAgICAgICAgICAvLyBwYXJ0aXRpb25zIChvdGhlcndpc2UgdGhleSB3b3VsZCBub3QgbW91bnQgb24gZmlyc3QgYm9vdCkuIFRvIGVuZm9yY2UKLSAgICAgICAgICAgIC8vIHRoaXMsIHdlIGRlbGV0ZSBhbnkgbG9naWNhbCBwYXJ0aXRpb25zIGZvciB0aGUgIm90aGVyIiBzbG90LgotICAgICAgICAgICAgaWYgKGlzX3JldHJvZml0X2RldmljZSgpKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uX25hbWUgPSBpbWFnZS0+cGFydF9uYW1lICsgIl8icyArIHNsb3Q7Ci0gICAgICAgICAgICAgICAgaWYgKGltYWdlLT5Jc1NlY29uZGFyeSgpICYmIHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwXy0+ZmItPkRlbGV0ZVBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhc2tzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPERlbGV0ZVRhc2s+KGZwXywgcGFydGl0aW9uX25hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhc2tzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFJlc2l6ZVRhc2s+KGZwXywgaW1hZ2UtPnBhcnRfbmFtZSwgIjAiLCBzbG90KSk7CisgICAgICAgIGlmICghQWRkUmVzaXplVGFza3MoZnBfLCAmdGFza3MpKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBhZGQgcmVzaXplIHRhc2tzIjsKICAgICAgICAgfQogICAgIH0KLSAgICBmb3IgKGF1dG8mIGkgOiB0YXNrcykgewotICAgICAgICBpLT5SdW4oKTsKLSAgICB9Ci0gICAgRmxhc2hJbWFnZXMob3NfaW1hZ2VzXyk7CisKKyAgICByZXR1cm4gdGFza3M7CiB9CiAKLXZvaWQgRmxhc2hBbGxUb29sOjpGbGFzaEltYWdlcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgSW1hZ2UqLCBzdGQ6OnN0cmluZz4+JiBpbWFnZXMpIHsKK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gRmxhc2hBbGxUb29sOjpDb2xsZWN0VGFza3NGcm9tRmFzdGJvb3RJbmZvKCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gdGFza3M7CisgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gY29udGVudHM7CisgICAgaWYgKCFmcF8tPnNvdXJjZS0+UmVhZEZpbGUoImZhc3Rib290LWluZm8udHh0IiwgJmNvbnRlbnRzKSkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkZsYXNoaW5nIGZyb20gaGFyZGNvZGVkIGltYWdlcy4gZmFzdGJvb3QtaW5mby50eHQgaXMgZW1wdHkgb3IgZG9lcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0IjsKKyAgICAgICAgcmV0dXJuIENvbGxlY3RUYXNrc0Zyb21JbWFnZUxpc3QoKTsKKyAgICB9CisgICAgdGFza3MgPSBQYXJzZUZhc3Rib290SW5mbyhmcF8sIFNwbGl0KHtjb250ZW50cy5kYXRhKCksIGNvbnRlbnRzLnNpemUoKX0sICJcbiIpKTsKKyAgICByZXR1cm4gdGFza3M7Cit9CisKK3ZvaWQgRmxhc2hBbGxUb29sOjpBZGRGbGFzaFRhc2tzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBJbWFnZSosIHN0ZDo6c3RyaW5nPj4mIGltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKSB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBbaW1hZ2UsIHNsb3RdIDogaW1hZ2VzKSB7CiAgICAgICAgIGZhc3Rib290X2J1ZmZlciBidWY7CiAgICAgICAgIHVuaXF1ZV9mZCBmZCA9IGZwXy0+c291cmNlLT5PcGVuRmlsZShpbWFnZS0+aW1nX25hbWUpOwotICAgICAgICBpZiAoZmQgPCAwIHx8ICFsb2FkX2J1Zl9mZChzdGQ6Om1vdmUoZmQpLCAmYnVmKSkgeworICAgICAgICBpZiAoZmQgPCAwIHx8ICFsb2FkX2J1Zl9mZChzdGQ6Om1vdmUoZmQpLCAmYnVmLCBmcF8pKSB7CiAgICAgICAgICAgICBpZiAoaW1hZ2UtPm9wdGlvbmFsX2lmX25vX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkaWUoImNvdWxkIG5vdCBsb2FkICclcyc6ICVzIiwgaW1hZ2UtPmltZ19uYW1lLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIH0KLSAgICAgICAgRmxhc2hJbWFnZSgqaW1hZ2UsIHNsb3QsICZidWYpOworICAgICAgICB0YXNrcy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxGbGFzaFRhc2s+KHNsb3QsIGltYWdlLT5wYXJ0X25hbWUsIGltYWdlLT5pbWdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc192Ym1ldGFfcGFydGl0aW9uKGltYWdlLT5wYXJ0X25hbWUpLCBmcF8pKTsKICAgICB9CiB9CiAKLXZvaWQgRmxhc2hBbGxUb29sOjpGbGFzaEltYWdlKGNvbnN0IEltYWdlJiBpbWFnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3QsIGZhc3Rib290X2J1ZmZlciogYnVmKSB7Ci0gICAgYXV0byBmbGFzaCA9IFsmLCB0aGlzXShjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gc2lnbmF0dXJlX2RhdGE7Ci0gICAgICAgIGlmIChmcF8tPnNvdXJjZS0+UmVhZEZpbGUoaW1hZ2Uuc2lnX25hbWUsICZzaWduYXR1cmVfZGF0YSkpIHsKLSAgICAgICAgICAgIGZiLT5Eb3dubG9hZCgic2lnbmF0dXJlIiwgc2lnbmF0dXJlX2RhdGEpOwotICAgICAgICAgICAgZmItPlJhd0NvbW1hbmQoInNpZ25hdHVyZSIsICJpbnN0YWxsaW5nIHNpZ25hdHVyZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzX2xvZ2ljYWwocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgICAgICBmYi0+UmVzaXplUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lLCBzdGQ6OnRvX3N0cmluZyhidWYtPmltYWdlX3NpemUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsYXNoX2J1ZihwYXJ0aXRpb25fbmFtZS5jX3N0cigpLCBidWYsIGlzX3ZibWV0YV9wYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpKTsKLSAgICB9OwotICAgIGRvX2Zvcl9wYXJ0aXRpb25zKGltYWdlLnBhcnRfbmFtZSwgc2xvdCwgZmxhc2gsIGZhbHNlKTsKLX0KLQotY2xhc3MgWmlwSW1hZ2VTb3VyY2UgZmluYWwgOiBwdWJsaWMgSW1hZ2VTb3VyY2UgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgWmlwSW1hZ2VTb3VyY2UoWmlwQXJjaGl2ZUhhbmRsZSB6aXApIDogemlwXyh6aXApIHt9Ci0gICAgYm9vbCBSZWFkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8Y2hhcj4qIG91dCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdW5pcXVlX2ZkIE9wZW5GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIFppcEFyY2hpdmVIYW5kbGUgemlwXzsKLX07Ci0KIGJvb2wgWmlwSW1hZ2VTb3VyY2U6OlJlYWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxjaGFyPiogb3V0KSBjb25zdCB7CiAgICAgcmV0dXJuIFVuemlwVG9NZW1vcnkoemlwXywgbmFtZSwgb3V0KTsKIH0KIAogdW5pcXVlX2ZkIFppcEltYWdlU291cmNlOjpPcGVuRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgewotICAgIHJldHVybiB1bnppcF90b19maWxlKHppcF8sIG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIFVuemlwVG9GaWxlKHppcF8sIG5hbWUuY19zdHIoKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX3VwZGF0ZShjb25zdCBjaGFyKiBmaWxlbmFtZSwgRmxhc2hpbmdQbGFuKiBmcCkgewpAQCAtMTk0OCwyMSArMTkzNSwxMyBAQAogICAgIGlmIChlcnJvciAhPSAwKSB7CiAgICAgICAgIGRpZSgiZmFpbGVkIHRvIG9wZW4gemlwIGZpbGUgJyVzJzogJXMiLCBmaWxlbmFtZSwgRXJyb3JDb2RlU3RyaW5nKGVycm9yKSk7CiAgICAgfQotICAgIFppcEltYWdlU291cmNlIHpwID0gWmlwSW1hZ2VTb3VyY2UoemlwKTsKLSAgICBmcC0+c291cmNlID0gJnpwOwotICAgIGZwLT53YW50c193aXBlID0gZmFsc2U7CisgICAgZnAtPnNvdXJjZS5yZXNldChuZXcgWmlwSW1hZ2VTb3VyY2UoemlwKSk7CiAgICAgRmxhc2hBbGxUb29sIHRvb2woZnApOwogICAgIHRvb2wuRmxhc2goKTsKIAogICAgIENsb3NlQXJjaGl2ZSh6aXApOwogfQogCi1jbGFzcyBMb2NhbEltYWdlU291cmNlIGZpbmFsIDogcHVibGljIEltYWdlU291cmNlIHsKLSAgcHVibGljOgotICAgIGJvb2wgUmVhZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6dmVjdG9yPGNoYXI+KiBvdXQpIGNvbnN0IG92ZXJyaWRlOwotICAgIHVuaXF1ZV9mZCBPcGVuRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Qgb3ZlcnJpZGU7Ci19OwotCiBib29sIExvY2FsSW1hZ2VTb3VyY2U6OlJlYWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxjaGFyPiogb3V0KSBjb25zdCB7CiAgICAgYXV0byBwYXRoID0gZmluZF9pdGVtX2dpdmVuX25hbWUobmFtZSk7CiAgICAgaWYgKHBhdGguZW1wdHkoKSkgewpAQCAtMTk3Nyw4ICsxOTU2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZG9fZmxhc2hhbGwoRmxhc2hpbmdQbGFuKiBmcCkgewotICAgIExvY2FsSW1hZ2VTb3VyY2UgcyA9IExvY2FsSW1hZ2VTb3VyY2UoKTsKLSAgICBmcC0+c291cmNlID0gJnM7CisgICAgZnAtPnNvdXJjZS5yZXNldChuZXcgTG9jYWxJbWFnZVNvdXJjZSgpKTsKICAgICBGbGFzaEFsbFRvb2wgdG9vbChmcCk7CiAgICAgdG9vbC5GbGFzaCgpOwogfQpAQCAtMjAyMiw3ICsyMDAwLDcgQEAKIAogdm9pZCBmYl9wZXJmb3JtX2Zvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uLCBpbnQgc2tpcF9pZl9ub3Rfc3VwcG9ydGVkLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV9vdmVycmlkZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNpemVfb3ZlcnJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGZzX29wdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgZnNfb3B0aW9ucywgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgewogICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbl90eXBlLCBwYXJ0aXRpb25fc2l6ZTsKIAogICAgIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIgYnVmOwpAQCAtMjAzNSw4ICsyMDEzLDggQEAKICAgICBpZiAodGFyZ2V0X3NwYXJzZV9saW1pdCA+IDAgJiYgdGFyZ2V0X3NwYXJzZV9saW1pdCA8IGxpbWl0KSB7CiAgICAgICAgIGxpbWl0ID0gdGFyZ2V0X3NwYXJzZV9saW1pdDsKICAgICB9Ci0gICAgaWYgKHNwYXJzZV9saW1pdCA+IDAgJiYgc3BhcnNlX2xpbWl0IDwgbGltaXQpIHsKLSAgICAgICAgbGltaXQgPSBzcGFyc2VfbGltaXQ7CisgICAgaWYgKGZwLT5zcGFyc2VfbGltaXQgPiAwICYmIGZwLT5zcGFyc2VfbGltaXQgPCBsaW1pdCkgeworICAgICAgICBsaW1pdCA9IGZwLT5zcGFyc2VfbGltaXQ7CiAgICAgfQogCiAgICAgaWYgKGZiLT5HZXRWYXIoInBhcnRpdGlvbi10eXBlOiIgKyBwYXJ0aXRpb24sICZwYXJ0aXRpb25fdHlwZSkgIT0gZmFzdGJvb3Q6OlNVQ0NFU1MpIHsKQEAgLTIwOTEsMTAgKzIwNjksMTEgQEAKICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICAgZGllKCJDYW5ub3Qgb3BlbiBnZW5lcmF0ZWQgaW1hZ2U6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICB9Ci0gICAgaWYgKCFsb2FkX2J1Zl9mZChzdGQ6Om1vdmUoZmQpLCAmYnVmKSkgeworICAgIGlmICghbG9hZF9idWZfZmQoc3RkOjptb3ZlKGZkKSwgJmJ1ZiwgZnApKSB7CiAgICAgICAgIGRpZSgiQ2Fubm90IHJlYWQgaW1hZ2U6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICB9Ci0gICAgZmxhc2hfYnVmKHBhcnRpdGlvbiwgJmJ1ZiwgaXNfdmJtZXRhX3BhcnRpdGlvbihwYXJ0aXRpb24pKTsKKworICAgIGZsYXNoX2J1ZihmcC0+c291cmNlLmdldCgpLCBwYXJ0aXRpb24sICZidWYsIGlzX3ZibWV0YV9wYXJ0aXRpb24ocGFydGl0aW9uKSk7CiAgICAgcmV0dXJuOwogCiBmYWlsZWQ6CkBAIC0yMTA4LDIzICsyMDg3LDMxIEBACiAgICAgfQogfQogCi1ib29sIHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lKSB7Ci0gICAgaWYgKCFnZXRfYW5kcm9pZF9wcm9kdWN0X291dCgpKSB7Citib29sIHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UoY29uc3QgSW1hZ2VTb3VyY2UqIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lKSB7CisgICAgaWYgKCFzb3VyY2UpIHsKKyAgICAgICAgaWYgKCFnZXRfYW5kcm9pZF9wcm9kdWN0X291dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBwYXRoID0gZmluZF9pdGVtX2dpdmVuX25hbWUoInN1cGVyX2VtcHR5LmltZyIpOworICAgICAgICBpZiAocGF0aC5lbXB0eSgpIHx8IGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBtZXRhZGF0YSA9IGFuZHJvaWQ6OmZzX21ncjo6UmVhZEZyb21JbWFnZUZpbGUocGF0aCk7CisgICAgICAgIGlmICghbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdWxkX2ZsYXNoX2luX3VzZXJzcGFjZSgqbWV0YWRhdGEuZ2V0KCksIHBhcnRpdGlvbl9uYW1lKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gY29udGVudHM7CisgICAgaWYgKCFzb3VyY2UtPlJlYWRGaWxlKCJzdXBlcl9lbXB0eS5pbWciLCAmY29udGVudHMpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgYXV0byBwYXRoID0gZmluZF9pdGVtX2dpdmVuX25hbWUoInN1cGVyX2VtcHR5LmltZyIpOwotICAgIGlmIChwYXRoLmVtcHR5KCkgfHwgYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhdXRvIG1ldGFkYXRhID0gYW5kcm9pZDo6ZnNfbWdyOjpSZWFkRnJvbUltYWdlRmlsZShwYXRoKTsKLSAgICBpZiAoIW1ldGFkYXRhKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgYXV0byBtZXRhZGF0YSA9IGFuZHJvaWQ6OmZzX21ncjo6UmVhZEZyb21JbWFnZUJsb2IoY29udGVudHMuZGF0YSgpLCBjb250ZW50cy5zaXplKCkpOwogICAgIHJldHVybiBzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKCptZXRhZGF0YS5nZXQoKSwgcGFydGl0aW9uX25hbWUpOwogfQogCiBzdGF0aWMgYm9vbCB3aXBlX3N1cGVyKGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6THBNZXRhZGF0YSYgbWV0YWRhdGEsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSkgeworICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSwgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgewogICAgIGF1dG8gc3VwZXJfZGV2aWNlID0gR2V0TWV0YWRhdGFTdXBlckJsb2NrRGV2aWNlKG1ldGFkYXRhKTsKICAgICBhdXRvIGJsb2NrX3NpemUgPSBtZXRhZGF0YS5nZW9tZXRyeS5sb2dpY2FsX2Jsb2NrX3NpemU7CiAgICAgYXV0byBzdXBlcl9iZGV2X25hbWUgPSBhbmRyb2lkOjpmc19tZ3I6OkdldEJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZSgqc3VwZXJfZGV2aWNlKTsKQEAgLTIxNDMsNyArMjEzMCw3IEBACiAgICAgaWYgKG1ldGFkYXRhLmJsb2NrX2RldmljZXMuc2l6ZSgpID4gMSkgewogICAgICAgICBvayA9IFdyaXRlU3BsaXRJbWFnZUZpbGVzKHRlbXBfZGlyLnBhdGgsIG1ldGFkYXRhLCBibG9ja19zaXplLCB7fSwgdHJ1ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYXV0byBpbWFnZV9wYXRoID0gdGVtcF9kaXIucGF0aCArICIvInMgKyBzdXBlcl9iZGV2X25hbWUgKyAiLmltZyI7CisgICAgICAgIGF1dG8gaW1hZ2VfcGF0aCA9IHN0ZDo6c3RyaW5nKHRlbXBfZGlyLnBhdGgpICsgIi8iICsgc3RkOjpzdHJpbmcoc3VwZXJfYmRldl9uYW1lKSArICIuaW1nIjsKICAgICAgICAgb2sgPSBXcml0ZVRvSW1hZ2VGaWxlKGltYWdlX3BhdGgsIG1ldGFkYXRhLCBibG9ja19zaXplLCB7fSwgdHJ1ZSk7CiAgICAgfQogICAgIGlmICghb2spIHsKQEAgLTIxNjIsOSArMjE0OSw5IEBACiAgICAgICAgICAgICBpbWFnZV9uYW1lID0gcGFydGl0aW9uICsgIi5pbWciOwogICAgICAgICB9CiAKLSAgICAgICAgYXV0byBpbWFnZV9wYXRoID0gdGVtcF9kaXIucGF0aCArICIvInMgKyBpbWFnZV9uYW1lOworICAgICAgICBhdXRvIGltYWdlX3BhdGggPSBzdGQ6OnN0cmluZyh0ZW1wX2Rpci5wYXRoKSArICIvIiArIGltYWdlX25hbWU7CiAgICAgICAgIGF1dG8gZmxhc2ggPSBbJl0oY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lKSB7Ci0gICAgICAgICAgICBkb19mbGFzaChwYXJ0aXRpb25fbmFtZS5jX3N0cigpLCBpbWFnZV9wYXRoLmNfc3RyKCksIGZhbHNlKTsKKyAgICAgICAgICAgIGRvX2ZsYXNoKHBhcnRpdGlvbl9uYW1lLmNfc3RyKCksIGltYWdlX3BhdGguY19zdHIoKSwgZmFsc2UsIGZwKTsKICAgICAgICAgfTsKICAgICAgICAgZG9fZm9yX3BhcnRpdGlvbnMocGFydGl0aW9uLCBzbG90LCBmbGFzaCwgZm9yY2Vfc2xvdCk7CiAKQEAgLTIxNzMsNyArMjE2MCw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3dpcGVfc3VwZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGltYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgc2xvdF9vdmVycmlkZSkgeworc3RhdGljIHZvaWQgZG9fd2lwZV9zdXBlcihjb25zdCBzdGQ6OnN0cmluZyYgaW1hZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90X292ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKSB7CiAgICAgaWYgKGFjY2VzcyhpbWFnZS5jX3N0cigpLCBSX09LKSAhPSAwKSB7CiAgICAgICAgIGRpZSgiQ291bGQgbm90IHJlYWQgaW1hZ2U6ICVzIiwgaW1hZ2UuY19zdHIoKSk7CiAgICAgfQpAQCAtMjE4OCw3ICsyMTc2LDcgQEAKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOwotICAgIGlmICghd2lwZV9zdXBlcigqbWV0YWRhdGEuZ2V0KCksIHNsb3QsICZtZXNzYWdlKSkgeworICAgIGlmICghd2lwZV9zdXBlcigqbWV0YWRhdGEuZ2V0KCksIHNsb3QsICZtZXNzYWdlLCBmcCkpIHsKICAgICAgICAgZGllKG1lc3NhZ2UpOwogICAgIH0KIH0KQEAgLTIyMzAsNiArMjIxOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiY21kbGluZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJkaXNhYmxlLXZlcmlmaWNhdGlvbiIsIG5vX2FyZ3VtZW50LCAwLCAwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJkaXNhYmxlLXZlcml0eSIsIG5vX2FyZ3VtZW50LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJkaXNhYmxlLXN1cGVyLW9wdGltaXphdGlvbiIsIG5vX2FyZ3VtZW50LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJleGNsdWRlLWR5bmFtaWMtcGFydGl0aW9ucyIsIG5vX2FyZ3VtZW50LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJkaXNhYmxlLWZhc3Rib290LWluZm8iLCBub19hcmd1bWVudCwgMCwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZm9yY2UiLCBub19hcmd1bWVudCwgMCwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZnMtb3B0aW9ucyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJoZWFkZXItdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAwfSwKQEAgLTIyNTEsNyArMjI0MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CiAKLSAgICBzZXJpYWwgPSBnZXRlbnYoIkFORFJPSURfU0VSSUFMIik7CisgICAgc2VyaWFsID0gZ2V0ZW52KCJGQVNUQk9PVF9ERVZJQ0UiKTsKKyAgICBpZiAoIXNlcmlhbCkgeworICAgICAgICBzZXJpYWwgPSBnZXRlbnYoIkFORFJPSURfU0VSSUFMIik7CisgICAgfQogCiAgICAgaW50IGM7CiAgICAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImE6OmhsczpTOnZ3IiwgbG9uZ29wdHMsICZsb25naW5kZXgpKSAhPSAtMSkgewpAQCAtMjI2NSw2ICsyMjU5LDEzIEBACiAgICAgICAgICAgICAgICAgZ19kaXNhYmxlX3ZlcmlmaWNhdGlvbiA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImRpc2FibGUtdmVyaXR5IikgewogICAgICAgICAgICAgICAgIGdfZGlzYWJsZV92ZXJpdHkgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJkaXNhYmxlLXN1cGVyLW9wdGltaXphdGlvbiIpIHsKKyAgICAgICAgICAgICAgICBmcC0+c2hvdWxkX29wdGltaXplX2ZsYXNoX3N1cGVyID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImV4Y2x1ZGUtZHluYW1pYy1wYXJ0aXRpb25zIikgeworICAgICAgICAgICAgICAgIGZwLT5leGNsdWRlX2R5bmFtaWNfcGFydGl0aW9ucyA9IHRydWU7CisgICAgICAgICAgICAgICAgZnAtPnNob3VsZF9vcHRpbWl6ZV9mbGFzaF9zdXBlciA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJkaXNhYmxlLWZhc3Rib290LWluZm8iKSB7CisgICAgICAgICAgICAgICAgZnAtPnNob3VsZF91c2VfZmFzdGJvb3RfaW5mbyA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJmb3JjZSIpIHsKICAgICAgICAgICAgICAgICBmcC0+Zm9yY2VfZmxhc2ggPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJmcy1vcHRpb25zIikgewpAQCAtMjMyMCw3ICsyMzIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2VyaWFsID0gb3B0YXJnOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUJ5dGVDb3VudChvcHRhcmcsICZzcGFyc2VfbGltaXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VCeXRlQ291bnQob3B0YXJnLCAmZnAtPnNwYXJzZV9saW1pdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSgiaW52YWxpZCBzcGFyc2UgbGltaXQgJXMiLCBvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjM2NCw4ICsyMzY1LDggQEAKICAgICAgICAgcmV0dXJuIHNob3dfaGVscCgpOwogICAgIH0KIAotICAgIFRyYW5zcG9ydCogdHJhbnNwb3J0ID0gb3Blbl9kZXZpY2UoKTsKLSAgICBpZiAodHJhbnNwb3J0ID09IG51bGxwdHIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiB0cmFuc3BvcnQgPSBvcGVuX2RldmljZSgpOworICAgIGlmICghdHJhbnNwb3J0KSB7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBmYXN0Ym9vdDo6RHJpdmVyQ2FsbGJhY2tzIGRyaXZlcl9jYWxsYmFja3MgPSB7CkBAIC0yMzc1LDcgKzIzNzYsNyBAQAogICAgICAgICAgICAgLnRleHQgPSBUZXh0TWVzc2FnZSwKICAgICB9OwogCi0gICAgZmFzdGJvb3Q6OkZhc3RCb290RHJpdmVyIGZhc3Rib290X2RyaXZlcih0cmFuc3BvcnQsIGRyaXZlcl9jYWxsYmFja3MsIGZhbHNlKTsKKyAgICBmYXN0Ym9vdDo6RmFzdEJvb3REcml2ZXIgZmFzdGJvb3RfZHJpdmVyKHN0ZDo6bW92ZSh0cmFuc3BvcnQpLCBkcml2ZXJfY2FsbGJhY2tzLCBmYWxzZSk7CiAgICAgZmIgPSAmZmFzdGJvb3RfZHJpdmVyOwogICAgIGZwLT5mYiA9ICZmYXN0Ym9vdF9kcml2ZXI7CiAKQEAgLTI0MzgsNyArMjQzOSw4IEBACiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb24gPSBuZXh0X2FyZygmYXJncyk7CiAKICAgICAgICAgICAgIGF1dG8gZm9ybWF0ID0gWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24pIHsKLSAgICAgICAgICAgICAgICBmYl9wZXJmb3JtX2Zvcm1hdChwYXJ0aXRpb24sIDAsIHR5cGVfb3ZlcnJpZGUsIHNpemVfb3ZlcnJpZGUsIGZwLT5mc19vcHRpb25zKTsKKyAgICAgICAgICAgICAgICBmYl9wZXJmb3JtX2Zvcm1hdChwYXJ0aXRpb24sIDAsIHR5cGVfb3ZlcnJpZGUsIHNpemVfb3ZlcnJpZGUsIGZwLT5mc19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwLmdldCgpKTsKICAgICAgICAgICAgIH07CiAgICAgICAgICAgICBkb19mb3JfcGFydGl0aW9ucyhwYXJ0aXRpb24sIGZwLT5zbG90X292ZXJyaWRlLCBmb3JtYXQsIHRydWUpOwogICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gInNpZ25hdHVyZSIpIHsKQEAgLTI0ODUsNyArMjQ4Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZm5hbWUuZW1wdHkoKSkgZGllKCJjYW5ub3QgZGV0ZXJtaW5lIGltYWdlIGZpbGVuYW1lIGZvciAnJXMnIiwgcG5hbWUuY19zdHIoKSk7CiAKLSAgICAgICAgICAgIEZsYXNoVGFzayB0YXNrKGZwLT5zbG90X292ZXJyaWRlLCBwbmFtZSwgZm5hbWUsIGlzX3ZibWV0YV9wYXJ0aXRpb24ocG5hbWUpKTsKKyAgICAgICAgICAgIEZsYXNoVGFzayB0YXNrKGZwLT5zbG90X292ZXJyaWRlLCBwbmFtZSwgZm5hbWUsIGlzX3ZibWV0YV9wYXJ0aXRpb24ocG5hbWUpLCBmcC5nZXQoKSk7CiAgICAgICAgICAgICB0YXNrLlJ1bigpOwogICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gImZsYXNoOnJhdyIpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbiA9IG5leHRfYXJnKCZhcmdzKTsKQEAgLTI1MzIsNyArMjUzNCw3IEBACiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IG5leHRfYXJnKCZhcmdzKTsKIAogICAgICAgICAgICAgc3RydWN0IGZhc3Rib290X2J1ZmZlciBidWY7Ci0gICAgICAgICAgICBpZiAoIWxvYWRfYnVmKGZpbGVuYW1lLmNfc3RyKCksICZidWYpIHx8IGJ1Zi50eXBlICE9IEZCX0JVRkZFUl9GRCkgeworICAgICAgICAgICAgaWYgKCFsb2FkX2J1ZihmaWxlbmFtZS5jX3N0cigpLCAmYnVmLCBmcC5nZXQoKSkgfHwgYnVmLnR5cGUgIT0gRkJfQlVGRkVSX0ZEKSB7CiAgICAgICAgICAgICAgICAgZGllKCJjYW5ub3QgbG9hZCAnJXMnIiwgZmlsZW5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmYi0+RG93bmxvYWQoZmlsZW5hbWUsIGJ1Zi5mZC5nZXQoKSwgYnVmLnN6KTsKQEAgLTI1NjUsMTQgKzI1NjcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxSZXNpemVUYXNrPihmcC5nZXQoKSwgcGFydGl0aW9uLCBzaXplLCBmcC0+c2xvdF9vdmVycmlkZSk7CiAgICAgICAgICAgICByZXNpemVfdGFzay0+UnVuKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAiZ3NpIikgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgYXJnID0gbmV4dF9hcmcoJmFyZ3MpOwotICAgICAgICAgICAgaWYgKGFyZyA9PSAid2lwZSIpIHsKLSAgICAgICAgICAgICAgICBmYi0+UmF3Q29tbWFuZCgiZ3NpOndpcGUiLCAid2lwaW5nIEdTSSIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gImRpc2FibGUiKSB7Ci0gICAgICAgICAgICAgICAgZmItPlJhd0NvbW1hbmQoImdzaTpkaXNhYmxlIiwgImRpc2FibGluZyBHU0kiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3ludGF4X2Vycm9yKCJleHBlY3RlZCAnd2lwZScgb3IgJ2Rpc2FibGUnIik7CisgICAgICAgICAgICBpZiAoYXJncy5lbXB0eSgpKSBzeW50YXhfZXJyb3IoImludmFsaWQgZ3NpIGNvbW1hbmQiKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNtZCgiZ3NpIik7CisgICAgICAgICAgICB3aGlsZSAoIWFyZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNtZCArPSAiOiIgKyBuZXh0X2FyZygmYXJncyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi0+UmF3Q29tbWFuZChjbWQsICIiKTsKICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJ3aXBlLXN1cGVyIikgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW1hZ2U7CiAgICAgICAgICAgICBpZiAoYXJncy5lbXB0eSgpKSB7CkBAIC0yNTgwLDcgKzI1ODAsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpbWFnZSA9IG5leHRfYXJnKCZhcmdzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvX3dpcGVfc3VwZXIoaW1hZ2UsIGZwLT5zbG90X292ZXJyaWRlKTsKKyAgICAgICAgICAgIGRvX3dpcGVfc3VwZXIoaW1hZ2UsIGZwLT5zbG90X292ZXJyaWRlLCBmcC5nZXQoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAic25hcHNob3QtdXBkYXRlIikgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgYXJnOwogICAgICAgICAgICAgaWYgKCFhcmdzLmVtcHR5KCkpIHsKQEAgLTI1OTMsNyArMjU5Myw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBGQl9DTURfRkVUQ0gpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbiA9IG5leHRfYXJnKCZhcmdzKTsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG91dGZpbGUgPSBuZXh0X2FyZygmYXJncyk7Ci0gICAgICAgICAgICBkb19mZXRjaChwYXJ0aXRpb24sIGZwLT5zbG90X292ZXJyaWRlLCBvdXRmaWxlKTsKKyAgICAgICAgICAgIGRvX2ZldGNoKHBhcnRpdGlvbiwgZnAtPnNsb3Rfb3ZlcnJpZGUsIG91dGZpbGUsIGZwLT5mYik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzeW50YXhfZXJyb3IoInVua25vd24gY29tbWFuZCAlcyIsIGNvbW1hbmQuY19zdHIoKSk7CiAgICAgICAgIH0KQEAgLTI2MDMsMTAgKzI2MDMsMTMgQEAKICAgICAgICAgaWYgKGZwLT5mb3JjZV9mbGFzaCkgewogICAgICAgICAgICAgQ2FuY2VsU25hcHNob3RJZk5lZWRlZCgpOwogICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gd2lwZV90YXNrczsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcnRpdGlvbnMgPSB7InVzZXJkYXRhIiwgImNhY2hlIiwgIm1ldGFkYXRhIn07CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFydGl0aW9uIDogcGFydGl0aW9ucykgewotICAgICAgICAgICAgdGFza3MuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8V2lwZVRhc2s+KGZwLmdldCgpLCBwYXJ0aXRpb24pKTsKKyAgICAgICAgICAgIHdpcGVfdGFza3MuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8V2lwZVRhc2s+KGZwLmdldCgpLCBwYXJ0aXRpb24pKTsKICAgICAgICAgfQorICAgICAgICB0YXNrcy5pbnNlcnQodGFza3MuYmVnaW4oKSwgc3RkOjptYWtlX21vdmVfaXRlcmF0b3Iod2lwZV90YXNrcy5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHdpcGVfdGFza3MuZW5kKCkpKTsKICAgICB9CiAgICAgaWYgKGZwLT53YW50c19zZXRfYWN0aXZlKSB7CiAgICAgICAgIGZiLT5TZXRBY3RpdmUobmV4dF9hY3RpdmUpOwpAQCAtMjYxNiw5ICsyNjE5LDYgQEAKICAgICB9CiAgICAgZnByaW50ZihzdGRlcnIsICJGaW5pc2hlZC4gVG90YWwgdGltZTogJS4zZnNcbiIsIChub3coKSAtIHN0YXJ0KSk7CiAKLSAgICBhdXRvKiBvbGRfdHJhbnNwb3J0ID0gZmItPnNldF90cmFuc3BvcnQobnVsbHB0cik7Ci0gICAgZGVsZXRlIG9sZF90cmFuc3BvcnQ7Ci0KICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZmFzdGJvb3QuaCBiL2Zhc3Rib290L2Zhc3Rib290LmgKaW5kZXggZDZhZmI5ZS4uNmE0OTk3MCAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZmFzdGJvb3QuaAorKysgYi9mYXN0Ym9vdC9mYXN0Ym9vdC5oCkBAIC0yNywxMSArMjcsMTEgQEAKICAqLwogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyLmgiCiAjaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyX2ludGVyZmFjZS5oIgogI2luY2x1ZGUgImZpbGVzeXN0ZW0uaCIKLSNpbmNsdWRlICJzdXBlcl9mbGFzaF9oZWxwZXIuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSAicmVzdWx0LmgiCiAjaW5jbHVkZSAic29ja2V0LmgiCiAjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInppcGFyY2hpdmUvemlwX2FyY2hpdmUuaCIKIAogY2xhc3MgRmFzdEJvb3RUb29sIHsKICAgcHVibGljOgpAQCAtNTYsNyArNTcsOCBAQAogfTsKIAogc3RydWN0IGZhc3Rib290X2J1ZmZlciB7Ci0gICAgZW51bSBmYl9idWZmZXJfdHlwZSB0eXBlOworICAgIGZiX2J1ZmZlcl90eXBlIHR5cGU7CisgICAgZmJfYnVmZmVyX3R5cGUgZmlsZV90eXBlOwogICAgIHN0ZDo6dmVjdG9yPFNwYXJzZVB0cj4gZmlsZXM7CiAgICAgaW50NjRfdCBzejsKICAgICB1bmlxdWVfZmQgZmQ7CkBAIC04OSwxMiArOTEsMTYgQEAKICAgICAvLyBJZiB0aGUgaW1hZ2UgdXNlcyB0aGUgZGVmYXVsdCBzbG90LCBvciB0aGUgdXNlciBzcGVjaWZpZWQgImFsbCIsIHRoZW4KICAgICAvLyB0aGUgcGFpcmVkIHN0cmluZyB3aWxsIGJlIGVtcHR5LiBJZiB0aGUgaW1hZ2UgcmVxdWVzdHMgYSBzcGVjaWZpYyBzbG90CiAgICAgLy8gKGZvciBleGFtcGxlLCBzeXN0ZW1fb3RoZXIpIGl0IGlzIHNwZWNpZmllZCBpbnN0ZWFkLgotICAgIEltYWdlU291cmNlKiBzb3VyY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltYWdlU291cmNlPiBzb3VyY2U7CiAgICAgYm9vbCB3YW50c193aXBlID0gZmFsc2U7CiAgICAgYm9vbCBza2lwX3JlYm9vdCA9IGZhbHNlOwogICAgIGJvb2wgd2FudHNfc2V0X2FjdGl2ZSA9IGZhbHNlOwogICAgIGJvb2wgc2tpcF9zZWNvbmRhcnkgPSBmYWxzZTsKICAgICBib29sIGZvcmNlX2ZsYXNoID0gZmFsc2U7CisgICAgYm9vbCBzaG91bGRfb3B0aW1pemVfZmxhc2hfc3VwZXIgPSB0cnVlOworICAgIGJvb2wgc2hvdWxkX3VzZV9mYXN0Ym9vdF9pbmZvID0gdHJ1ZTsKKyAgICBib29sIGV4Y2x1ZGVfZHluYW1pY19wYXJ0aXRpb25zID0gZmFsc2U7CisgICAgdWludDY0X3Qgc3BhcnNlX2xpbWl0ID0gMDsKIAogICAgIHN0ZDo6c3RyaW5nIHNsb3Rfb3ZlcnJpZGU7CiAgICAgc3RkOjpzdHJpbmcgY3VycmVudF9zbG90OwpAQCAtMTA4LDIzICsxMTQsNDYgQEAKICAgICBGbGFzaEFsbFRvb2woRmxhc2hpbmdQbGFuKiBmcCk7CiAKICAgICB2b2lkIEZsYXNoKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiBDb2xsZWN0VGFza3MoKTsKIAogICBwcml2YXRlOgogICAgIHZvaWQgQ2hlY2tSZXF1aXJlbWVudHMoKTsKICAgICB2b2lkIERldGVybWluZVNsb3QoKTsKICAgICB2b2lkIENvbGxlY3RJbWFnZXMoKTsKLSAgICB2b2lkIEZsYXNoSW1hZ2VzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBJbWFnZSosIHN0ZDo6c3RyaW5nPj4mIGltYWdlcyk7Ci0gICAgdm9pZCBGbGFzaEltYWdlKGNvbnN0IEltYWdlJiBpbWFnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3QsIGZhc3Rib290X2J1ZmZlciogYnVmKTsKLSAgICB2b2lkIEhhcmRjb2RlZEZsYXNoKCk7CisgICAgdm9pZCBBZGRGbGFzaFRhc2tzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBJbWFnZSosIHN0ZDo6c3RyaW5nPj4mIGltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiYgdGFza3MpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiBDb2xsZWN0VGFza3NGcm9tRmFzdGJvb3RJbmZvKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiBDb2xsZWN0VGFza3NGcm9tSW1hZ2VMaXN0KCk7CiAKICAgICBzdGQ6OnZlY3RvcjxJbWFnZUVudHJ5PiBib290X2ltYWdlc187CiAgICAgc3RkOjp2ZWN0b3I8SW1hZ2VFbnRyeT4gb3NfaW1hZ2VzXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzXzsKKwogICAgIEZsYXNoaW5nUGxhbiogZnBfOwogfTsKIAotYm9vbCBzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSk7CitjbGFzcyBaaXBJbWFnZVNvdXJjZSBmaW5hbCA6IHB1YmxpYyBJbWFnZVNvdXJjZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBaaXBJbWFnZVNvdXJjZShaaXBBcmNoaXZlSGFuZGxlIHppcCkgOiB6aXBfKHppcCkge30KKyAgICBib29sIFJlYWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxjaGFyPiogb3V0KSBjb25zdCBvdmVycmlkZTsKKyAgICB1bmlxdWVfZmQgT3BlbkZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBfOworfTsKKworY2xhc3MgTG9jYWxJbWFnZVNvdXJjZSBmaW5hbCA6IHB1YmxpYyBJbWFnZVNvdXJjZSB7CisgIHB1YmxpYzoKKyAgICBib29sIFJlYWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxjaGFyPiogb3V0KSBjb25zdCBvdmVycmlkZTsKKyAgICB1bmlxdWVfZmQgT3BlbkZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2hhciogZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKTsKK2Jvb2wgc2hvdWxkX2ZsYXNoX2luX3VzZXJzcGFjZShjb25zdCBJbWFnZVNvdXJjZSogc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUpOwogYm9vbCBpc191c2Vyc3BhY2VfZmFzdGJvb3QoKTsKLXZvaWQgZG9fZmxhc2goY29uc3QgY2hhciogcG5hbWUsIGNvbnN0IGNoYXIqIGZuYW1lLCBjb25zdCBib29sIGFwcGx5X3ZibWV0YSk7Cit2b2lkIGRvX2ZsYXNoKGNvbnN0IGNoYXIqIHBuYW1lLCBjb25zdCBjaGFyKiBmbmFtZSwgY29uc3QgYm9vbCBhcHBseV92Ym1ldGEsCisgICAgICAgICAgICAgIGNvbnN0IEZsYXNoaW5nUGxhbiogZnApOwogdm9pZCBkb19mb3JfcGFydGl0aW9ucyhjb25zdCBzdGQ6OnN0cmluZyYgcGFydCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiYgZnVuYywgYm9vbCBmb3JjZV9zbG90KTsKIHN0ZDo6c3RyaW5nIGZpbmRfaXRlbShjb25zdCBzdGQ6OnN0cmluZyYgaXRlbSk7CkBAIC0xMzMsNyArMTYyLDggQEAKIHN0ZDo6c3RyaW5nIGdldF9jdXJyZW50X3Nsb3QoKTsKIAogLy8gQ29kZSBmb3IgUGFyc2luZyBmYXN0Ym9vdC1pbmZvLnR4dAotYm9vbCBDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmQpOworYm9vbCBDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhvc3RfdG9vbF92ZXJzaW9uKTsKIHN0ZDo6dW5pcXVlX3B0cjxGbGFzaFRhc2s+IFBhcnNlRmxhc2hDb21tYW5kKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhcnRzKTsKIHN0ZDo6dW5pcXVlX3B0cjxSZWJvb3RUYXNrPiBQYXJzZVJlYm9vdENvbW1hbmQoY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwKQEAgLTE0Miw3ICsxNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGFydHMpOwogc3RkOjp1bmlxdWVfcHRyPFRhc2s+IFBhcnNlRmFzdGJvb3RJbmZvTGluZShjb25zdCBGbGFzaGluZ1BsYW4qIGZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmQpOwotdm9pZCBBZGRSZXNpemVUYXNrcyhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrcyk7Citib29sIEFkZFJlc2l6ZVRhc2tzKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKTsKIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gUGFyc2VGYXN0Ym9vdEluZm8oY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBmaWxlKTsKIApAQCAtMTUzLDE0ICsxODMsMTMgQEAKIH07CiAKIFJlc3VsdDxOZXR3b3JrU2VyaWFsLCBGYXN0Ym9vdEVycm9yPiBQYXJzZU5ldHdvcmtTZXJpYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbCk7Ci1ib29sIHN1cHBvcnRzX0FCKCk7CiBzdGQ6OnN0cmluZyBHZXRQYXJ0aXRpb25OYW1lKGNvbnN0IEltYWdlRW50cnkmIGVudHJ5LCBjb25zdCBzdGQ6OnN0cmluZyYgY3VycmVudF9zbG90Xyk7CiB2b2lkIGZsYXNoX3BhcnRpdGlvbl9maWxlcyhjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uLCBjb25zdCBzdGQ6OnZlY3RvcjxTcGFyc2VQdHI+JiBmaWxlcyk7Ci1pbnQ2NF90IGdldF9zcGFyc2VfbGltaXQoaW50NjRfdCBzaXplKTsKK2ludDY0X3QgZ2V0X3NwYXJzZV9saW1pdChpbnQ2NF90IHNpemUsIGNvbnN0IEZsYXNoaW5nUGxhbiogZnApOwogc3RkOjp2ZWN0b3I8U3BhcnNlUHRyPiByZXNwYXJzZV9maWxlKHNwYXJzZV9maWxlKiBzLCBpbnQ2NF90IG1heF9zaXplKTsKIAotYm9vbCBpc19yZXRyb2ZpdF9kZXZpY2UoKTsKK2Jvb2wgc3VwcG9ydHNfQUIoZmFzdGJvb3Q6OklGYXN0Qm9vdERyaXZlciogZmIpOwogYm9vbCBpc19sb2dpY2FsKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24pOwogdm9pZCBmYl9wZXJmb3JtX2Zvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uLCBpbnQgc2tpcF9pZl9ub3Rfc3VwcG9ydGVkLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZV9vdmVycmlkZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNpemVfb3ZlcnJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGZzX29wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBmc19vcHRpb25zLCBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKTsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlci5jcHAgYi9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXIuY3BwCmluZGV4IDk3NzBhYjIuLmU1ZWY2NmIgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlci5jcHAKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyLmNwcApAQCAtNTgsOSArNTgsMTAgQEAKIG5hbWVzcGFjZSBmYXN0Ym9vdCB7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUFVCTElDICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1GYXN0Qm9vdERyaXZlcjo6RmFzdEJvb3REcml2ZXIoVHJhbnNwb3J0KiB0cmFuc3BvcnQsIERyaXZlckNhbGxiYWNrcyBkcml2ZXJfY2FsbGJhY2tzLAorRmFzdEJvb3REcml2ZXI6OkZhc3RCb290RHJpdmVyKHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJDYWxsYmFja3MgZHJpdmVyX2NhbGxiYWNrcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vX2NoZWNrcykKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICA6IHRyYW5zcG9ydF8oc3RkOjptb3ZlKHRyYW5zcG9ydCkpLAogICAgICAgcHJvbG9nXyhzdGQ6Om1vdmUoZHJpdmVyX2NhbGxiYWNrcy5wcm9sb2cpKSwKICAgICAgIGVwaWxvZ18oc3RkOjptb3ZlKGRyaXZlcl9jYWxsYmFja3MuZXBpbG9nKSksCiAgICAgICBpbmZvXyhzdGQ6Om1vdmUoZHJpdmVyX2NhbGxiYWNrcy5pbmZvKSksCkBAIC02MjcsOSArNjI4LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotVHJhbnNwb3J0KiBGYXN0Qm9vdERyaXZlcjo6c2V0X3RyYW5zcG9ydChUcmFuc3BvcnQqIHRyYW5zcG9ydCkgewotICAgIHN0ZDo6c3dhcCh0cmFuc3BvcnRfLCB0cmFuc3BvcnQpOwotICAgIHJldHVybiB0cmFuc3BvcnQ7Cit2b2lkIEZhc3RCb290RHJpdmVyOjpzZXRfdHJhbnNwb3J0KHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICAgIHRyYW5zcG9ydF8gPSBzdGQ6Om1vdmUodHJhbnNwb3J0KTsKIH0KIAogfSAgLy8gRW5kIG5hbWVzcGFjZSBmYXN0Ym9vdApkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyLmggYi9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXIuaAppbmRleCAzZDZjN2IwLi40OWNlYmQ5IDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXIuaAorKysgYi9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXIuaApAQCAtMjcsOCArMjcsOSBAQAogICovCiAjcHJhZ21hIG9uY2UKICNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCkBAIC0zNiwxMCArMzcsOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8Ym9vdGltZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgogCi0jaW5jbHVkZSAiY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyX2ludGVyZmFjZS5oIgogI2luY2x1ZGUgInRyYW5zcG9ydC5oIgogCkBAIC02Miw3ICs2MSw3IEBACiAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfRE9XTkxPQURfU0laRSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBUUkFOU1BPUlRfQ0hVTktfU0laRSA9IDEwMjQ7CiAKLSAgICBGYXN0Qm9vdERyaXZlcihUcmFuc3BvcnQqIHRyYW5zcG9ydCwgRHJpdmVyQ2FsbGJhY2tzIGRyaXZlcl9jYWxsYmFja3MgPSB7fSwKKyAgICBGYXN0Qm9vdERyaXZlcihzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiB0cmFuc3BvcnQsIERyaXZlckNhbGxiYWNrcyBkcml2ZXJfY2FsbGJhY2tzID0ge30sCiAgICAgICAgICAgICAgICAgICAgYm9vbCBub19jaGVja3MgPSBmYWxzZSk7CiAgICAgfkZhc3RCb290RHJpdmVyKCk7CiAKQEAgLTEwNCw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5mbyA9IG51bGxwdHIpOwogICAgIFJldENvZGUgRmV0Y2hUb0ZkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLAogICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gLTEsIGludDY0X3Qgc2l6ZSA9IC0xLCBzdGQ6OnN0cmluZyogcmVzcG9uc2UgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5mbyA9IG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5mbyA9IG51bGxwdHIpIG92ZXJyaWRlOwogCiAgICAgLyogSElHSEVSIExFVkVMIENPTU1BTkRTIC0tIENvbXBvc2VkIG9mIHRoZSBjb21tYW5kcyBhYm92ZSAqLwogICAgIFJldENvZGUgRmxhc2hQYXJ0aXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcj4mIGRhdGEpOwpAQCAtMTIzLDkgKzEyMiw3IEBACiAgICAgc3RkOjpzdHJpbmcgRXJyb3IoKTsKICAgICBSZXRDb2RlIFdhaXRGb3JEaXNjb25uZWN0KCkgb3ZlcnJpZGU7CiAKLSAgICAvLyBOb3RlOiBzZXRfdHJhbnNwb3J0IHdpbGwgcmV0dXJuIHRoZSBwcmV2aW91cyB0cmFuc3BvcnQuCi0gICAgVHJhbnNwb3J0KiBzZXRfdHJhbnNwb3J0KFRyYW5zcG9ydCogdHJhbnNwb3J0KTsKLSAgICBUcmFuc3BvcnQqIHRyYW5zcG9ydCgpIGNvbnN0IHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKyAgICB2b2lkIHNldF90cmFuc3BvcnQoc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKIAogICAgIFJldENvZGUgUmF3Q29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyYgY21kLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHJlc3BvbnNlID0gbnVsbHB0ciwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbmZvID0gbnVsbHB0ciwKQEAgLTE0Miw3ICsxMzksNyBAQAogCiAgICAgc3RkOjpzdHJpbmcgRXJybm9TdHIoY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CiAKLSAgICBUcmFuc3BvcnQqIHRyYW5zcG9ydF87CisgICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKIAogICBwcml2YXRlOgogICAgIFJldENvZGUgU2VuZEJ1ZmZlcihhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyX2ludGVyZmFjZS5oIGIvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyX2ludGVyZmFjZS5oCmluZGV4IDc5NTkzOGYuLjdjYjhhNmIgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl9pbnRlcmZhY2UuaAorKysgYi9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXJfaW50ZXJmYWNlLmgKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5mbyA9IG51bGxwdHIpID0gMDsKICAgICBSZXRDb2RlIHZpcnR1YWwgR2V0VmFyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluZm8gPSBudWxscHRyKSA9IDA7CisgICAgUmV0Q29kZSB2aXJ0dWFsIEZldGNoVG9GZChjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gLTEsIGludDY0X3Qgc2l6ZSA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHJlc3BvbnNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5mbyA9IG51bGxwdHIpID0gMDsKICAgICBSZXRDb2RlIHZpcnR1YWwgRG93bmxvYWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHJlc3BvbnNlID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbmZvID0gbnVsbHB0cikgPSAwOwpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyX21vY2suaCBiL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl9tb2NrLmgKaW5kZXggNjJhNTcwOC4uN2M0MWQ3OCAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyX21vY2suaAorKysgYi9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXJfbW9jay5oCkBAIC0yMiwyMiArMjIsMjIgQEAKIAogY2xhc3MgTW9ja0Zhc3Rib290RHJpdmVyIDogcHVibGljIElGYXN0Qm9vdERyaXZlciB7CiAgIHB1YmxpYzoKLSAgICBNT0NLX01FVEhPRChSZXRDb2RlLCBGbGFzaFBhcnRpdGlvbiwKLSAgICAgICAgICAgICAgICAoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIHVpbnQzMl90IHN6KSwKKyAgICBNT0NLX01FVEhPRChSZXRDb2RlLCBGbGFzaFBhcnRpdGlvbiwgKGNvbnN0IHN0ZDo6c3RyaW5nJiwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQsIHVpbnQzMl90KSwKICAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKICAgICBNT0NLX01FVEhPRChSZXRDb2RlLCBEZWxldGVQYXJ0aXRpb24sIChjb25zdCBzdGQ6OnN0cmluZyYpLCAob3ZlcnJpZGUpKTsKICAgICBNT0NLX01FVEhPRChSZXRDb2RlLCBSZWJvb3QsIChzdGQ6OnN0cmluZyosIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiopLCAob3ZlcnJpZGUpKTsKICAgICBNT0NLX01FVEhPRChSZXRDb2RlLCBSZWJvb3RUbywgKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyosIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiopLAogICAgICAgICAgICAgICAgIChvdmVycmlkZSkpOwotCiAgICAgTU9DS19NRVRIT0QoUmV0Q29kZSwgR2V0VmFyLCAoY29uc3Qgc3RkOjpzdHJpbmcmLCBzdGQ6OnN0cmluZyosIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiopLAogICAgICAgICAgICAgICAgIChvdmVycmlkZSkpOwotCisgICAgTU9DS19NRVRIT0QoUmV0Q29kZSwgRmV0Y2hUb0ZkLAorICAgICAgICAgICAgICAgIChjb25zdCBzdGQ6OnN0cmluZyYsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyosIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiopLAorICAgICAgICAgICAgICAgIChvdmVycmlkZSkpOwogICAgIE1PQ0tfTUVUSE9EKFJldENvZGUsIERvd25sb2FkLAogICAgICAgICAgICAgICAgIChjb25zdCBzdGQ6OnN0cmluZyYsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkLCBzaXplX3QsIHN0ZDo6c3RyaW5nKiwKICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiksCiAgICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0KICAgICBNT0NLX01FVEhPRChSZXRDb2RlLCBSYXdDb21tYW5kLAogICAgICAgICAgICAgICAgIChjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IHN0ZDo6c3RyaW5nJiwgc3RkOjpzdHJpbmcqLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qLAogICAgICAgICAgICAgICAgICBpbnQqKSwKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl90ZXN0LmNwcCBiL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl90ZXN0LmNwcAppbmRleCA2ZjZjZjhjLi5kMjAzM2IwIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXJfdGVzdC5jcHAKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyX3Rlc3QuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlICJmYXN0Ym9vdF9kcml2ZXIuaCIKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CkBAIC0zMCwxMyArMzEsMTQgQEAKIH07CiAKIFRFU1RfRihEcml2ZXJUZXN0LCBHZXRWYXIpIHsKLSAgICBNb2NrVHJhbnNwb3J0IHRyYW5zcG9ydDsKLSAgICBGYXN0Qm9vdERyaXZlciBkcml2ZXIoJnRyYW5zcG9ydCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1vY2tUcmFuc3BvcnQ+IHRyYW5zcG9ydF9wb2ludGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrVHJhbnNwb3J0PigpOworICAgIE1vY2tUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IHRyYW5zcG9ydF9wb2ludGVyLmdldCgpOworICAgIEZhc3RCb290RHJpdmVyIGRyaXZlcihzdGQ6Om1vdmUodHJhbnNwb3J0X3BvaW50ZXIpKTsKIAotICAgIEVYUEVDVF9DQUxMKHRyYW5zcG9ydCwgV3JpdGUoXywgXykpCisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgV3JpdGUoXywgXykpCiAgICAgICAgICAgICAuV2l0aChBbGxBcmdzKFJhd0RhdGEoImdldHZhcjp2ZXJzaW9uIikpKQogICAgICAgICAgICAgLldpbGxPbmNlKFJldHVybkFyZzwxPigpKTsKLSAgICBFWFBFQ1RfQ0FMTCh0cmFuc3BvcnQsIFJlYWQoXywgXykpLldpbGxPbmNlKEludm9rZShDb3B5RGF0YSgiT0tBWTAuNCIpKSk7CisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgUmVhZChfLCBfKSkuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJPS0FZMC40IikpKTsKIAogICAgIHN0ZDo6c3RyaW5nIG91dHB1dDsKICAgICBBU1NFUlRfRVEoZHJpdmVyLkdldFZhcigidmVyc2lvbiIsICZvdXRwdXQpLCBTVUNDRVNTKSA8PCBkcml2ZXIuRXJyb3IoKTsKQEAgLTQ0LDE0ICs0NiwxNSBAQAogfQogCiBURVNUX0YoRHJpdmVyVGVzdCwgSW5mb01lc3NhZ2UpIHsKLSAgICBNb2NrVHJhbnNwb3J0IHRyYW5zcG9ydDsKLSAgICBGYXN0Qm9vdERyaXZlciBkcml2ZXIoJnRyYW5zcG9ydCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1vY2tUcmFuc3BvcnQ+IHRyYW5zcG9ydF9wb2ludGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb2NrVHJhbnNwb3J0PigpOworICAgIE1vY2tUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IHRyYW5zcG9ydF9wb2ludGVyLmdldCgpOworICAgIEZhc3RCb290RHJpdmVyIGRyaXZlcihzdGQ6Om1vdmUodHJhbnNwb3J0X3BvaW50ZXIpKTsKIAotICAgIEVYUEVDVF9DQUxMKHRyYW5zcG9ydCwgV3JpdGUoXywgXykpCisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgV3JpdGUoXywgXykpCiAgICAgICAgICAgICAuV2l0aChBbGxBcmdzKFJhd0RhdGEoIm9lbSBkbWVzZyIpKSkKICAgICAgICAgICAgIC5XaWxsT25jZShSZXR1cm5Bcmc8MT4oKSk7Ci0gICAgRVhQRUNUX0NBTEwodHJhbnNwb3J0LCBSZWFkKF8sIF8pKS5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIklORk90aGlzIGlzIGFuIGluZm8gbGluZSIpKSk7Ci0gICAgRVhQRUNUX0NBTEwodHJhbnNwb3J0LCBSZWFkKF8sIF8pKS5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIk9LQVkiKSkpOworICAgIEVYUEVDVF9DQUxMKCp0cmFuc3BvcnQsIFJlYWQoXywgXykpLldpbGxPbmNlKEludm9rZShDb3B5RGF0YSgiSU5GT3RoaXMgaXMgYW4gaW5mbyBsaW5lIikpKTsKKyAgICBFWFBFQ1RfQ0FMTCgqdHJhbnNwb3J0LCBSZWFkKF8sIF8pKS5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIk9LQVkiKSkpOwogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluZm87CiAgICAgQVNTRVJUX0VRKGRyaXZlci5SYXdDb21tYW5kKCJvZW0gZG1lc2ciLCAiIiwgbnVsbHB0ciwgJmluZm8pLCBTVUNDRVNTKSA8PCBkcml2ZXIuRXJyb3IoKTsKQEAgLTYwLDI4ICs2MywyOSBAQAogfQogCiBURVNUX0YoRHJpdmVyVGVzdCwgVGV4dE1lc3NhZ2UpIHsKLSAgICBNb2NrVHJhbnNwb3J0IHRyYW5zcG9ydDsKICAgICBzdGQ6OnN0cmluZyB0ZXh0OworICAgIHN0ZDo6dW5pcXVlX3B0cjxNb2NrVHJhbnNwb3J0PiB0cmFuc3BvcnRfcG9pbnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ja1RyYW5zcG9ydD4oKTsKKyAgICBNb2NrVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSB0cmFuc3BvcnRfcG9pbnRlci5nZXQoKTsKIAogICAgIERyaXZlckNhbGxiYWNrcyBjYWxsYmFja3N7W10oY29uc3Qgc3RkOjpzdHJpbmcmKSB7fSwgW10oaW50KSB7fSwgW10oY29uc3Qgc3RkOjpzdHJpbmcmKSB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmdGV4dF0oY29uc3Qgc3RkOjpzdHJpbmcmIGV4dHJhX3RleHQpIHsgdGV4dCArPSBleHRyYV90ZXh0OyB9fTsKIAotICAgIEZhc3RCb290RHJpdmVyIGRyaXZlcigmdHJhbnNwb3J0LCBjYWxsYmFja3MpOworICAgIEZhc3RCb290RHJpdmVyIGRyaXZlcihzdGQ6Om1vdmUodHJhbnNwb3J0X3BvaW50ZXIpLCBjYWxsYmFja3MpOwogCi0gICAgRVhQRUNUX0NBTEwodHJhbnNwb3J0LCBXcml0ZShfLCBfKSkKKyAgICBFWFBFQ1RfQ0FMTCgqdHJhbnNwb3J0LCBXcml0ZShfLCBfKSkKICAgICAgICAgICAgIC5XaXRoKEFsbEFyZ3MoUmF3RGF0YSgib2VtIHRydXN0eSBydW50ZXN0IHRydXN0eS5od2Flcy5iZW5jaCIpKSkKICAgICAgICAgICAgIC5XaWxsT25jZShSZXR1cm5Bcmc8MT4oKSk7Ci0gICAgRVhQRUNUX0NBTEwodHJhbnNwb3J0LCBSZWFkKF8sIF8pKS5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIlRFWFR0aGlzIGlzIGEgdGV4dCBsaW5lIikpKTsKLSAgICBFWFBFQ1RfQ0FMTCh0cmFuc3BvcnQsIFJlYWQoXywgXykpCisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgUmVhZChfLCBfKSkuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJURVhUdGhpcyBpcyBhIHRleHQgbGluZSIpKSk7CisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgUmVhZChfLCBfKSkKICAgICAgICAgICAgIC5XaWxsT25jZShJbnZva2UoCiAgICAgICAgICAgICAgICAgICAgIENvcHlEYXRhKCJURVhULCBhbGJlaXQgdmVyeSBsb25nIGFuZCBzcGxpdCBvdmVyIG11bHRpcGxlIFRFWFQgbWVzc2FnZXMuIikpKTsKLSAgICBFWFBFQ1RfQ0FMTCh0cmFuc3BvcnQsIFJlYWQoXywgXykpCisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgUmVhZChfLCBfKSkKICAgICAgICAgICAgIC5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIlRFWFQgSW5kZWVkIHdlIGNhbiBkbyB0aGF0IG5vdyB3aXRoIGEgVEVYVCBtZXNzYWdlIHdoZW5ldmVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlIGZlZWwgbGlrZSBpdC4iKSkpOwotICAgIEVYUEVDVF9DQUxMKHRyYW5zcG9ydCwgUmVhZChfLCBfKSkKKyAgICBFWFBFQ1RfQ0FMTCgqdHJhbnNwb3J0LCBSZWFkKF8sIF8pKQogICAgICAgICAgICAgLldpbGxPbmNlKEludm9rZShDb3B5RGF0YSgiVEVYVCBJc24ndCB0aGF0IHRydWx5IHN1cGVyIGNvb2w/IikpKTsKIAotICAgIEVYUEVDVF9DQUxMKHRyYW5zcG9ydCwgUmVhZChfLCBfKSkuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJPS0FZIikpKTsKKyAgICBFWFBFQ1RfQ0FMTCgqdHJhbnNwb3J0LCBSZWFkKF8sIF8pKS5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIk9LQVkiKSkpOwogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGluZm87CiAgICAgQVNTRVJUX0VRKGRyaXZlci5SYXdDb21tYW5kKCJvZW0gdHJ1c3R5IHJ1bnRlc3QgdHJ1c3R5Lmh3YWVzLmJlbmNoIiwgIiIsIG51bGxwdHIsICZpbmZvKSwKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Zhc3Rib290X2ludGVncmF0aW9uX3Rlc3QueG1sIGIvZmFzdGJvb3QvZmFzdGJvb3RfaW50ZWdyYXRpb25fdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNGNhYgotLS0gL2Rldi9udWxsCisrKyBiL2Zhc3Rib290L2Zhc3Rib290X2ludGVncmF0aW9uX3Rlc3QueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIHRvIHJ1biBmYXN0Ym9vdCBpbnRlZ3JhdGlvbiB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImZhc3Rib290X3VuaXR0ZXN0cyIgLz4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUucHl0aG9uLlB5dGhvbkJpbmFyeUhvc3RUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFyLWZpbGUtbmFtZSIgdmFsdWU9ImZhc3Rib290X2ludGVncmF0aW9uX3Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMW0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2ZpbGVzeXN0ZW0uaCBiL2Zhc3Rib290L2ZpbGVzeXN0ZW0uaAppbmRleCA1ZjQxZmJjLi5jNWY5Yzk0IDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9maWxlc3lzdGVtLmgKKysrIGIvZmFzdGJvb3QvZmlsZXN5c3RlbS5oCkBAIC0zMSw2ICszMSw3IEBACiAjZW5kaWYKIAogc3RkOjpzdHJpbmcgR2V0SG9tZURpclBhdGgoKTsKK2Jvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiBib29sIEVuc3VyZURpcmVjdG9yeUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZGlyZWN0b3J5X3BhdGgpOwogCiBjbGFzcyBGaWxlTG9jayB7CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9mdXp6eV9mYXN0Ym9vdC9maXh0dXJlcy5jcHAgYi9mYXN0Ym9vdC9mdXp6eV9mYXN0Ym9vdC9maXh0dXJlcy5jcHAKaW5kZXggOWI1ZTVmNy4uOTRhNTNlZCAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZnV6enlfZmFzdGJvb3QvZml4dHVyZXMuY3BwCisrKyBiL2Zhc3Rib290L2Z1enp5X2Zhc3Rib290L2ZpeHR1cmVzLmNwcApAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICAgICAgICByZXR1cm4gTWF0Y2hGYXN0Ym9vdChpbmZvLCBkZXZpY2Vfc2VyaWFsKTsKICAgICAgICAgfTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVVNCX1RSSUVTICYmICF0cmFuc3BvcnQ7IGkrKykgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFVzYlRyYW5zcG9ydD4gdXNiKHVzYl9vcGVuKG1hdGNoZXIsIFVTQl9USU1FT1VUKSk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VXNiVHJhbnNwb3J0PiB1c2IgPSB1c2Jfb3BlbihtYXRjaGVyLCBVU0JfVElNRU9VVCk7CiAgICAgICAgICAgICBpZiAodXNiKQogICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnRTbmlmZmVyPigKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc3BvcnRTbmlmZmVyKHN0ZDo6bW92ZSh1c2IpLCBzZXJpYWxfcG9ydCkpOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQVNTRVJUX0VRKGRldmljZV9wYXRoLCBjYl9zY3JhdGNoKTsgIC8vIFRoZSBwYXRoIGNhbiBub3QgY2hhbmdlCiAgICAgfQotICAgIGZiID0gc3RkOjp1bmlxdWVfcHRyPEZhc3RCb290RHJpdmVyPihuZXcgRmFzdEJvb3REcml2ZXIodHJhbnNwb3J0LmdldCgpLCB7fSwgdHJ1ZSkpOworICAgIGZiID0gc3RkOjp1bmlxdWVfcHRyPEZhc3RCb290RHJpdmVyPihuZXcgRmFzdEJvb3REcml2ZXIoc3RkOjptb3ZlKHRyYW5zcG9ydCksIHt9LCB0cnVlKSk7CiAgICAgLy8gTm8gZXJyb3IgY2hlY2tpbmcgc2luY2Ugbm9uLUEvQiBkZXZpY2VzIG1heSBub3Qgc3VwcG9ydCB0aGUgY29tbWFuZAogICAgIGZiLT5HZXRWYXIoImN1cnJlbnQtc2xvdCIsICZpbml0aWFsX3Nsb3QpOwogfQpAQCAtMjAwLDcgKzIwMCw3IEBACiAgICAgaWYgKElzRmFzdGJvb3RPdmVyVGNwKCkpIHsKICAgICAgICAgQ29ubmVjdFRjcEZhc3Rib290RGV2aWNlKCk7CiAgICAgICAgIGRldmljZV9wYXRoID0gY2Jfc2NyYXRjaDsKLSAgICAgICAgZmIgPSBzdGQ6OnVuaXF1ZV9wdHI8RmFzdEJvb3REcml2ZXI+KG5ldyBGYXN0Qm9vdERyaXZlcih0cmFuc3BvcnQuZ2V0KCksIHt9LCB0cnVlKSk7CisgICAgICAgIGZiID0gc3RkOjp1bmlxdWVfcHRyPEZhc3RCb290RHJpdmVyPihuZXcgRmFzdEJvb3REcml2ZXIoc3RkOjptb3ZlKHRyYW5zcG9ydCksIHt9LCB0cnVlKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgICAgICByZXR1cm4gTWF0Y2hGYXN0Ym9vdChpbmZvLCBkZXZpY2Vfc2VyaWFsKTsKICAgICB9OwogICAgIHdoaWxlICghdHJhbnNwb3J0KSB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxVc2JUcmFuc3BvcnQ+IHVzYih1c2Jfb3BlbihtYXRjaGVyLCBVU0JfVElNRU9VVCkpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VXNiVHJhbnNwb3J0PiB1c2IgPSB1c2Jfb3BlbihtYXRjaGVyLCBVU0JfVElNRU9VVCk7CiAgICAgICAgIGlmICh1c2IpIHsKICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnRTbmlmZmVyPigKICAgICAgICAgICAgICAgICAgICAgbmV3IFRyYW5zcG9ydFNuaWZmZXIoc3RkOjptb3ZlKHVzYiksIHNlcmlhbF9wb3J0KSk7CkBAIC0yMjAsNyArMjIwLDcgQEAKICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDFzKTsKICAgICB9CiAgICAgZGV2aWNlX3BhdGggPSBjYl9zY3JhdGNoOwotICAgIGZiID0gc3RkOjp1bmlxdWVfcHRyPEZhc3RCb290RHJpdmVyPihuZXcgRmFzdEJvb3REcml2ZXIodHJhbnNwb3J0LmdldCgpLCB7fSwgdHJ1ZSkpOworICAgIGZiID0gc3RkOjp1bmlxdWVfcHRyPEZhc3RCb290RHJpdmVyPihuZXcgRmFzdEJvb3REcml2ZXIoc3RkOjptb3ZlKHRyYW5zcG9ydCksIHt9LCB0cnVlKSk7CiB9CiAKIHZvaWQgRmFzdEJvb3RUZXN0OjpTZXRMb2NrU3RhdGUoYm9vbCB1bmxvY2ssIGJvb2wgYXNzZXJ0X2NoYW5nZSkgewpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZnV6enlfZmFzdGJvb3QvbWFpbi5jcHAgYi9mYXN0Ym9vdC9mdXp6eV9mYXN0Ym9vdC9tYWluLmNwcAppbmRleCBlNjM1OTM3Li43OWYzOTM5IDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9mdXp6eV9mYXN0Ym9vdC9tYWluLmNwcAorKysgYi9mYXN0Ym9vdC9mdXp6eV9mYXN0Ym9vdC9tYWluLmNwcApAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgogCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyLmgiCiAjaW5jbHVkZSAidXNiLmgiCiAKQEAgLTE2NiwxNiArMTY3LDE1IEBACiAgICAgY29uc3QgYXV0byBtYXRjaGVyID0gW10odXNiX2lmY19pbmZvKiBpbmZvKSAtPiBpbnQgewogICAgICAgICByZXR1cm4gRmFzdEJvb3RUZXN0OjpNYXRjaEZhc3Rib290KGluZm8sIGZhc3Rib290OjpGYXN0Qm9vdFRlc3Q6OmRldmljZV9zZXJpYWwpOwogICAgIH07Ci0gICAgVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSBudWxscHRyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZhc3RCb290VGVzdDo6TUFYX1VTQl9UUklFUyAmJiAhdHJhbnNwb3J0OyBpKyspIHsKICAgICAgICAgdHJhbnNwb3J0ID0gdXNiX29wZW4obWF0Y2hlcik7CiAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwKSk7CiAgICAgfQotICAgIEFTU0VSVF9ORSh0cmFuc3BvcnQsIG51bGxwdHIpIDw8ICJDb3VsZCBub3QgZmluZCB0aGUgZmFzdGJvb3QgZGV2aWNlIGFmdGVyOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTAgKiBGYXN0Qm9vdFRlc3Q6Ok1BWF9VU0JfVFJJRVMgPDwgIm1zIjsKKyAgICBBU1NFUlRfTkUodHJhbnNwb3J0LmdldCgpLCBudWxscHRyKSA8PCAiQ291bGQgbm90IGZpbmQgdGhlIGZhc3Rib290IGRldmljZSBhZnRlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDEwICogRmFzdEJvb3RUZXN0OjpNQVhfVVNCX1RSSUVTIDw8ICJtcyI7CiAgICAgaWYgKHRyYW5zcG9ydCkgewogICAgICAgICB0cmFuc3BvcnQtPkNsb3NlKCk7Ci0gICAgICAgIGRlbGV0ZSB0cmFuc3BvcnQ7CiAgICAgfQogfQogCkBAIC05MjksOCArOTI5LDcgQEAKIAogICAgIEFTU0VSVF9UUlVFKFVzYlN0aWxsQXZhaWxpYmxlKCkpIDw8IFVTQl9QT1JUX0dPTkU7CiAgICAgc3RkOjpzdHJpbmcgcmVzcDsKLSAgICBFWFBFQ1RfRVEoZmItPkdldFZhcigicHJvZHVjdCIsICZyZXNwKSwgU1VDQ0VTUykKLSAgICAgICAgICAgICAgICA8PCAiRGV2aWNlIGlzIHVucmVzcG9uc2l2ZSB0byBnZXR2YXIgY29tbWFuZCI7CisgICAgRVhQRUNUX0VRKGZiLT5HZXRWYXIoInByb2R1Y3QiLCAmcmVzcCksIFNVQ0NFU1MpIDw8ICJEZXZpY2UgaXMgdW5yZXNwb25zaXZlIHRvIGdldHZhciBjb21tYW5kIjsKIH0KIAogVEVTVF9GKEZ1enosIENvbW1hbmRUb29MYXJnZSkgewpAQCAtOTg2LDExICs5ODUsMTAgQEAKIFRFU1RfRihGdXp6LCBTcGFyc2VaZXJvQmxrU2l6ZSkgewogICAgIC8vIGhhbmRjcmFmdGVkIG1hbGZvcm0gc3BhcnNlIGZpbGUgd2l0aCB6ZXJvIGFzIGJsb2NrIHNpemUKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiBidWYgPSB7Ci0gICAgICAgICdceDNhJywgJ1x4ZmYnLCAnXHgyNicsICdceGVkJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgxYycsICdceDAwJywgJ1x4MGMnLCAnXHgwMCcsCi0gICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsCi0gICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4YzInLCAnXHhjYScsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsCi0gICAgICAgICdceDEwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MTEnLCAnXHgyMicsICdceDMzJywgJ1x4NDQnCi0gICAgfTsKKyAgICAgICAgICAgICdceDNhJywgJ1x4ZmYnLCAnXHgyNicsICdceGVkJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgxYycsICdceDAwJywgJ1x4MGMnLAorICAgICAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsCisgICAgICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHhjMicsICdceGNhJywgJ1x4MDAnLCAnXHgwMCcsICdceDAxJywKKyAgICAgICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDEwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MTEnLCAnXHgyMicsICdceDMzJywgJ1x4NDQnfTsKIAogICAgIEFTU0VSVF9FUShEb3dubG9hZENvbW1hbmQoYnVmLnNpemUoKSksIFNVQ0NFU1MpIDw8ICJEZXZpY2UgcmVqZWN0ZWQgZG93bmxvYWQgY29tbWFuZCI7CiAgICAgQVNTRVJUX0VRKFNlbmRCdWZmZXIoYnVmKSwgU1VDQ0VTUykgPDwgIkRvd25sb2FkaW5nIHBheWxvYWQgZmFpbGVkIjsKQEAgLTEwMDUsMTMgKzEwMDMsMTAgQEAKIFRFU1RfRihGdXp6LCBTcGFyc2VWZXJ5TGFyZ2VCbGtTaXplKSB7CiAgICAgLy8gaGFuZGNyYWZ0ZWQgc3BhcnNlIGZpbGUgd2l0aCBibG9jayBzaXplIG9mIH40R0IgYW5kIGRpdmlzaWJsZSA0CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmID0gewotICAgICAgICAnXHgzYScsICdceGZmJywgJ1x4MjYnLCAnXHhlZCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywKLSAgICAgICAgJ1x4MWMnLCAnXHgwMCcsICdceDBjJywgJ1x4MDAnLCAnXHhGMCcsICdceEZGJywgJ1x4RkYnLCAnXHhGRicsCi0gICAgICAgICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLAotICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceGMzJywgJ1x4Y2EnLCAnXHgwMCcsICdceDAwJywKLSAgICAgICAgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwYycsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsCi0gICAgICAgICdceDExJywgJ1x4MjInLCAnXHgzMycsICdceDQ0JwotICAgIH07CisgICAgICAgICAgICAnXHgzYScsICdceGZmJywgJ1x4MjYnLCAnXHhlZCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MWMnLCAnXHgwMCcsICdceDBjJywKKyAgICAgICAgICAgICdceDAwJywgJ1x4RjAnLCAnXHhGRicsICdceEZGJywgJ1x4RkYnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAxJywgJ1x4MDAnLAorICAgICAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4YzMnLCAnXHhjYScsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsCisgICAgICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwYycsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDExJywgJ1x4MjInLCAnXHgzMycsICdceDQ0J307CiAKICAgICBBU1NFUlRfRVEoRG93bmxvYWRDb21tYW5kKGJ1Zi5zaXplKCkpLCBTVUNDRVNTKSA8PCAiRGV2aWNlIHJlamVjdGVkIGRvd25sb2FkIGNvbW1hbmQiOwogICAgIEFTU0VSVF9FUShTZW5kQnVmZmVyKGJ1ZiksIFNVQ0NFU1MpIDw8ICJEb3dubG9hZGluZyBwYXlsb2FkIGZhaWxlZCI7CkBAIC0xMDIyLDExICsxMDE3LDEwIEBACiBURVNUX0YoRnV6eiwgU3BhcnNlVHJpbW1lZCkgewogICAgIC8vIGhhbmRjcmFmdGVkIG1hbGZvcm0gc3BhcnNlIGZpbGUgd2hpY2ggaXMgdHJpbW1lZAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZiA9IHsKLSAgICAgICAgJ1x4M2EnLCAnXHhmZicsICdceDI2JywgJ1x4ZWQnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDFjJywgJ1x4MDAnLCAnXHgwYycsICdceDAwJywKLSAgICAgICAgJ1x4MDAnLCAnXHgxMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDgnLCAnXHgwMCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywKLSAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHhjMScsICdceGNhJywgJ1x4MDAnLCAnXHgwMCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywKLSAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4ODAnLCAnXHgxMScsICdceDIyJywgJ1x4MzMnLCAnXHg0NCcKLSAgICB9OworICAgICAgICAgICAgJ1x4M2EnLCAnXHhmZicsICdceDI2JywgJ1x4ZWQnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDFjJywgJ1x4MDAnLCAnXHgwYycsCisgICAgICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MTAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDA4JywgJ1x4MDAnLCAnXHgwMScsICdceDAwJywKKyAgICAgICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceGMxJywgJ1x4Y2EnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLAorICAgICAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4ODAnLCAnXHgxMScsICdceDIyJywgJ1x4MzMnLCAnXHg0NCd9OwogCiAgICAgQVNTRVJUX0VRKERvd25sb2FkQ29tbWFuZChidWYuc2l6ZSgpKSwgU1VDQ0VTUykgPDwgIkRldmljZSByZWplY3RlZCBkb3dubG9hZCBjb21tYW5kIjsKICAgICBBU1NFUlRfRVEoU2VuZEJ1ZmZlcihidWYpLCBTVUNDRVNTKSA8PCAiRG93bmxvYWRpbmcgcGF5bG9hZCBmYWlsZWQiOwpAQCAtMTA0MSwxMSArMTAzNSwxMCBAQAogVEVTVF9GKEZ1enosIFNwYXJzZUludmFsaWRDaHVyaykgewogICAgIC8vIGhhbmRjcmFmdGVkIG1hbGZvcm0gc3BhcnNlIGZpbGUgd2l0aCBpbnZhbGlkIGNodXJrCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmID0gewotICAgICAgICAnXHgzYScsICdceGZmJywgJ1x4MjYnLCAnXHhlZCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MWMnLCAnXHgwMCcsICdceDBjJywgJ1x4MDAnLAotICAgICAgICAnXHgwMCcsICdceDEwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwOCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLAotICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceGMxJywgJ1x4Y2EnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLAotICAgICAgICAnXHgxMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDExJywgJ1x4MjInLCAnXHgzMycsICdceDQ0JwotICAgIH07CisgICAgICAgICAgICAnXHgzYScsICdceGZmJywgJ1x4MjYnLCAnXHhlZCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MWMnLCAnXHgwMCcsICdceDBjJywKKyAgICAgICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgxMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDgnLCAnXHgwMCcsICdceDAxJywgJ1x4MDAnLAorICAgICAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4YzEnLCAnXHhjYScsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsCisgICAgICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgxMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDExJywgJ1x4MjInLCAnXHgzMycsICdceDQ0J307CiAKICAgICBBU1NFUlRfRVEoRG93bmxvYWRDb21tYW5kKGJ1Zi5zaXplKCkpLCBTVUNDRVNTKSA8PCAiRGV2aWNlIHJlamVjdGVkIGRvd25sb2FkIGNvbW1hbmQiOwogICAgIEFTU0VSVF9FUShTZW5kQnVmZmVyKGJ1ZiksIFNVQ0NFU1MpIDw8ICJEb3dubG9hZGluZyBwYXlsb2FkIGZhaWxlZCI7CkBAIC0xODk1LDkgKzE4ODgsMTAgQEAKICAgICBpZiAoIWZhc3Rib290OjpGYXN0Qm9vdFRlc3Q6OklzRmFzdGJvb3RPdmVyVGNwKCkpIHsKICAgICAgICAgcHJpbnRmKCI8V2FpdGluZyBmb3IgRGV2aWNlPlxuIik7CiAgICAgICAgIGNvbnN0IGF1dG8gbWF0Y2hlciA9IFtdKHVzYl9pZmNfaW5mbyogaW5mbykgLT4gaW50IHsKLSAgICAgICAgICAgIHJldHVybiBmYXN0Ym9vdDo6RmFzdEJvb3RUZXN0OjpNYXRjaEZhc3Rib290KGluZm8sIGZhc3Rib290OjpGYXN0Qm9vdFRlc3Q6OmRldmljZV9zZXJpYWwpOworICAgICAgICAgICAgcmV0dXJuIGZhc3Rib290OjpGYXN0Qm9vdFRlc3Q6Ok1hdGNoRmFzdGJvb3QoaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3Rib290OjpGYXN0Qm9vdFRlc3Q6OmRldmljZV9zZXJpYWwpOwogICAgICAgICB9OwotICAgICAgICBUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IG51bGxwdHI7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKICAgICAgICAgd2hpbGUgKCF0cmFuc3BvcnQpIHsKICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHVzYl9vcGVuKG1hdGNoZXIpOwogICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTApKTsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3N0b3JhZ2UuY3BwIGIvZmFzdGJvb3Qvc3RvcmFnZS5jcHAKaW5kZXggZDZlMDBjZi4uNjI5ZWJjOCAxMDA2NDQKLS0tIGEvZmFzdGJvb3Qvc3RvcmFnZS5jcHAKKysrIGIvZmFzdGJvb3Qvc3RvcmFnZS5jcHAKQEAgLTE4LDI5ICsxOCwyNSBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAKICNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgogCiAjaW5jbHVkZSAic3RvcmFnZS5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAogQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2U6OkNvbm5lY3RlZERldmljZXNTdG9yYWdlKCkgewotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGhvbWVfcGF0aCA9IEdldEhvbWVEaXJQYXRoKCk7Ci0gICAgaWYgKGhvbWVfcGF0aC5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBob21lX2Zhc3Rib290X3BhdGggPSBob21lX3BhdGggKyBrUGF0aFNlcGFyYXRvciArICIuZmFzdGJvb3QiOwotCi0gICAgaWYgKCFFbnN1cmVEaXJlY3RvcnlFeGlzdHMoaG9tZV9mYXN0Ym9vdF9wYXRoKSkgewotICAgICAgICBMT0coRkFUQUwpIDw8ICJDYW5ub3QgY3JlYXRlIGRpcmVjdG9yeTogIiA8PCBob21lX2Zhc3Rib290X3BhdGg7Ci0gICAgfQorICAgIGhvbWVfZmFzdGJvb3RfcGF0aF8gPSBHZXRIb21lRGlyUGF0aCgpICsga1BhdGhTZXBhcmF0b3IgKyAiLmZhc3Rib290IjsKKyAgICBkZXZpY2VzX3BhdGhfID0gaG9tZV9mYXN0Ym9vdF9wYXRoXyArIGtQYXRoU2VwYXJhdG9yICsgImRldmljZXMiOwogCiAgICAgLy8gV2UncmUgdXNpbmcgYSBzZXBhcmF0ZSBmaWxlIGZvciBsb2NraW5nIGJlY2F1c2UgdGhlIFdpbmRvd3MgTG9ja0ZpbGVFeCBkb2VzIG5vdAogICAgIC8vIHBlcm1pdCBvcGVuaW5nIGEgZmlsZSBzdHJlYW0gZm9yIHRoZSBsb2NrZWQgZmlsZSwgZXZlbiB3aXRoaW4gdGhlIHNhbWUgcHJvY2Vzcy4gU28sCiAgICAgLy8gd2UgaGF2ZSB0byB1c2UgZmQgb3IgaGFuZGxlIEFQSSB0byBtYW5pcHVsYXRlIHRoZSBzdG9yYWdlIGZpbGVzLCB3aGljaCBtYWtlcyBpdAogICAgIC8vIG5lYXJseSBpbXBvc3NpYmxlIHRvIGZ1bGx5IHJld3JpdGUgYSBmaWxlIGNvbnRlbnQgd2l0aG91dCBoYXZpbmcgdG8gcmVjcmVhdGUgaXQuCiAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBub3QgYW4gb3B0aW9uIGR1cmluZyBob2xkaW5nIGEgbG9jay4KLSAgICBkZXZpY2VzX3BhdGhfID0gaG9tZV9mYXN0Ym9vdF9wYXRoICsga1BhdGhTZXBhcmF0b3IgKyAiZGV2aWNlcyI7Ci0gICAgZGV2aWNlc19sb2NrX3BhdGhfID0gaG9tZV9mYXN0Ym9vdF9wYXRoICsga1BhdGhTZXBhcmF0b3IgKyAiZGV2aWNlcy5sb2NrIjsKKyAgICBkZXZpY2VzX2xvY2tfcGF0aF8gPSBob21lX2Zhc3Rib290X3BhdGhfICsga1BhdGhTZXBhcmF0b3IgKyAiZGV2aWNlcy5sb2NrIjsKK30KKworYm9vbCBDb25uZWN0ZWREZXZpY2VzU3RvcmFnZTo6RXhpc3RzKCkgY29uc3QgeworICAgIHJldHVybiBGaWxlRXhpc3RzKGRldmljZXNfcGF0aF8pOwogfQogCiB2b2lkIENvbm5lY3RlZERldmljZXNTdG9yYWdlOjpXcml0ZURldmljZXMoY29uc3QgRmlsZUxvY2smLCBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGRldmljZXMpIHsKQEAgLTYzLDUgKzU5LDggQEAKIH0KIAogRmlsZUxvY2sgQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2U6OkxvY2soKSBjb25zdCB7CisgICAgaWYgKCFFbnN1cmVEaXJlY3RvcnlFeGlzdHMoaG9tZV9mYXN0Ym9vdF9wYXRoXykpIHsKKyAgICAgICAgTE9HKEZBVEFMKSA8PCAiQ2Fubm90IGNyZWF0ZSBkaXJlY3Rvcnk6ICIgPDwgaG9tZV9mYXN0Ym9vdF9wYXRoXzsKKyAgICB9CiAgICAgcmV0dXJuIEZpbGVMb2NrKGRldmljZXNfbG9ja19wYXRoXyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvZmFzdGJvb3Qvc3RvcmFnZS5oIGIvZmFzdGJvb3Qvc3RvcmFnZS5oCmluZGV4IDBjYzNkODYuLmFlOWQ4NDYgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L3N0b3JhZ2UuaAorKysgYi9mYXN0Ym9vdC9zdG9yYWdlLmgKQEAgLTI0LDEzICsyNCwxNSBAQAogY2xhc3MgQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2UgewogICBwdWJsaWM6CiAgICAgQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2UoKTsKKworICAgIGJvb2wgRXhpc3RzKCkgY29uc3Q7CiAgICAgdm9pZCBXcml0ZURldmljZXMoY29uc3QgRmlsZUxvY2smLCBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGRldmljZXMpOwogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBSZWFkRGV2aWNlcyhjb25zdCBGaWxlTG9jayYpOwogICAgIHZvaWQgQ2xlYXIoY29uc3QgRmlsZUxvY2smKTsKLQogICAgIEZpbGVMb2NrIExvY2soKSBjb25zdDsKIAogICBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIGhvbWVfZmFzdGJvb3RfcGF0aF87CiAgICAgc3RkOjpzdHJpbmcgZGV2aWNlc19wYXRoXzsKICAgICBzdGQ6OnN0cmluZyBkZXZpY2VzX2xvY2tfcGF0aF87CiB9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3Rhc2suY3BwIGIvZmFzdGJvb3QvdGFzay5jcHAKaW5kZXggMDU0YzFlZC4uZWE3OGEwMSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdGFzay5jcHAKKysrIGIvZmFzdGJvb3QvdGFzay5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKIC8vCiAjaW5jbHVkZSAidGFzay5oIgogCi0jaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgpAQCAtMjYsMTMgKzI2LDIzIEBACiAjaW5jbHVkZSAidXRpbC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7Ci1GbGFzaFRhc2s6OkZsYXNoVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgX3Nsb3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfcG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGFwcGx5X3ZibWV0YSkKLSAgICA6IHBuYW1lXyhfcG5hbWUpLCBmbmFtZV8oX2ZuYW1lKSwgc2xvdF8oX3Nsb3QpLCBhcHBseV92Ym1ldGFfKGFwcGx5X3ZibWV0YSkge30KK0ZsYXNoVGFzazo6Rmxhc2hUYXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90LCBjb25zdCBzdGQ6OnN0cmluZyYgcG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYXBwbHlfdmJtZXRhLCBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKQorICAgIDogcG5hbWVfKHBuYW1lKSwgZm5hbWVfKGZuYW1lKSwgc2xvdF8oc2xvdCksIGFwcGx5X3ZibWV0YV8oYXBwbHlfdmJtZXRhKSwgZnBfKGZwKSB7fQorCitib29sIEZsYXNoVGFzazo6SXNEeW5hbWljUGFydGl0aW9uKGNvbnN0IEltYWdlU291cmNlKiBzb3VyY2UsIGNvbnN0IEZsYXNoVGFzayogdGFzaykgeworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGNvbnRlbnRzOworICAgIGlmICghc291cmNlLT5SZWFkRmlsZSgic3VwZXJfZW1wdHkuaW1nIiwgJmNvbnRlbnRzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gbWV0YWRhdGEgPSBhbmRyb2lkOjpmc19tZ3I6OlJlYWRGcm9tSW1hZ2VCbG9iKGNvbnRlbnRzLmRhdGEoKSwgY29udGVudHMuc2l6ZSgpKTsKKyAgICByZXR1cm4gc2hvdWxkX2ZsYXNoX2luX3VzZXJzcGFjZSgqbWV0YWRhdGEuZ2V0KCksIHRhc2stPkdldFBhcnRpdGlvbkFuZFNsb3QoKSk7Cit9CiAKIHZvaWQgRmxhc2hUYXNrOjpSdW4oKSB7CiAgICAgYXV0byBmbGFzaCA9IFsmXShjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uKSB7Ci0gICAgICAgIGlmIChzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKHBhcnRpdGlvbikgJiYgIWlzX3VzZXJzcGFjZV9mYXN0Ym9vdCgpKSB7CisgICAgICAgIGlmIChzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKGZwXy0+c291cmNlLmdldCgpLCBwYXJ0aXRpb24pICYmICFpc191c2Vyc3BhY2VfZmFzdGJvb3QoKSAmJgorICAgICAgICAgICAgIWZwXy0+Zm9yY2VfZmxhc2gpIHsKICAgICAgICAgICAgIGRpZSgiVGhlIHBhcnRpdGlvbiB5b3UgYXJlIHRyeWluZyB0byBmbGFzaCBpcyBkeW5hbWljLCBhbmQgIgogICAgICAgICAgICAgICAgICJzaG91bGQgYmUgZmxhc2hlZCB2aWEgZmFzdGJvb3RkLiBQbGVhc2UgcnVuOlxuIgogICAgICAgICAgICAgICAgICJcbiIKQEAgLTQxLDEyICs1MSwyMCBAQAogICAgICAgICAgICAgICAgICJBbmQgdHJ5IGFnYWluLiBJZiB5b3UgYXJlIGludGVudGlvbmFsbHkgdHJ5aW5nIHRvICIKICAgICAgICAgICAgICAgICAib3ZlcndyaXRlIGEgZml4ZWQgcGFydGl0aW9uLCB1c2UgLS1mb3JjZS4iKTsKICAgICAgICAgfQotICAgICAgICBkb19mbGFzaChwYXJ0aXRpb24uY19zdHIoKSwgZm5hbWVfLmNfc3RyKCksIGFwcGx5X3ZibWV0YV8pOworICAgICAgICBkb19mbGFzaChwYXJ0aXRpb24uY19zdHIoKSwgZm5hbWVfLmNfc3RyKCksIGFwcGx5X3ZibWV0YV8sIGZwXyk7CiAgICAgfTsKICAgICBkb19mb3JfcGFydGl0aW9ucyhwbmFtZV8sIHNsb3RfLCBmbGFzaCwgdHJ1ZSk7CiB9CiAKLXN0ZDo6c3RyaW5nIEZsYXNoVGFzazo6R2V0UGFydGl0aW9uQW5kU2xvdCgpIHsKK3N0ZDo6c3RyaW5nIEZsYXNoVGFzazo6VG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgYXBwbHlfdmJtZXRhX3N0cmluZyA9ICIiOworICAgIGlmIChhcHBseV92Ym1ldGFfKSB7CisgICAgICAgIGFwcGx5X3ZibWV0YV9zdHJpbmcgPSAiIC0tYXBwbHlfdmJtZXRhIjsKKyAgICB9CisgICAgcmV0dXJuICJmbGFzaCIgKyBhcHBseV92Ym1ldGFfc3RyaW5nICsgIiAiICsgcG5hbWVfICsgIiAiICsgZm5hbWVfOworfQorCitzdGQ6OnN0cmluZyBGbGFzaFRhc2s6OkdldFBhcnRpdGlvbkFuZFNsb3QoKSBjb25zdCB7CiAgICAgYXV0byBzbG90ID0gc2xvdF87CiAgICAgaWYgKHNsb3QuZW1wdHkoKSkgewogICAgICAgICBzbG90ID0gZ2V0X2N1cnJlbnRfc2xvdCgpOwpAQCAtNjUsNyArODMsNyBAQAogICAgIDogcmVib290X3RhcmdldF8ocmVib290X3RhcmdldCksIGZwXyhmcCl7fTsKIAogdm9pZCBSZWJvb3RUYXNrOjpSdW4oKSB7Ci0gICAgaWYgKChyZWJvb3RfdGFyZ2V0XyA9PSAidXNlcnNwYWNlIiB8fCByZWJvb3RfdGFyZ2V0XyA9PSAiZmFzdGJvb3QiKSkgeworICAgIGlmIChyZWJvb3RfdGFyZ2V0XyA9PSAiZmFzdGJvb3QiKSB7CiAgICAgICAgIGlmICghaXNfdXNlcnNwYWNlX2Zhc3Rib290KCkpIHsKICAgICAgICAgICAgIHJlYm9vdF90b191c2Vyc3BhY2VfZmFzdGJvb3QoKTsKICAgICAgICAgICAgIGZwXy0+ZmItPldhaXRGb3JEaXNjb25uZWN0KCk7CkBAIC04NCwyMCArMTAyLDI2IEBACiAgICAgfQogfQogCi1GbGFzaFN1cGVyTGF5b3V0VGFzazo6Rmxhc2hTdXBlckxheW91dFRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIHN1cGVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN1cGVyRmxhc2hIZWxwZXI+IGhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VQdHIgc3BhcnNlX2xheW91dCwgdWludDY0X3Qgc3VwZXJfc2l6ZSkKK3N0ZDo6c3RyaW5nIFJlYm9vdFRhc2s6OlRvU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiAicmVib290ICIgKyByZWJvb3RfdGFyZ2V0XzsKK30KKworT3B0aW1pemVkRmxhc2hTdXBlclRhc2s6Ok9wdGltaXplZEZsYXNoU3VwZXJUYXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdXBlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdXBlckZsYXNoSGVscGVyPiBoZWxwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlUHRyIHNwYXJzZV9sYXlvdXQsIHVpbnQ2NF90IHN1cGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkKICAgICA6IHN1cGVyX25hbWVfKHN1cGVyX25hbWUpLAogICAgICAgaGVscGVyXyhzdGQ6Om1vdmUoaGVscGVyKSksCiAgICAgICBzcGFyc2VfbGF5b3V0XyhzdGQ6Om1vdmUoc3BhcnNlX2xheW91dCkpLAotICAgICAgc3VwZXJfc2l6ZV8oc3VwZXJfc2l6ZSkge30KKyAgICAgIHN1cGVyX3NpemVfKHN1cGVyX3NpemUpLAorICAgICAgZnBfKGZwKSB7fQogCi12b2lkIEZsYXNoU3VwZXJMYXlvdXRUYXNrOjpSdW4oKSB7Cit2b2lkIE9wdGltaXplZEZsYXNoU3VwZXJUYXNrOjpSdW4oKSB7CiAgICAgLy8gVXNlIHRoZSByZXBvcnRlZCBzdXBlciBwYXJ0aXRpb24gc2l6ZSBhcyB0aGUgdXBwZXIgbGltaXQsIHJhdGhlciB0aGFuCiAgICAgLy8gc3BhcnNlX2ZpbGVfbGVuLCB3aGljaCAoMSkgY2FuIGZhaWwgYW5kICgyKSBpcyBraW5kIG9mIGV4cGVuc2l2ZSwgc2luY2UKICAgICAvLyBpdCB3aWxsIG1hcCBpbiBhbGwgb2YgdGhlIGVtYmVkZGVkIGZkcy4KICAgICBzdGQ6OnZlY3RvcjxTcGFyc2VQdHI+IGZpbGVzOwotICAgIGlmIChpbnQgbGltaXQgPSBnZXRfc3BhcnNlX2xpbWl0KHN1cGVyX3NpemVfKSkgeworICAgIGlmIChpbnQgbGltaXQgPSBnZXRfc3BhcnNlX2xpbWl0KHN1cGVyX3NpemVfLCBmcF8pKSB7CiAgICAgICAgIGZpbGVzID0gcmVzcGFyc2VfZmlsZShzcGFyc2VfbGF5b3V0Xy5nZXQoKSwgbGltaXQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZpbGVzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoc3BhcnNlX2xheW91dF8pKTsKQEAgLTEwNyw3MyArMTMxLDQyIEBACiAgICAgZmxhc2hfcGFydGl0aW9uX2ZpbGVzKHN1cGVyX25hbWVfLCBmaWxlcyk7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxGbGFzaFN1cGVyTGF5b3V0VGFzaz4gRmxhc2hTdXBlckxheW91dFRhc2s6OkluaXRpYWxpemUoCi0gICAgICAgIGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsIHN0ZDo6dmVjdG9yPEltYWdlRW50cnk+JiBvc19pbWFnZXMpIHsKLSAgICBpZiAoIXN1cHBvcnRzX0FCKCkpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJDYW5ub3Qgb3B0aW1pemUgZmxhc2hpbmcgc3VwZXIgb24gbm9uLUFCIGRldmljZSI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBpZiAoZnAtPnNsb3Rfb3ZlcnJpZGUgPT0gImFsbCIpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJDYW5ub3Qgb3B0aW1pemUgZmxhc2hpbmcgc3VwZXIgZm9yIGFsbCBzbG90cyI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGR5bmFtaWMgcGFydGl0aW9ucyBhdCBhbGw/Ci0gICAgdW5pcXVlX2ZkIGZkID0gZnAtPnNvdXJjZS0+T3BlbkZpbGUoInN1cGVyX2VtcHR5LmltZyIpOwotCi0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgImNvdWxkIG5vdCBvcGVuIHN1cGVyX2VtcHR5LmltZyI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHN1cGVyX25hbWU7Ci0gICAgLy8gVHJ5IHRvIGZpbmQgd2hldGhlciB0aGVyZSBpcyBhIHN1cGVyIHBhcnRpdGlvbi4KLSAgICBpZiAoZnAtPmZiLT5HZXRWYXIoInN1cGVyLXBhcnRpdGlvbi1uYW1lIiwgJnN1cGVyX25hbWUpICE9IGZhc3Rib290OjpTVUNDRVNTKSB7Ci0gICAgICAgIHN1cGVyX25hbWUgPSAic3VwZXIiOwotICAgIH0KLQotICAgIHVpbnQ2NF90IHBhcnRpdGlvbl9zaXplOwotICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbl9zaXplX3N0cjsKLSAgICBpZiAoZnAtPmZiLT5HZXRWYXIoInBhcnRpdGlvbi1zaXplOiIgKyBzdXBlcl9uYW1lLCAmcGFydGl0aW9uX3NpemVfc3RyKSAhPSBmYXN0Ym9vdDo6U1VDQ0VTUykgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkNhbm5vdCBvcHRpbWl6ZSBzdXBlciBmbGFzaGluZzogY291bGQgbm90IGRldGVybWluZSBzdXBlciBwYXJ0aXRpb24iOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcGFydGl0aW9uX3NpemVfc3RyID0gZmJfZml4X251bWVyaWNfdmFyKHBhcnRpdGlvbl9zaXplX3N0cik7Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQocGFydGl0aW9uX3NpemVfc3RyLCAmcGFydGl0aW9uX3NpemUpKSB7Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQ291bGQgbm90IHBhcnNlICIgPDwgc3VwZXJfbmFtZSA8PCAiIHNpemU6ICIgPDwgcGFydGl0aW9uX3NpemVfc3RyOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3VwZXJGbGFzaEhlbHBlcj4gaGVscGVyID0gc3RkOjptYWtlX3VuaXF1ZTxTdXBlckZsYXNoSGVscGVyPigqZnAtPnNvdXJjZSk7Ci0gICAgaWYgKCFoZWxwZXItPk9wZW4oZmQpKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBvc19pbWFnZXMpIHsKLSAgICAgICAgYXV0byBwYXJ0aXRpb24gPSBHZXRQYXJ0aXRpb25OYW1lKGVudHJ5LCBmcC0+Y3VycmVudF9zbG90KTsKLSAgICAgICAgYXV0byBpbWFnZSA9IGVudHJ5LmZpcnN0OwotCi0gICAgICAgIGlmICghaGVscGVyLT5BZGRQYXJ0aXRpb24ocGFydGl0aW9uLCBpbWFnZS0+aW1nX25hbWUsIGltYWdlLT5vcHRpb25hbF9pZl9ub19pbWFnZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXV0byBzID0gaGVscGVyLT5HZXRTcGFyc2VMYXlvdXQoKTsKLSAgICBpZiAoIXMpIHJldHVybiBudWxscHRyOwotCi0gICAgLy8gUmVtb3ZlIGltYWdlcyB0aGF0IHdlIGFscmVhZHkgZmxhc2hlZCwganVzdCBpbiBjYXNlIHdlIGhhdmUgbm9uLWR5bmFtaWMgT1MgaW1hZ2VzLgotICAgIGF1dG8gcmVtb3ZlX2lmX2NhbGxiYWNrID0gWyZdKGNvbnN0IEltYWdlRW50cnkmIGVudHJ5KSAtPiBib29sIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlci0+V2lsbEZsYXNoKEdldFBhcnRpdGlvbk5hbWUoZW50cnksIGZwLT5jdXJyZW50X3Nsb3QpKTsKLSAgICB9OwotICAgIG9zX2ltYWdlcy5lcmFzZShzdGQ6OnJlbW92ZV9pZihvc19pbWFnZXMuYmVnaW4oKSwgb3NfaW1hZ2VzLmVuZCgpLCByZW1vdmVfaWZfY2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICBvc19pbWFnZXMuZW5kKCkpOwotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZsYXNoU3VwZXJMYXlvdXRUYXNrPihzdXBlcl9uYW1lLCBzdGQ6Om1vdmUoaGVscGVyKSwgc3RkOjptb3ZlKHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSk7CitzdGQ6OnN0cmluZyBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazo6VG9TdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICJvcHRpbWl6ZWQtZmxhc2gtc3VwZXIiOwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8Rmxhc2hTdXBlckxheW91dFRhc2s+IEZsYXNoU3VwZXJMYXlvdXRUYXNrOjpJbml0aWFsaXplRnJvbVRhc2tzKAorLy8gVGhpcyBsb29rcyBmb3IgYSBibG9jayB3aXRoaW4gdGFza3MgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIFtyZWJvb3QgZmFzdGJvb3QsCisvLyB1cGRhdGUtc3VwZXIsICRMSVNUX09GX0RZTkFNSUNfRkxBU0hfVEFTS1NdIGFuZCByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBmb3VuZC5UaGVvcmV0aWNhbGx5CisvLyB0aGlzIGNoZWNrIGlzIGp1c3QgYSBwYXR0ZXJuIG1hdGNoIGFuZCBjb3VsZCBicmVhayBpZiBmYXN0Ym9vdC1pbmZvIGhhcyBhIGJ1bmNoIG9mIGp1bmsgY29tbWFuZHMKKy8vIGJ1dCBhbGwgZGV2aWNlcyBzaG91bGQgcHJldHR5IG11Y2ggZm9sbG93IHRoaXMgcGF0dGVybgorYm9vbCBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazo6Q2FuT3B0aW1pemUoY29uc3QgSW1hZ2VTb3VyY2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvIHJlYm9vdF90YXNrID0gdGFza3NbaV0tPkFzUmVib290VGFzaygpOworICAgICAgICBpZiAoIXJlYm9vdF90YXNrIHx8IHJlYm9vdF90YXNrLT5HZXRUYXJnZXQoKSAhPSAiZmFzdGJvb3QiKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgY2hlY2sgZm9yIGkgPj0gdGFza3Muc2l6ZSgpIC0gMiBpcyBiZWNhdXNlIHdlIGFyZSBwZWVraW5nIHR3byB0YXNrcyBhaGVhZC4gV2UgbmVlZCB0bworICAgICAgICAvLyBjaGVjayBmb3IgYW4gdXBkYXRlLXN1cGVyICYmIGZsYXNoIHtkeW5hbWljX3BhcnRpdGlvbn0KKyAgICAgICAgaWYgKGkgPj0gdGFza3Muc2l6ZSgpIC0gMiB8fCAhdGFza3NbaSArIDFdLT5Bc1VwZGF0ZVN1cGVyVGFzaygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGZsYXNoX3Rhc2sgPSB0YXNrc1tpICsgMl0tPkFzRmxhc2hUYXNrKCk7CisgICAgICAgIGlmICghRmxhc2hUYXNrOjpJc0R5bmFtaWNQYXJ0aXRpb24oc291cmNlLCBmbGFzaF90YXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjp1bmlxdWVfcHRyPE9wdGltaXplZEZsYXNoU3VwZXJUYXNrPiBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazo6SW5pdGlhbGl6ZSgKICAgICAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiYgdGFza3MpIHsKLSAgICBpZiAoIXN1cHBvcnRzX0FCKCkpIHsKKyAgICBpZiAoIWZwLT5zaG91bGRfb3B0aW1pemVfZmxhc2hfc3VwZXIpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJzdXBlciBvcHRpbWl6YXRpb24gaXMgZGlzYWJsZWQiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFzdXBwb3J0c19BQihmcC0+ZmIpKSB7CiAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQ2Fubm90IG9wdGltaXplIGZsYXNoaW5nIHN1cGVyIG9uIG5vbi1BQiBkZXZpY2UiOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CkBAIC0xODEsNiArMTc0LDkgQEAKICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJDYW5ub3Qgb3B0aW1pemUgZmxhc2hpbmcgc3VwZXIgZm9yIGFsbCBzbG90cyI7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KKyAgICBpZiAoIUNhbk9wdGltaXplKGZwLT5zb3VyY2UuZ2V0KCksIHRhc2tzKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAKICAgICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSBkeW5hbWljIHBhcnRpdGlvbnMgYXQgYWxsPwogICAgIHVuaXF1ZV9mZCBmZCA9IGZwLT5zb3VyY2UtPk9wZW5GaWxlKCJzdXBlcl9lbXB0eS5pbWciKTsKQEAgLTIxNCwzMiArMjEwLDM0IEBACiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIHRhc2sgOiB0YXNrcykgewogICAgICAgICBpZiAoYXV0byBmbGFzaF90YXNrID0gdGFzay0+QXNGbGFzaFRhc2soKSkgewotICAgICAgICAgICAgaWYgKHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UoZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpKSkgewotICAgICAgICAgICAgICAgIGF1dG8gcGFydGl0aW9uID0gZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpOwotICAgICAgICAgICAgICAgIGlmICghaGVscGVyLT5BZGRQYXJ0aXRpb24ocGFydGl0aW9uLCBmbGFzaF90YXNrLT5HZXRJbWFnZU5hbWUoKSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gcGFydGl0aW9uID0gZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpOworICAgICAgICAgICAgaWYgKCFoZWxwZXItPkFkZFBhcnRpdGlvbihwYXJ0aXRpb24sIGZsYXNoX3Rhc2stPkdldEltYWdlTmFtZSgpLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGF1dG8gcyA9IGhlbHBlci0+R2V0U3BhcnNlTGF5b3V0KCk7CiAgICAgaWYgKCFzKSByZXR1cm4gbnVsbHB0cjsKLSAgICAvLyBSZW1vdmUgaW1hZ2VzIHRoYXQgd2UgYWxyZWFkeSBmbGFzaGVkLCBqdXN0IGluIGNhc2Ugd2UgaGF2ZSBub24tZHluYW1pYyBPUyBpbWFnZXMuCisKKyAgICAvLyBSZW1vdmUgdGFza3MgdGhhdCBhcmUgY29uY2F0ZW5hdGVkIGludG8gdGhpcyBvcHRpbWl6ZWQgdGFzawogICAgIGF1dG8gcmVtb3ZlX2lmX2NhbGxiYWNrID0gWyZdKGNvbnN0IGF1dG8mIHRhc2spIC0+IGJvb2wgewogICAgICAgICBpZiAoYXV0byBmbGFzaF90YXNrID0gdGFzay0+QXNGbGFzaFRhc2soKSkgewogICAgICAgICAgICAgcmV0dXJuIGhlbHBlci0+V2lsbEZsYXNoKGZsYXNoX3Rhc2stPkdldFBhcnRpdGlvbkFuZFNsb3QoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXV0byB1cGRhdGVfc3VwZXJfdGFzayA9IHRhc2stPkFzVXBkYXRlU3VwZXJUYXNrKCkpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0YXNrLT5Bc1VwZGF0ZVN1cGVyVGFzaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmIChhdXRvIHJlYm9vdF90YXNrID0gdGFzay0+QXNSZWJvb3RUYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKHJlYm9vdF90YXNrLT5HZXRUYXJnZXQoKSA9PSAiZmFzdGJvb3QiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH07CisKICAgICB0YXNrcy5lcmFzZShzdGQ6OnJlbW92ZV9pZih0YXNrcy5iZWdpbigpLCB0YXNrcy5lbmQoKSwgcmVtb3ZlX2lmX2NhbGxiYWNrKSwgdGFza3MuZW5kKCkpOwogCi0gICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rmxhc2hTdXBlckxheW91dFRhc2s+KHN1cGVyX25hbWUsIHN0ZDo6bW92ZShoZWxwZXIpLCBzdGQ6Om1vdmUocyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzaz4oc3VwZXJfbmFtZSwgc3RkOjptb3ZlKGhlbHBlciksIHN0ZDo6bW92ZShzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUsIGZwKTsKIH0KIAogVXBkYXRlU3VwZXJUYXNrOjpVcGRhdGVTdXBlclRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgOiBmcF8oZnApIHt9CkBAIC0yNjUsNiArMjYzLDkgQEAKICAgICB9CiAgICAgZnBfLT5mYi0+UmF3Q29tbWFuZChjb21tYW5kLCAiVXBkYXRpbmcgc3VwZXIgcGFydGl0aW9uIik7CiB9CitzdGQ6OnN0cmluZyBVcGRhdGVTdXBlclRhc2s6OlRvU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiAidXBkYXRlLXN1cGVyIjsKK30KIAogUmVzaXplVGFzazo6UmVzaXplVGFzayhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBjb25zdCBzdGQ6OnN0cmluZyYgcG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2xvdCkKQEAgLTI3OSwxMiArMjgwLDIwIEBACiAgICAgZG9fZm9yX3BhcnRpdGlvbnMocG5hbWVfLCBzbG90XywgcmVzaXplX3BhcnRpdGlvbiwgZmFsc2UpOwogfQogCitzdGQ6OnN0cmluZyBSZXNpemVUYXNrOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gInJlc2l6ZSAiICsgcG5hbWVfOworfQorCiBEZWxldGVUYXNrOjpEZWxldGVUYXNrKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwbmFtZSkgOiBmcF8oZnApLCBwbmFtZV8ocG5hbWUpe307CiAKIHZvaWQgRGVsZXRlVGFzazo6UnVuKCkgewogICAgIGZwXy0+ZmItPkRlbGV0ZVBhcnRpdGlvbihwbmFtZV8pOwogfQogCitzdGQ6OnN0cmluZyBEZWxldGVUYXNrOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gImRlbGV0ZSAiICsgcG5hbWVfOworfQorCiBXaXBlVGFzazo6V2lwZVRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBuYW1lKSA6IGZwXyhmcCksIHBuYW1lXyhwbmFtZSl7fTsKIAogdm9pZCBXaXBlVGFzazo6UnVuKCkgewpAQCAtMjk4LDUgKzMwNyw5IEBACiAgICAgICAgIExPRyhFUlJPUikgPDwgIndpcGUgdGFzayBlcmFzZSBmYWlsZWQgd2l0aCBwYXJ0aXRpb246ICIgPDwgcG5hbWVfOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGZiX3BlcmZvcm1fZm9ybWF0KHBuYW1lXywgMSwgcGFydGl0aW9uX3R5cGUsICIiLCBmcF8tPmZzX29wdGlvbnMpOworICAgIGZiX3BlcmZvcm1fZm9ybWF0KHBuYW1lXywgMSwgcGFydGl0aW9uX3R5cGUsICIiLCBmcF8tPmZzX29wdGlvbnMsIGZwXyk7Cit9CisKK3N0ZDo6c3RyaW5nIFdpcGVUYXNrOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gImVyYXNlICIgKyBwbmFtZV87CiB9CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC90YXNrLmggYi9mYXN0Ym9vdC90YXNrLmgKaW5kZXggMzRlM2U5Mi4uN2E3MTNjZiAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdGFzay5oCisrKyBiL2Zhc3Rib290L3Rhc2suaApAQCAtMTUsMTAgKzE1LDggQEAKIC8vCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyLmgiCiAjaW5jbHVkZSAic3VwZXJfZmxhc2hfaGVscGVyLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCkBAIC0yOSwxNiArMjcsMjEgQEAKIGNsYXNzIEZsYXNoVGFzazsKIGNsYXNzIFJlYm9vdFRhc2s7CiBjbGFzcyBVcGRhdGVTdXBlclRhc2s7CitjbGFzcyBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazsKIGNsYXNzIFdpcGVUYXNrOwotCitjbGFzcyBSZXNpemVUYXNrOwogY2xhc3MgVGFzayB7CiAgIHB1YmxpYzoKICAgICBUYXNrKCkgPSBkZWZhdWx0OwogICAgIHZpcnR1YWwgdm9pZCBSdW4oKSA9IDA7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0ID0gMDsKKwogICAgIHZpcnR1YWwgRmxhc2hUYXNrKiBBc0ZsYXNoVGFzaygpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgICB2aXJ0dWFsIFJlYm9vdFRhc2sqIEFzUmVib290VGFzaygpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgICB2aXJ0dWFsIFVwZGF0ZVN1cGVyVGFzayogQXNVcGRhdGVTdXBlclRhc2soKSB7IHJldHVybiBudWxscHRyOyB9CisgICAgdmlydHVhbCBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzayogQXNPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzaygpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgICB2aXJ0dWFsIFdpcGVUYXNrKiBBc1dpcGVUYXNrKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorICAgIHZpcnR1YWwgUmVzaXplVGFzayogQXNSZXNpemVUYXNrKCkgeyByZXR1cm4gbnVsbHB0cjsgfQogCiAgICAgdmlydHVhbCB+VGFzaygpID0gZGVmYXVsdDsKIH07CkBAIC00NiwyMCArNDksMjMgQEAKIGNsYXNzIEZsYXNoVGFzayA6IHB1YmxpYyBUYXNrIHsKICAgcHVibGljOgogICAgIEZsYXNoVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgc2xvdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCi0gICAgICAgICAgICAgIGNvbnN0IGJvb2wgYXBwbHlfdmJtZXRhKTsKKyAgICAgICAgICAgICAgY29uc3QgYm9vbCBhcHBseV92Ym1ldGEsIGNvbnN0IEZsYXNoaW5nUGxhbiogZnApOwogICAgIHZpcnR1YWwgRmxhc2hUYXNrKiBBc0ZsYXNoVGFzaygpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KIAotICAgIHN0ZDo6c3RyaW5nIEdldFBhcnRpdGlvbigpIHsgcmV0dXJuIHBuYW1lXzsgfQotICAgIHN0ZDo6c3RyaW5nIEdldEltYWdlTmFtZSgpIHsgcmV0dXJuIGZuYW1lXzsgfQotICAgIHN0ZDo6c3RyaW5nIEdldFBhcnRpdGlvbkFuZFNsb3QoKTsKLSAgICBzdGQ6OnN0cmluZyBHZXRTbG90KCkgeyByZXR1cm4gc2xvdF87IH0KKyAgICBzdGF0aWMgYm9vbCBJc0R5bmFtaWNQYXJ0aXRpb24oY29uc3QgSW1hZ2VTb3VyY2UqIHNvdXJjZSwgY29uc3QgRmxhc2hUYXNrKiB0YXNrKTsKICAgICB2b2lkIFJ1bigpIG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RkOjpzdHJpbmcgR2V0UGFydGl0aW9uKCkgY29uc3QgeyByZXR1cm4gcG5hbWVfOyB9CisgICAgc3RkOjpzdHJpbmcgR2V0SW1hZ2VOYW1lKCkgY29uc3QgeyByZXR1cm4gZm5hbWVfOyB9CisgICAgc3RkOjpzdHJpbmcgR2V0U2xvdCgpIGNvbnN0IHsgcmV0dXJuIHNsb3RfOyB9CisgICAgc3RkOjpzdHJpbmcgR2V0UGFydGl0aW9uQW5kU2xvdCgpIGNvbnN0OwogCiAgIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcG5hbWVfOwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZuYW1lXzsKICAgICBjb25zdCBzdGQ6OnN0cmluZyBzbG90XzsKICAgICBjb25zdCBib29sIGFwcGx5X3ZibWV0YV87CisgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcF87CiB9OwogCiBjbGFzcyBSZWJvb3RUYXNrIDogcHVibGljIFRhc2sgewpAQCAtNjgsMjggKzc0LDM0IEBACiAgICAgUmVib290VGFzayhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVib290X3RhcmdldCk7CiAgICAgdmlydHVhbCBSZWJvb3RUYXNrKiBBc1JlYm9vdFRhc2soKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CiAgICAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIEdldFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIHJlYm9vdF90YXJnZXRfOyB9OwogCiAgIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmVib290X3RhcmdldF8gPSAiIjsKICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwXzsKIH07CiAKLWNsYXNzIEZsYXNoU3VwZXJMYXlvdXRUYXNrIDogcHVibGljIFRhc2sgeworY2xhc3MgT3B0aW1pemVkRmxhc2hTdXBlclRhc2sgOiBwdWJsaWMgVGFzayB7CiAgIHB1YmxpYzoKLSAgICBGbGFzaFN1cGVyTGF5b3V0VGFzayhjb25zdCBzdGQ6OnN0cmluZyYgc3VwZXJfbmFtZSwgc3RkOjp1bmlxdWVfcHRyPFN1cGVyRmxhc2hIZWxwZXI+IGhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VQdHIgc3BhcnNlX2xheW91dCwgdWludDY0X3Qgc3VwZXJfc2l6ZSk7Ci0gICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxGbGFzaFN1cGVyTGF5b3V0VGFzaz4gSW5pdGlhbGl6ZShjb25zdCBGbGFzaGluZ1BsYW4qIGZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SW1hZ2VFbnRyeT4mIG9zX2ltYWdlcyk7Ci0gICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxGbGFzaFN1cGVyTGF5b3V0VGFzaz4gSW5pdGlhbGl6ZUZyb21UYXNrcygKKyAgICBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgc3VwZXJfbmFtZSwgc3RkOjp1bmlxdWVfcHRyPFN1cGVyRmxhc2hIZWxwZXI+IGhlbHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VQdHIgc3BhcnNlX2xheW91dCwgdWludDY0X3Qgc3VwZXJfc2l6ZSwgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCk7CisgICAgdmlydHVhbCBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzayogQXNPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzaygpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KKworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8T3B0aW1pemVkRmxhc2hTdXBlclRhc2s+IEluaXRpYWxpemUoCiAgICAgICAgICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrcyk7Ci0gICAgdXNpbmcgSW1hZ2VFbnRyeSA9IHN0ZDo6cGFpcjxjb25zdCBJbWFnZSosIHN0ZDo6c3RyaW5nPjsKKyAgICBzdGF0aWMgYm9vbCBDYW5PcHRpbWl6ZShjb25zdCBJbWFnZVNvdXJjZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKTsKKwogICAgIHZvaWQgUnVuKCkgb3ZlcnJpZGU7CisgICAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKIAogICBwcml2YXRlOgogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN1cGVyX25hbWVfOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxTdXBlckZsYXNoSGVscGVyPiBoZWxwZXJfOwogICAgIFNwYXJzZVB0ciBzcGFyc2VfbGF5b3V0XzsKICAgICB1aW50NjRfdCBzdXBlcl9zaXplXzsKKyAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwXzsKIH07CiAKIGNsYXNzIFVwZGF0ZVN1cGVyVGFzayA6IHB1YmxpYyBUYXNrIHsKQEAgLTk4LDYgKzExMCw3IEBACiAgICAgdmlydHVhbCBVcGRhdGVTdXBlclRhc2sqIEFzVXBkYXRlU3VwZXJUYXNrKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogCiAgICAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcF87CkBAIC0xMDgsNiArMTIxLDggQEAKICAgICBSZXNpemVUYXNrKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNpemUsCiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2xvdCk7CiAgICAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmVzaXplVGFzayogQXNSZXNpemVUYXNrKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogCiAgIHByaXZhdGU6CiAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcF87CkBAIC0xMTgsOCArMTMzLDkgQEAKIAogY2xhc3MgRGVsZXRlVGFzayA6IHB1YmxpYyBUYXNrIHsKICAgcHVibGljOgotICAgIERlbGV0ZVRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBfZnAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfcG5hbWUpOworICAgIERlbGV0ZVRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBuYW1lKTsKICAgICB2b2lkIFJ1bigpIG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwXzsKQEAgLTEzMCw4ICsxNDYsOCBAQAogICBwdWJsaWM6CiAgICAgV2lwZVRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBuYW1lKTsKICAgICB2aXJ0dWFsIFdpcGVUYXNrKiBBc1dpcGVUYXNrKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQotCiAgICAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcF87CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC90YXNrX3Rlc3QuY3BwIGIvZmFzdGJvb3QvdGFza190ZXN0LmNwcAppbmRleCAxNDViNGQ3Li41MTlkNGVkIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC90YXNrX3Rlc3QuY3BwCisrKyBiL2Zhc3Rib290L3Rhc2tfdGVzdC5jcHAKQEAgLTE2LDE0ICsxNiwxNiBAQAogCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgImZhc3Rib290LmgiCisjaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyX21vY2suaCIKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlICJhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlNwbGl0OwordXNpbmcgdGVzdGluZzo6XzsKIAogY2xhc3MgUGFyc2VUZXN0IDogcHVibGljIDo6dGVzdGluZyA6OlRlc3QgewogICBwcm90ZWN0ZWQ6CkBAIC01OCw3ICs2MCwzNCBAQAogICAgIHJldHVybiBQYXJzZUZhc3Rib290SW5mb0xpbmUoZnAsIHZlY19jb21tYW5kKTsKIH0KIAotVEVTVF9GKFBhcnNlVGVzdCwgQ09SUkVDVF9GbEFTSF9UQVNLX0ZPUk1FRCkgeworLy8gdGVzdHMgaWYgdGFza3NfYSBpcyBhIHN1cGVyc2V0IG9mIHRhc2tzX2IuIFVzZWQgZm9yIGNoZWNraW5nIHRvIGVuc3VyZSBhbGwgcGFydGl0aW9ucyBmbGFzaGVkCisvLyBmcm9tIGhhcmRjb2RlZCBpbWFnZSBsaXN0IGlzIGFsc28gZmxhc2hlZCBpbiBuZXcgZmFzdGJvb3QtaW5mby50eHQKK3N0YXRpYyBib29sIGNvbXBhcmVUYXNrTGlzdChzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrc19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzX2IpIHsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGlzdDsKKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrc19hKSB7CisgICAgICAgIGxpc3QuaW5zZXJ0KHRhc2stPlRvU3RyaW5nKCkpOworICAgIH0KKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrc19iKSB7CisgICAgICAgIGlmIChsaXN0LmZpbmQodGFzay0+VG9TdHJpbmcoKSkgPT0gbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogIiA8PCB0YXNrLT5Ub1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBub3QgZm91bmQgaW4gdGFzayBsaXN0IGNyZWF0ZWQgYnkgZmFzdGJvb3QtaW5mby50eHQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgdGFza3NUb1N0cmluZyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrcykgeworICAgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykgeworICAgICAgICBvdXRwdXQuYXBwZW5kKHRhc2stPlRvU3RyaW5nKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCitURVNUX0YoUGFyc2VUZXN0LCBDb3JyZWN0Rmxhc2hUYXNrRm9ybWVkKSB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbW1hbmRzID0geyJmbGFzaCBkdGJvIiwgImZsYXNoIC0tc2xvdC1vdGhlciBzeXN0ZW0gc3lzdGVtX290aGVyLmltZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggLS1hcHBseS12Ym1ldGEgdmJtZXRhIn07CiAKQEAgLTg2LDI1ICsxMTUsMzIgQEAKICAgICB9CiB9CiAKLVRFU1RfRihQYXJzZVRlc3QsIFZFUlNJT05fQ0hFQ0tfQ09SUlJFQ1QpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29ycmVjdF92ZXJzaW9ucyA9IHsKLSAgICAgICAgICAgICJ2ZXJzaW9uIDEuMCIsCi0gICAgICAgICAgICAidmVyc2lvbiAyMi4wMCIsCi0gICAgfTsKK1RFU1RfRihQYXJzZVRlc3QsIFZlcnNpb25DaGVja0NvcnJlY3QpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29ycmVjdF92ZXJzaW9ucyA9IHsidmVyc2lvbiAxIiwgInZlcnNpb24gMjIiLCAidmVyc2lvbiA1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiAxNyJ9OwogCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGJhZF92ZXJzaW9ucyA9IHsidmVyc2lvbiIsICAgICAgICAidmVyc2lvbiAuMDEiLCAidmVyc2lvbiB4MSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiAxLjAuMSIsICAidmVyc2lvbiAxLiIsICAicyAxLjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gMS4wIDIuMCJ9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBiYWRfdmVyc2lvbnMgPSB7InZlcnNpb24iLCAgICAgICAgICJ2ZXJzaW9uIC4wMSIsICAgICJ2ZXJzaW9uIHgxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIDEuMC4xIiwgICAidmVyc2lvbiAxLiIsICAgICAicyAxLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gMS4wIDIuMCIsICJ2ZXJzaW9uIDEwMC4wMCIsICJ2ZXJzaW9uIDEgMiJ9OwogCiAgICAgZm9yIChhdXRvJiB2ZXJzaW9uIDogY29ycmVjdF92ZXJzaW9ucykgewotICAgICAgICBBU1NFUlRfVFJVRShDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhhbmRyb2lkOjpiYXNlOjpTcGxpdCh2ZXJzaW9uLCAiICIpKSkgPDwgdmVyc2lvbjsKKyAgICAgICAgQVNTRVJUX1RSVUUoQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoYW5kcm9pZDo6YmFzZTo6U3BsaXQodmVyc2lvbiwgIiAiKSwgMjYpKQorICAgICAgICAgICAgICAgIDw8IHZlcnNpb247CiAgICAgfQorCisgICAgLy8gcmV0dXJuaW5nIEZhbHNlIGZvciBmYWlsaW5nIHZlcnNpb24gY2hlY2sKKyAgICBmb3IgKGF1dG8mIHZlcnNpb24gOiBjb3JyZWN0X3ZlcnNpb25zKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhhbmRyb2lkOjpiYXNlOjpTcGxpdCh2ZXJzaW9uLCAiICIpLCAwKSkKKyAgICAgICAgICAgICAgICA8PCB2ZXJzaW9uOworICAgIH0KKyAgICAvLyByZXR1cm5pbmcgRmFsc2UgZm9yIGJhZCBmb3JtYXQKICAgICBmb3IgKGF1dG8mIHZlcnNpb24gOiBiYWRfdmVyc2lvbnMpIHsKLSAgICAgICAgQVNTRVJUX0ZBTFNFKENoZWNrRmFzdGJvb3RJbmZvUmVxdWlyZW1lbnRzKGFuZHJvaWQ6OmJhc2U6OlNwbGl0KHZlcnNpb24sICIgIikpKSA8PCB2ZXJzaW9uOworICAgICAgICBBU1NFUlRfRkFMU0UoQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoYW5kcm9pZDo6YmFzZTo6U3BsaXQodmVyc2lvbiwgIiAiKSwgMTAwKSkKKyAgICAgICAgICAgICAgICA8PCB2ZXJzaW9uOwogICAgIH0KIH0KIAotVEVTVF9GKFBhcnNlVGVzdCwgQkFEX0ZBU1RCT09UX0lORk9fSU5QVVQpIHsKK1RFU1RfRihQYXJzZVRlc3QsIEJhZEZhc3Rib290SW5wdXQpIHsKICAgICBBU1NFUlRfRVEoUGFyc2VDb21tYW5kKGZwLmdldCgpLCAiZmxhc2giKSwgbnVsbHB0cik7CiAgICAgQVNTRVJUX0VRKFBhcnNlQ29tbWFuZChmcC5nZXQoKSwgImZsYXNoIC0tc2xvdC1vdGhlciAtLWFwcGx5LXZibWV0YSIpLCBudWxscHRyKTsKICAgICBBU1NFUlRfRVEoUGFyc2VDb21tYW5kKGZwLmdldCgpLCAiZmxhc2ggLS1hcHBseS12Ym1ldGEiKSwgbnVsbHB0cik7CkBAIC0xMjEsMyArMTU3LDIxNCBAQAogICAgIEFTU0VSVF9FUShQYXJzZUNvbW1hbmQoZnAuZ2V0KCksICJlcmFzZSBkdGJvIGR0Ym8iKSwgbnVsbHB0cik7CiAgICAgQVNTRVJUX0VRKFBhcnNlQ29tbWFuZChmcC5nZXQoKSwgIndpcGUgdGhpcyIpLCBudWxscHRyKTsKIH0KKworVEVTVF9GKFBhcnNlVGVzdCwgQ29ycmVjdFRhc2tGb3JtZWQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29tbWFuZHMgPSB7ImZsYXNoIGR0Ym8iLCAiZmxhc2ggLS1zbG90LW90aGVyIHN5c3RlbSBzeXN0ZW1fb3RoZXIuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYm9vdCBib290bG9hZGVyIiwgInVwZGF0ZS1zdXBlciIsICJlcmFzZSBjYWNoZSJ9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gdGFza3MgPSBjb2xsZWN0VGFza3MoZnAuZ2V0KCksIGNvbW1hbmRzKTsKKworICAgIEFTU0VSVF9UUlVFKHRhc2tzWzBdLT5Bc0ZsYXNoVGFzaygpKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrc1swXS0+QXNGbGFzaFRhc2soKSk7CisgICAgQVNTRVJUX1RSVUUodGFza3NbMV0tPkFzRmxhc2hUYXNrKCkpOworICAgIEFTU0VSVF9UUlVFKHRhc2tzWzJdLT5Bc1JlYm9vdFRhc2soKSk7CisgICAgQVNTRVJUX1RSVUUodGFza3NbM10tPkFzVXBkYXRlU3VwZXJUYXNrKCkpOworICAgIEFTU0VSVF9UUlVFKHRhc2tzWzRdLT5Bc1dpcGVUYXNrKCkpOworfQorCitURVNUX0YoUGFyc2VUZXN0LCBDb3JyZWN0RHJpdmVyQ2FsbHMpIHsKKyAgICBmYXN0Ym9vdDo6TW9ja0Zhc3Rib290RHJpdmVyIGZiOworICAgIGZwLT5mYiA9ICZmYjsKKworICAgIEVYUEVDVF9DQUxMKGZiLCBSZWJvb3RUbyhfLCBfLCBfKSkuVGltZXMoMSk7CisgICAgRVhQRUNUX0NBTEwoZmIsIFJlYm9vdChfLCBfKSkuVGltZXMoMSk7CisgICAgRVhQRUNUX0NBTEwoZmIsIFdhaXRGb3JEaXNjb25uZWN0KCkpLlRpbWVzKDIpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbW1hbmRzID0geyJyZWJvb3QgYm9vdGxvYWRlciIsICJyZWJvb3QifTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzID0gY29sbGVjdFRhc2tzKGZwLmdldCgpLCBjb21tYW5kcyk7CisKKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykgeworICAgICAgICB0YXNrLT5SdW4oKTsKKyAgICB9Cit9CisKK1RFU1RfRihQYXJzZVRlc3QsIENvcnJlY3RUYXNrTGlzdHMpIHsKKyAgICBpZiAoIWdldF9hbmRyb2lkX3Byb2R1Y3Rfb3V0KCkpIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpOworICAgIH0KKworICAgIGZwLT5zb3VyY2UucmVzZXQobmV3IExvY2FsSW1hZ2VTb3VyY2UpOworICAgIGZwLT5zcGFyc2VfbGltaXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKTsKKworICAgIGZhc3Rib290OjpNb2NrRmFzdGJvb3REcml2ZXIgZmI7CisgICAgZnAtPmZiID0gJmZiOworICAgIGZwLT5zaG91bGRfb3B0aW1pemVfZmxhc2hfc3VwZXIgPSBmYWxzZTsKKworICAgIE9OX0NBTEwoZmIsIEdldFZhcigic3VwZXItcGFydGl0aW9uLW5hbWUiLCBfLCBfKSkKKyAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KHRlc3Rpbmc6OlJldHVybihmYXN0Ym9vdDo6QkFEX0FSRykpOworCisgICAgRmxhc2hBbGxUb29sIHRvb2woZnAuZ2V0KCkpOworCisgICAgZnAtPnNob3VsZF91c2VfZmFzdGJvb3RfaW5mbyA9IGZhbHNlOworICAgIGF1dG8gaGFyZGNvZGVkX3Rhc2tzID0gdG9vbC5Db2xsZWN0VGFza3MoKTsKKyAgICBmcC0+c2hvdWxkX3VzZV9mYXN0Ym9vdF9pbmZvID0gdHJ1ZTsKKyAgICBhdXRvIGZhc3Rib290X2luZm9fdGFza3MgPSB0b29sLkNvbGxlY3RUYXNrcygpOworCisgICAgYXV0byBpc19ub25fZmxhc2hfdGFzayA9IFtdKGNvbnN0IGF1dG8mIHRhc2spIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gdGFzay0+QXNGbGFzaFRhc2soKSA9PSBudWxscHRyOworICAgIH07CisKKyAgICAvLyByZW1vdmUgbm9uIGZsYXNoIHRhc2tzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgaGFyZGNvZGVkX3Rhc2tzLmVyYXNlKAorICAgICAgICAgICAgc3RkOjpyZW1vdmVfaWYoaGFyZGNvZGVkX3Rhc2tzLmJlZ2luKCksIGhhcmRjb2RlZF90YXNrcy5lbmQoKSwgaXNfbm9uX2ZsYXNoX3Rhc2spLAorICAgICAgICAgICAgaGFyZGNvZGVkX3Rhc2tzLmVuZCgpKTsKKyAgICBmYXN0Ym9vdF9pbmZvX3Rhc2tzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKGZhc3Rib290X2luZm9fdGFza3MuYmVnaW4oKSwgZmFzdGJvb3RfaW5mb190YXNrcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vbl9mbGFzaF90YXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3Rib290X2luZm9fdGFza3MuZW5kKCkpOworCisgICAgaWYgKCFjb21wYXJlVGFza0xpc3QoZmFzdGJvb3RfaW5mb190YXNrcywgaGFyZGNvZGVkX3Rhc2tzKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlxuXG4tLS1IYXJkY29kZWQgVGFzayBMaXN0LS0tXG4iCisgICAgICAgICAgICAgICAgICA8PCB0YXNrc1RvU3RyaW5nKGhhcmRjb2RlZF90YXNrcykgPDwgIlxuLS0tRmFzdGJvb3QtSW5mbyBUYXNrIExpc3QtLS1cbiIKKyAgICAgICAgICAgICAgICAgIDw8IHRhc2tzVG9TdHJpbmcoZmFzdGJvb3RfaW5mb190YXNrcyk7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUoY29tcGFyZVRhc2tMaXN0KGZhc3Rib290X2luZm9fdGFza3MsIGhhcmRjb2RlZF90YXNrcykpOworCisgICAgQVNTRVJUX1RSVUUoZmFzdGJvb3RfaW5mb190YXNrcy5zaXplKCkgPj0gaGFyZGNvZGVkX3Rhc2tzLnNpemUoKSkKKyAgICAgICAgICAgIDw8ICJzaXplIG9mIGZhc3Rib290LWluZm8gdGFzayBsaXN0OiAiIDw8IGZhc3Rib290X2luZm9fdGFza3Muc2l6ZSgpCisgICAgICAgICAgICA8PCAiIHNpemUgb2YgaGFyZGNvZGVkIHRhc2sgbGlzdDogIiA8PCBoYXJkY29kZWRfdGFza3Muc2l6ZSgpOworfQorVEVTVF9GKFBhcnNlVGVzdCwgSXNEeW5hbWljUGFydGl0aW9udGVzdCkgeworICAgIGlmICghZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCk7CisgICAgfQorCisgICAgZnAtPnNvdXJjZS5yZXNldChuZXcgTG9jYWxJbWFnZVNvdXJjZSk7CisKKyAgICBmYXN0Ym9vdDo6TW9ja0Zhc3Rib290RHJpdmVyIGZiOworICAgIGZwLT5mYiA9ICZmYjsKKyAgICBmcC0+c2hvdWxkX29wdGltaXplX2ZsYXNoX3N1cGVyID0gdHJ1ZTsKKyAgICBmcC0+c2hvdWxkX3VzZV9mYXN0Ym9vdF9pbmZvID0gdHJ1ZTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgYm9vbD4+IHRlc3RfY2FzZXMgPSB7CisgICAgICAgICAgICB7ImZsYXNoIGJvb3QiLCBmYWxzZX0sCisgICAgICAgICAgICB7ImZsYXNoIGluaXRfYm9vdCIsIGZhbHNlfSwKKyAgICAgICAgICAgIHsiZmxhc2ggLS1hcHBseS12Ym1ldGEgdmJtZXRhIiwgZmFsc2V9LAorICAgICAgICAgICAgeyJmbGFzaCBwcm9kdWN0IiwgdHJ1ZX0sCisgICAgICAgICAgICB7ImZsYXNoIHN5c3RlbSIsIHRydWV9LAorICAgICAgICAgICAgeyJmbGFzaCAtLXNsb3Qtb3RoZXIgc3lzdGVtIHN5c3RlbV9vdGhlci5pbWciLCB0cnVlfSwKKyAgICB9OworICAgIGZvciAoYXV0byYgdGVzdCA6IHRlc3RfY2FzZXMpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRhc2s+IHRhc2sgPQorICAgICAgICAgICAgICAgIFBhcnNlRmFzdGJvb3RJbmZvTGluZShmcC5nZXQoKSwgYW5kcm9pZDo6YmFzZTo6VG9rZW5pemUodGVzdC5maXJzdCwgIiAiKSk7CisgICAgICAgIGF1dG8gZmxhc2hfdGFzayA9IHRhc2stPkFzRmxhc2hUYXNrKCk7CisgICAgICAgIEFTU0VSVF9GQUxTRShmbGFzaF90YXNrID09IG51bGxwdHIpOworICAgICAgICBBU1NFUlRfRVEoRmxhc2hUYXNrOjpJc0R5bmFtaWNQYXJ0aXRpb24oZnAtPnNvdXJjZS5nZXQoKSwgZmxhc2hfdGFzayksIHRlc3Quc2Vjb25kKTsKKyAgICB9Cit9CisKK1RFU1RfRihQYXJzZVRlc3QsIENhbk9wdGltaXplVGVzdCkgeworICAgIGlmICghZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCk7CisgICAgfQorCisgICAgZnAtPnNvdXJjZS5yZXNldChuZXcgTG9jYWxJbWFnZVNvdXJjZSk7CisgICAgZnAtPnNwYXJzZV9saW1pdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworCisgICAgZmFzdGJvb3Q6Ok1vY2tGYXN0Ym9vdERyaXZlciBmYjsKKyAgICBmcC0+ZmIgPSAmZmI7CisgICAgZnAtPnNob3VsZF9vcHRpbWl6ZV9mbGFzaF9zdXBlciA9IGZhbHNlOworICAgIGZwLT5zaG91bGRfdXNlX2Zhc3Rib290X2luZm8gPSB0cnVlOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiwgYm9vbD4+IHBhdHRlcm5tYXRjaHRlc3QgPSB7CisgICAgICAgICAgICB7eyJmbGFzaCBib290IiwgImZsYXNoIGluaXRfYm9vdCIsICJmbGFzaCB2ZW5kb3JfYm9vdCIsICJyZWJvb3QgZmFzdGJvb3QiLAorICAgICAgICAgICAgICAidXBkYXRlLXN1cGVyIiwgImZsYXNoIHByb2R1Y3QiLCAiZmxhc2ggc3lzdGVtIiwgImZsYXNoIHN5c3RlbV9leHQiLCAiZmxhc2ggb2RtIiwKKyAgICAgICAgICAgICAgImlmLXdpcGUgZXJhc2UgdXNlcmRhdGEifSwKKyAgICAgICAgICAgICB0cnVlfSwKKyAgICAgICAgICAgIHt7ImZsYXNoIGJvb3QiLCAiZmxhc2ggaW5pdF9ib290IiwgImZsYXNoIHZlbmRvcl9ib290IiwgInJlYm9vdCBmYXN0Ym9vdCIsCisgICAgICAgICAgICAgICJ1cGRhdGUtc3VwZXIiLCAiZmxhc2ggcHJvZHVjdCIsICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggc3lzdGVtX2V4dCIsICJmbGFzaCBvZG0iLAorICAgICAgICAgICAgICAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSJ9LAorICAgICAgICAgICAgIHRydWV9LAorICAgICAgICAgICAge3siZmxhc2ggYm9vdCIsICJmbGFzaCBpbml0X2Jvb3QiLCAiZmxhc2ggdmVuZG9yX2Jvb3QiLCAicmVib290IGZhc3Rib290IiwKKyAgICAgICAgICAgICAgImZsYXNoIHByb2R1Y3QiLCAiZmxhc2ggc3lzdGVtIiwgImZsYXNoIHN5c3RlbV9leHQiLCAiZmxhc2ggb2RtIiwKKyAgICAgICAgICAgICAgImlmLXdpcGUgZXJhc2UgdXNlcmRhdGEifSwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgICAgICAgICB7eyJmbGFzaCBib290IiwgImZsYXNoIGluaXRfYm9vdCIsICJmbGFzaCB2ZW5kb3JfYm9vdCIsICJ1cGRhdGUtc3VwZXIiLCAiZmxhc2ggcHJvZHVjdCIsCisgICAgICAgICAgICAgICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggc3lzdGVtX2V4dCIsICJmbGFzaCBvZG0iLCAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSJ9LAorICAgICAgICAgICAgIGZhbHNlfSwKKyAgICB9OworCisgICAgYXV0byByZW1vdmVfaWZfY2FsbGJhY2sgPSBbJl0oY29uc3QgYXV0byYgdGFzaykgLT4gYm9vbCB7IHJldHVybiAhIXRhc2stPkFzUmVzaXplVGFzaygpOyB9OworCisgICAgZm9yIChhdXRvJiB0ZXN0IDogcGF0dGVybm1hdGNodGVzdCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzID0gUGFyc2VGYXN0Ym9vdEluZm8oZnAuZ2V0KCksIHRlc3QuZmlyc3QpOworICAgICAgICB0YXNrcy5lcmFzZShzdGQ6OnJlbW92ZV9pZih0YXNrcy5iZWdpbigpLCB0YXNrcy5lbmQoKSwgcmVtb3ZlX2lmX2NhbGxiYWNrKSwgdGFza3MuZW5kKCkpOworICAgICAgICBBU1NFUlRfRVEoT3B0aW1pemVkRmxhc2hTdXBlclRhc2s6OkNhbk9wdGltaXplKGZwLT5zb3VyY2UuZ2V0KCksIHRhc2tzKSwgdGVzdC5zZWNvbmQpOworICAgIH0KK30KKworLy8gTm90ZTogdGhpcyB0ZXN0IGlzIGV4Y2x1c2l2ZWx5IHRlc3RpbmcgdGhhdCBvcHRpbWl6ZWQgZmxhc2ggc3VwZXIgcGF0dGVybiBtYXRjaGVzIGEgZ2l2ZW4gdGFzaworLy8gbGlzdCBhbmQgaXMgYWJsZSB0byBvcHRpbWl6ZWQgYmFzZWQgb24gYSBjb3JyZWN0IHNlcXVlbmNlIG9mIHRhc2tzCitURVNUX0YoUGFyc2VUZXN0LCBPcHRpbWl6ZWRGbGFzaFN1cGVyUGF0dGVybk1hdGNoVGVzdCkgeworICAgIGlmICghZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCk7CisgICAgfQorCisgICAgZnAtPnNvdXJjZS5yZXNldChuZXcgTG9jYWxJbWFnZVNvdXJjZSk7CisgICAgZnAtPnNwYXJzZV9saW1pdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworCisgICAgZmFzdGJvb3Q6Ok1vY2tGYXN0Ym9vdERyaXZlciBmYjsKKyAgICBmcC0+ZmIgPSAmZmI7CisgICAgZnAtPnNob3VsZF9vcHRpbWl6ZV9mbGFzaF9zdXBlciA9IHRydWU7CisgICAgZnAtPnNob3VsZF91c2VfZmFzdGJvb3RfaW5mbyA9IHRydWU7CisKKyAgICBPTl9DQUxMKGZiLCBHZXRWYXIoInN1cGVyLXBhcnRpdGlvbi1uYW1lIiwgXywgXykpCisgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdCh0ZXN0aW5nOjpSZXR1cm4oZmFzdGJvb3Q6OkJBRF9BUkcpKTsKKworICAgIE9OX0NBTEwoZmIsIEdldFZhcigic2xvdC1jb3VudCIsIF8sIF8pKQorICAgICAgICAgICAgLldpbGxCeURlZmF1bHQodGVzdGluZzo6RG9BbGwodGVzdGluZzo6U2V0QXJnUG9pbnRlZTwxPigiMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6UmV0dXJuKGZhc3Rib290OjpTVUNDRVNTKSkpOworCisgICAgT05fQ0FMTChmYiwgR2V0VmFyKCJwYXJ0aXRpb24tc2l6ZTpzdXBlciIsIF8sIF8pKQorICAgICAgICAgICAgLldpbGxCeURlZmF1bHQodGVzdGluZzo6RG9BbGwodGVzdGluZzo6U2V0QXJnUG9pbnRlZTwxPigiMTAwMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6UmV0dXJuKGZhc3Rib290OjpTVUNDRVNTKSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiwgYm9vbD4+IHBhdHRlcm5tYXRjaHRlc3QgPSB7CisgICAgICAgICAgICB7eyJmbGFzaCBib290IiwgImZsYXNoIGluaXRfYm9vdCIsICJmbGFzaCB2ZW5kb3JfYm9vdCIsICJyZWJvb3QgZmFzdGJvb3QiLAorICAgICAgICAgICAgICAidXBkYXRlLXN1cGVyIiwgImZsYXNoIHByb2R1Y3QiLCAiZmxhc2ggc3lzdGVtIiwgImZsYXNoIHN5c3RlbV9leHQiLCAiZmxhc2ggb2RtIiwKKyAgICAgICAgICAgICAgImlmLXdpcGUgZXJhc2UgdXNlcmRhdGEifSwKKyAgICAgICAgICAgICB0cnVlfSwKKyAgICAgICAgICAgIHt7ImZsYXNoIGJvb3QiLCAiZmxhc2ggaW5pdF9ib290IiwgImZsYXNoIHZlbmRvcl9ib290IiwgInJlYm9vdCBmYXN0Ym9vdCIsCisgICAgICAgICAgICAgICJ1cGRhdGUtc3VwZXIiLCAiZmxhc2ggcHJvZHVjdCIsICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggc3lzdGVtX2V4dCIsICJmbGFzaCBvZG0iLAorICAgICAgICAgICAgICAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSJ9LAorICAgICAgICAgICAgIHRydWV9LAorICAgICAgICAgICAge3siZmxhc2ggYm9vdCIsICJmbGFzaCBpbml0X2Jvb3QiLCAiZmxhc2ggdmVuZG9yX2Jvb3QiLCAicmVib290IGZhc3Rib290IiwKKyAgICAgICAgICAgICAgImZsYXNoIHByb2R1Y3QiLCAiZmxhc2ggc3lzdGVtIiwgImZsYXNoIHN5c3RlbV9leHQiLCAiZmxhc2ggb2RtIiwKKyAgICAgICAgICAgICAgImlmLXdpcGUgZXJhc2UgdXNlcmRhdGEifSwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgICAgICAgICB7eyJmbGFzaCBib290IiwgImZsYXNoIGluaXRfYm9vdCIsICJmbGFzaCB2ZW5kb3JfYm9vdCIsICJ1cGRhdGUtc3VwZXIiLCAiZmxhc2ggcHJvZHVjdCIsCisgICAgICAgICAgICAgICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggc3lzdGVtX2V4dCIsICJmbGFzaCBvZG0iLCAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSJ9LAorICAgICAgICAgICAgIGZhbHNlfSwKKyAgICB9OworCisgICAgZm9yIChhdXRvJiB0ZXN0IDogcGF0dGVybm1hdGNodGVzdCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzID0gUGFyc2VGYXN0Ym9vdEluZm8oZnAuZ2V0KCksIHRlc3QuZmlyc3QpOworICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBvcHRpbWl6ZWQgZmxhc2ggc3VwZXIgdGFzayAmJiBubyBtb3JlIGR5bmFtaWMgcGFydGl0aW9uCisgICAgICAgIC8vIGZsYXNoaW5nIHRhc2tzCisgICAgICAgIGF1dG8mJiBJc09wdGltaXplZCA9IFtdKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKSB7CisgICAgICAgICAgICBib29sIGNvbnRhaW5zX29wdGltaXplZF90YXNrID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykgeworICAgICAgICAgICAgICAgIGlmICh0YXNrLT5Bc09wdGltaXplZEZsYXNoU3VwZXJUYXNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnNfb3B0aW1pemVkX3Rhc2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXV0byBmbGFzaF90YXNrID0gdGFzay0+QXNGbGFzaFRhc2soKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoRmxhc2hUYXNrOjpJc0R5bmFtaWNQYXJ0aXRpb24oZnAtPnNvdXJjZS5nZXQoKSwgZmxhc2hfdGFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb250YWluc19vcHRpbWl6ZWRfdGFzazsKKyAgICAgICAgfTsKKyAgICAgICAgQVNTRVJUX0VRKElzT3B0aW1pemVkKGZwLmdldCgpLCB0YXNrcyksIHRlc3Quc2Vjb25kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC90ZXN0X2Zhc3Rib290LnB5IGIvZmFzdGJvb3QvdGVzdF9mYXN0Ym9vdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNhZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmFzdGJvb3QvdGVzdF9mYXN0Ym9vdC5weQpAQCAtMCwwICsxLDUzIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIiIiVGVzdHMgZm9yIHRoZSBmYXN0Ym9vdCBjb21tYW5kIGxpbmUgdXRpbGl0eS4KKyIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBEZXZpY2VzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIGBmYXN0Ym9vdCBkZXZpY2VzYC4iIiIKKworCisgICAgZGVmIHRlc3RfZGV2aWNlcyhzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIHRoYXQgdGhlIGZvcm1hdCBvZiBgZmFzdGJvb3QgZGV2aWNlc2AgZG9lcyBub3QgY2hhbmdlLgorCisgICAgICAgIGBmYXN0Ym9vdCBkZXZpY2VzYCBzaG91bGQgYWx0ZXJuYXRlIGJldHdlZW4gYSBsaW5lIGNvbnRhaW5pbmcgdGhlCisgICAgICAgIGRldmljZSdzIHNlcmlhbCBudW1iZXIgYW5kIGZhc3Rib290IHN0YXRlIGFuZCBhbiBlbXB0eSBsaW5lCisgICAgICAgICIiIgorICAgICAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbImZhc3Rib290IiwgImRldmljZXMiXSkKKworICAgICAgICBwcmV2aW91c19saW5lX3dhc19lbXB0eSA9IFRydWUKKyAgICAgICAgZm9yIGxpbmUgaW4gb3V0cHV0LmRlY29kZSgpLnNwbGl0bGluZXMoKToKKyAgICAgICAgICAgIGlmIHByZXZpb3VzX2xpbmVfd2FzX2VtcHR5OgorICAgICAgICAgICAgICAgIGlmIG5vdCByZS5tYXRjaChyIlthLXpBLVpcZF0rXHMrKGJvb3Rsb2FkZXJ8ZmFzdGJvb3RkKSIsIGxpbmUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBmb3JtYXQgPHNlcmlhbCBubz5cXHMrKGJvb3Rsb2FkZXJ8ZmFzdGJvb3RkKSIgJSBsaW5lKQorICAgICAgICAgICAgICAgIHByZXZpb3VzX2xpbmVfd2FzX2VtcHR5ID0gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBhbiBlbXB0eSBsaW5lLiBSZWNlaXZlZCAnJXMnIiAlIGxpbmUpCisgICAgICAgICAgICAgICAgcHJldmlvdXNfbGluZV93YXNfZW1wdHkgPSBUcnVlCisKKyAgICAgICAgaWYgbGVuKG91dHB1dCkgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiT3V0cHV0IGlzIGVtcHR5LiBBcmUgYW55IGRldmljZXMgY29ubmVjdGVkPyIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3VzYi5oIGIvZmFzdGJvb3QvdXNiLmgKaW5kZXggNjk1ODFhYi4uZDg1Y2I4MSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdXNiLmgKKysrIGIvZmFzdGJvb3QvdXNiLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKIApAQCAtNjYsNCArNjcsNCBAQAogdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGludCh1c2JfaWZjX2luZm8qKT4gaWZjX21hdGNoX2Z1bmM7CiAKIC8vIDAgaXMgbm9uIGJsb2NraW5nCi1Vc2JUcmFuc3BvcnQqIHVzYl9vcGVuKGlmY19tYXRjaF9mdW5jIGNhbGxiYWNrLCB1aW50MzJfdCB0aW1lb3V0X21zID0gMCk7CitzdGQ6OnVuaXF1ZV9wdHI8VXNiVHJhbnNwb3J0PiB1c2Jfb3BlbihpZmNfbWF0Y2hfZnVuYyBjYWxsYmFjaywgdWludDMyX3QgdGltZW91dF9tcyA9IDApOwpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvdXNiX2xpbnV4LmNwcCBiL2Zhc3Rib290L3VzYl9saW51eC5jcHAKaW5kZXggOTY0NDg4Yy4uMzdiYjMwNCAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdXNiX2xpbnV4LmNwcAorKysgYi9mYXN0Ym9vdC91c2JfbGludXguY3BwCkBAIC01MDMsOSArNTAzLDE1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLVVzYlRyYW5zcG9ydCogdXNiX29wZW4oaWZjX21hdGNoX2Z1bmMgY2FsbGJhY2ssIHVpbnQzMl90IHRpbWVvdXRfbXMpIHsKK3N0ZDo6dW5pcXVlX3B0cjxVc2JUcmFuc3BvcnQ+IHVzYl9vcGVuKGlmY19tYXRjaF9mdW5jIGNhbGxiYWNrLCB1aW50MzJfdCB0aW1lb3V0X21zKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFVzYlRyYW5zcG9ydD4gcmVzdWx0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjx1c2JfaGFuZGxlPiBoYW5kbGUgPSBmaW5kX3VzYl9kZXZpY2UoIi9zeXMvYnVzL3VzYi9kZXZpY2VzIiwgY2FsbGJhY2spOwotICAgIHJldHVybiBoYW5kbGUgPyBuZXcgTGludXhVc2JUcmFuc3BvcnQoc3RkOjptb3ZlKGhhbmRsZSksIHRpbWVvdXRfbXMpIDogbnVsbHB0cjsKKworICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgcmVzdWx0ID0gc3RkOjptYWtlX3VuaXF1ZTxMaW51eFVzYlRyYW5zcG9ydD4oc3RkOjptb3ZlKGhhbmRsZSksIHRpbWVvdXRfbXMpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFdhaXQgZm9yIHRoZSBzeXN0ZW0gdG8gbm90aWNlIHRoZSBkZXZpY2UgaXMgZ29uZSwgc28gdGhhdCBhIHN1YnNlcXVlbnQKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3VzYl9vc3guY3BwIGIvZmFzdGJvb3QvdXNiX29zeC5jcHAKaW5kZXggNWI5ZTVjOC4uMjgzMDBiMiAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdXNiX29zeC5jcHAKKysrIGIvZmFzdGJvb3QvdXNiX29zeC5jcHAKQEAgLTQzNiwxMiArNDM2LDcgQEAKIAogICAgIGZvciAoOzspIHsKICAgICAgICAgaWYgKCEgSU9JdGVyYXRvcklzVmFsaWQoaXRlcmF0b3IpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQXBwbGUgZG9jdW1lbnRhdGlvbiBhZHZpc2VzIHJlc2V0dGluZyB0aGUgaXRlcmF0b3IgaWYKLSAgICAgICAgICAgICAqIGl0IHNob3VsZCBiZWNvbWUgaW52YWxpZCBkdXJpbmcgaXRlcmF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBJT0l0ZXJhdG9yUmVzZXQoaXRlcmF0b3IpOwotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlvX3NlcnZpY2VfdCBkZXZpY2UgPSBJT0l0ZXJhdG9yTmV4dChpdGVyYXRvcik7CkBAIC00NzQsMTYgKzQ2OSwyMCBAQAogLyoKICAqIERlZmluaXRpb25zIG9mIHRoaXMgZmlsZSdzIHB1YmxpYyBmdW5jdGlvbnMuCiAgKi8KLQotVXNiVHJhbnNwb3J0KiB1c2Jfb3BlbihpZmNfbWF0Y2hfZnVuYyBjYWxsYmFjaywgdWludDMyX3QgdGltZW91dF9tcykgeworc3RkOjp1bmlxdWVfcHRyPFVzYlRyYW5zcG9ydD4gdXNiX29wZW4oaWZjX21hdGNoX2Z1bmMgY2FsbGJhY2ssIHVpbnQzMl90IHRpbWVvdXRfbXMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VXNiVHJhbnNwb3J0PiByZXN1bHQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPHVzYl9oYW5kbGU+IGhhbmRsZTsKIAogICAgIGlmIChpbml0X3VzYihjYWxsYmFjaywgJmhhbmRsZSkgPCAwKSB7CiAgICAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nIGluaXRpYWxpemluZyBVU0IuICovCi0gICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIHJldHVybiBuZXcgT3N4VXNiVHJhbnNwb3J0KHN0ZDo6bW92ZShoYW5kbGUpLCB0aW1lb3V0X21zKTsKKyAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8T3N4VXNiVHJhbnNwb3J0PihzdGQ6Om1vdmUoaGFuZGxlKSwgdGltZW91dF9tcyk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogT3N4VXNiVHJhbnNwb3J0Ojp+T3N4VXNiVHJhbnNwb3J0KCkgewpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvdXNiX3dpbmRvd3MuY3BwIGIvZmFzdGJvb3QvdXNiX3dpbmRvd3MuY3BwCmluZGV4IDY3YmY4YTMuLjU2YTZlN2QgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L3VzYl93aW5kb3dzLmNwcAorKysgYi9mYXN0Ym9vdC91c2Jfd2luZG93cy5jcHAKQEAgLTM4MSw3ICszODEsMTMgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1Vc2JUcmFuc3BvcnQqIHVzYl9vcGVuKGlmY19tYXRjaF9mdW5jIGNhbGxiYWNrLCB1aW50MzJfdCkgeworc3RkOjp1bmlxdWVfcHRyPFVzYlRyYW5zcG9ydD4gdXNiX29wZW4oaWZjX21hdGNoX2Z1bmMgY2FsbGJhY2ssIHVpbnQzMl90KSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFVzYlRyYW5zcG9ydD4gcmVzdWx0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjx1c2JfaGFuZGxlPiBoYW5kbGUgPSBmaW5kX3VzYl9kZXZpY2UoY2FsbGJhY2spOwotICAgIHJldHVybiBoYW5kbGUgPyBuZXcgV2luZG93c1VzYlRyYW5zcG9ydChzdGQ6Om1vdmUoaGFuZGxlKSkgOiBudWxscHRyOworCisgICAgaWYgKGhhbmRsZSkgeworICAgICAgICByZXN1bHQgPSBzdGQ6Om1ha2VfdW5pcXVlPFdpbmRvd3NVc2JUcmFuc3BvcnQ+KHN0ZDo6bW92ZShoYW5kbGUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL0FuZHJvaWQuYnAgYi9mc19tZ3IvQW5kcm9pZC5icAppbmRleCBkZDYxMjcyLi44N2RiOThiIDEwMDY0NAotLS0gYS9mc19tZ3IvQW5kcm9pZC5icAorKysgYi9mc19tZ3IvQW5kcm9pZC5icApAQCAtNDksNyArNDksNiBAQAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImludGVnZXIiXSwKICAgICB9LAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlLyJdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCkBAIC02MCw3ICs1OSw3IEBACiAgICAgbmFtZTogImxpYmZzX21ncl9kZWZhdWx0cyIsCiAgICAgZGVmYXVsdHM6IFsiZnNfbWdyX2RlZmF1bHRzIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS92b2xkIl0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUvIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IiwKICAgICBdLApAQCAtNzAsOCArNjksOSBAQAogICAgICAgICAiZnNfbWdyLmNwcCIsCiAgICAgICAgICJmc19tZ3JfZm9ybWF0LmNwcCIsCiAgICAgICAgICJmc19tZ3JfZG1fbGluZWFyLmNwcCIsCi0gICAgICAgICJmc19tZ3Jfb3ZlcmxheWZzLmNwcCIsCiAgICAgICAgICJmc19tZ3Jfcm9vdHMuY3BwIiwKKyAgICAgICAgImZzX21ncl9vdmVybGF5ZnNfY29udHJvbC5jcHAiLAorICAgICAgICAiZnNfbWdyX292ZXJsYXlmc19tb3VudC5jcHAiLAogICAgICAgICAiZnNfbWdyX3ZlbmRvcl9vdmVybGF5LmNwcCIsCiAgICAgICAgICI6bGliZmllbWFwX3NyY3MiLAogICAgIF0sCkBAIC04OSw4ICs4OSw2IEBACiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmF2YiIsCiAgICAgICAgICJsaWJmc19hdmIiLAotICAgICAgICAibGliZnN0YWIiLAotICAgICAgICAibGliZG0iLAogICAgICAgICAibGliZ3NpIiwKICAgICBdLAogICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKQEAgLTE3NCwzOCArMTcyLDIyIEBACiB9CiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICAvLyBEbyBub3QgZXZlciBtYWtlIHRoaXMgYSBzaGFyZWQgbGlicmFyeSBhcyBsb25nIGFzIGl0IGlzIHZlbmRvcl9hdmFpbGFibGUuCi0gICAgLy8gSXQgZG9lcyBub3QgaGF2ZSBhIHN0YWJsZSBpbnRlcmZhY2UuCi0gICAgbmFtZTogImxpYmZzdGFiIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG5hbWU6ICJsaWJmc19tZ3JfZmlsZV93YWl0IiwKKyAgICBkZWZhdWx0czogWyJmc19tZ3JfZGVmYXVsdHMiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiZmlsZV93YWl0LmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGRlZmF1bHRzOiBbImZzX21ncl9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgImZzX21ncl9mc3RhYi5jcHAiLAotICAgICAgICAiZnNfbWdyX2Jvb3RfY29uZmlnLmNwcCIsCi0gICAgICAgICJmc19tZ3Jfc2xvdHNlbGVjdC5jcHAiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGRhcndpbjogewotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCi0gICAgICAgIH0sCi0gICAgICAgIHZlbmRvcjogewotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgLy8gU2tpcHBpbmcgZW50cmllcyBpbiBmc3RhYiBzaG91bGQgb25seSBiZSBkb25lIGluIGEgc3lzdGVtCi0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBhcyB0aGUgY29uZmlnIGZpbGUgaXMgaW4gL3N5c3RlbV9leHQuCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvcCBmcm9tIHRoZSB2ZW5kb3IgdmFyaWFudC4KLSAgICAgICAgICAgICAgICAiLUROT19TS0lQX01PVU5UIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGVfZnN0YWIiXSwKLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKLSAgICAgICAgImxpYmdzaV9oZWFkZXJzIiwKLSAgICBdLAogfQogCiBjY19iaW5hcnkgewpkaWZmIC0tZ2l0IGEvZnNfbWdyL1RFU1RfTUFQUElORyBiL2ZzX21nci9URVNUX01BUFBJTkcKaW5kZXggZDM1N2U0NS4uMTk4OWE1YyAxMDA2NDQKLS0tIGEvZnNfbWdyL1RFU1RfTUFQUElORworKysgYi9mc19tZ3IvVEVTVF9NQVBQSU5HCkBAIC0xNiw3ICsxNiw4IEBACiAgICAgICAibmFtZSI6ICJmaWVtYXBfd3JpdGVyX3Rlc3QiCiAgICAgfSwKICAgICB7Ci0gICAgICAibmFtZSI6ICJmc19tZ3JfdmVuZG9yX292ZXJsYXlfdGVzdCIKKyAgICAgICJuYW1lIjogImZzX21ncl92ZW5kb3Jfb3ZlcmxheV90ZXN0IiwKKyAgICAgICJrZXl3b3JkcyI6IFsiaW50ZXJuYWwiXQogICAgIH0sCiAgICAgewogICAgICAgIm5hbWUiOiAidnRzX2xpYnNuYXBzaG90X3Rlc3QiCkBAIC0yNCwyNiArMjUsMjkgQEAKICAgICB7CiAgICAgICAibmFtZSI6ICJ2YWJfbGVnYWN5X3Rlc3RzIgogICAgIH0sCi0gICAgLy8gVE9ETzogYi8yNzkwMDk2OTcKKyAgICAvLyBUT0RPKGIvMjc5MDA5Njk3KToKICAgICAvL3sibmFtZSI6ICJ2YWJjX2xlZ2FjeV90ZXN0cyJ9LAogICAgIHsKICAgICAgICJuYW1lIjogImNvd19hcGlfdGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogInNuYXB1c2VyZF90ZXN0IgogICAgIH0KICAgXSwKICAgImtlcm5lbC1wcmVzdWJtaXQiOiBbCiAgICAgewotICAgICAgIm5hbWUiOiAidnRzX2xpYmRtX3Rlc3QiCisgICAgICAibmFtZSI6ICJsaWJkbV90ZXN0IgogICAgIH0sCiAgICAgewotICAgICAgIm5hbWUiOiAidnRzX2NvcmVfbGlibHBfdGVzdCIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogInZ0c19saWJzbmFwc2hvdF90ZXN0IgorICAgICAgIm5hbWUiOiAibGlibHBfdGVzdCIKICAgICB9LAogICAgIHsKICAgICAgICJuYW1lIjogInZhYl9sZWdhY3lfdGVzdHMiCi0gICAgfQotICAgIC8vIFRPRE86IGIvMjc5MDA5Njk3CisgICAgfSwKKyAgICAvLyBUT0RPKGIvMjc5MDA5Njk3KToKICAgICAvL3sibmFtZSI6ICJ2YWJjX2xlZ2FjeV90ZXN0cyJ9CisgICAgeworICAgICAgIm5hbWUiOiAic25hcHVzZXJkX3Rlc3QiCisgICAgfQogICBdCiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvY2xlYW5fc2NyYXRjaF9maWxlcy5yYyBiL2ZzX21nci9jbGVhbl9zY3JhdGNoX2ZpbGVzLnJjCmluZGV4IDI1YTdlNjkuLjcxNzA4ZjggMTAwNjQ0Ci0tLSBhL2ZzX21nci9jbGVhbl9zY3JhdGNoX2ZpbGVzLnJjCisrKyBiL2ZzX21nci9jbGVhbl9zY3JhdGNoX2ZpbGVzLnJjCkBAIC0xLDIgKzEsMiBAQAotb24gcG9zdC1mcy1kYXRhICYmIHByb3BlcnR5OnJvLmRlYnVnZ2FibGU9MQorb24gcG9zdC1mcy1kYXRhICYmIHByb3BlcnR5OnJvLmRlYnVnZ2FibGU9MSAmJiBwcm9wZXJ0eTpyby5ib290LmR5bmFtaWNfcGFydGl0aW9ucz10cnVlCiAgICAgZXhlY19iYWNrZ3JvdW5kIC0gcm9vdCByb290IC0tIC9zeXN0ZW0vYmluL2NsZWFuX3NjcmF0Y2hfZmlsZXMKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3IuY3BwIGIvZnNfbWdyL2ZzX21nci5jcHAKaW5kZXggNzQyY2RmYS4uOGMwYzFlZiAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21nci5jcHAKKysrIGIvZnNfbWdyL2ZzX21nci5jcHAKQEAgLTE2LDcgKzE2LDYgQEAKIAogI2luY2x1ZGUgImZzX21nci5oIgogCi0jaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CkBAIC02MTMsNyArNjEyLDYgQEAKIAogLy8gUmVhZCB0aGUgcHJpbWFyeSBzdXBlcmJsb2NrIGZyb20gYW4gZjJmcyBmaWxlc3lzdGVtLiAgT24gZmFpbHVyZSByZXR1cm4KIC8vIGZhbHNlLiAgSWYgaXQncyBub3QgYW4gZjJmcyBmaWxlc3lzdGVtLCBhbHNvIHNldCBGU19TVEFUX0lOVkFMSURfTUFHSUMuCi0jZGVmaW5lIEYyRlNfQkxLU0laRSA0MDk2CiAjZGVmaW5lIEYyRlNfU1VQRVJfT0ZGU0VUIDEwMjQKIHN0YXRpYyBib29sIHJlYWRfZjJmc19zdXBlcmJsb2NrKGNvbnN0IHN0ZDo6c3RyaW5nJiBibGtfZGV2aWNlLCBpbnQqIGZzX3N0YXQpIHsKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oYmxrX2RldmljZS5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpKTsKQEAgLTYyOCw3ICs2MjYsOSBAQAogICAgICAgICBQRVJST1IgPDwgIkNhbid0IHJlYWQgJyIgPDwgYmxrX2RldmljZSA8PCAiJyBzdXBlcmJsb2NrMSI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChmZCwgJnNiMiwgc2l6ZW9mKHNiMiksIEYyRlNfQkxLU0laRSArIEYyRlNfU1VQRVJfT0ZGU0VUKSkgIT0KKyAgICAvLyBGMkZTIG9ubHkgc3VwcG9ydHMgYmxvY2tfc2l6ZT1wYWdlX3NpemUgY2FzZS4gU28sIGl0IGlzIHNhZmUgdG8gY2FsbAorICAgIC8vIGBnZXRwYWdlc2l6ZSgpYCBhbmQgdXNlIHRoYXQgYXMgc2l6ZSBvZiBzdXBlciBibG9jay4KKyAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKGZkLCAmc2IyLCBzaXplb2Yoc2IyKSwgZ2V0cGFnZXNpemUoKSArIEYyRlNfU1VQRVJfT0ZGU0VUKSkgIT0KICAgICAgICAgc2l6ZW9mKHNiMikpIHsKICAgICAgICAgUEVSUk9SIDw8ICJDYW4ndCByZWFkICciIDw8IGJsa19kZXZpY2UgPDwgIicgc3VwZXJibG9jazIiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02NTIsNyArNjUyLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoc2IgPT0gY3B1X3RvX2xlMzIoRjJGU19TVVBFUl9NQUdJQykpIHJldHVybiB0cnVlOwotICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkocHJlYWQoZmQsICZzYiwgc2l6ZW9mKHNiKSwgRjJGU19CTEtTSVpFICsgRjJGU19TVVBFUl9PRkZTRVQpKSAhPQorICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkocHJlYWQoZmQsICZzYiwgc2l6ZW9mKHNiKSwgZ2V0cGFnZXNpemUoKSArIEYyRlNfU1VQRVJfT0ZGU0VUKSkgIT0KICAgICAgICAgc2l6ZW9mKHNiKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNzAwLDYgKzcwMCwyOSBAQAogfQogCiAvLworLy8gTWVjaGFuaXNtIHRvIGFsbG93IGZzY2sgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNldHRpbmcgcm8ucHJldmVudGF0aXZlX2ZzY2sKKy8vIEludHJvZHVjZWQgdG8gYWRkcmVzcyBiLzMwNTY1ODY2MworLy8gSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgZmxhZyBmaWxlIGNvbnRlbnRzLCB0cmlnZ2VyCisvLyBmc2NrIGFuZCBzdG9yZSB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdGhlIGZsYWcgZmlsZQorLy8gSWYgd2Ugd2FudCB0byB0cmlnZ2VyIGFnYWluLCBzaW1wbHkgY2hhbmdlIHRoZSBwcm9wZXJ0eSB2YWx1ZQorLy8KK3N0YXRpYyBib29sIGNoZWNrX2lmX3ByZXZlbnRhdGl2ZV9mc2NrX25lZWRlZChjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgeworICAgIGNvbnN0IGNoYXIqIGZsYWdfZmlsZSA9ICIvbWV0YWRhdGEvdm9sZC9wcmV2ZW50YXRpdmVfZnNjayI7CisgICAgaWYgKGVudHJ5Lm1vdW50X3BvaW50ICE9ICIvZGF0YSIpIHJldHVybiBmYWxzZTsKKworICAgIC8vIERvbid0IGVycm9yIGNoZWNrIC0gYm90aCBkZWZhdWx0IHRvIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgT0sKKyAgICBzdGQ6OnN0cmluZyBwcm9wID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLnByZXZlbnRhdGl2ZV9mc2NrIiwgIiIpOworICAgIHN0ZDo6c3RyaW5nIGZsYWc7CisgICAgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhmbGFnX2ZpbGUsICZmbGFnKTsKKyAgICBpZiAocHJvcCA9PSBmbGFnKSByZXR1cm4gZmFsc2U7CisgICAgLy8gZnNjayBpcyBydW4gaW1tZWRpYXRlbHksIHNvIGFzc3VtZSBpdCBydW5zIG9yIHRoZXJlIGlzIHNvbWUgZGVlcGVyIHByb2JsZW0KKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKHByb3AsIGZsYWdfZmlsZSkpCisgICAgICAgIFBFUlJPUiA8PCAiRmFpbGVkIHRvIHdyaXRlIGZpbGUgIiA8PCBmbGFnX2ZpbGU7CisgICAgTElORk8gPDwgIlJ1biBwcmV2ZW50YXRpdmUgZnNjayBvbiAvZGF0YSI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vCiAvLyBQcmVwYXJlIHRoZSBmaWxlc3lzdGVtIG9uIHRoZSBnaXZlbiBibG9jayBkZXZpY2UgdG8gYmUgbW91bnRlZC4KIC8vCiAvLyBJZiB0aGUgImNoZWNrIiBvcHRpb24gd2FzIGdpdmVuIGluIHRoZSBmc3RhYiByZWNvcmQsIG9yIGl0IHNlZW1zIHRoYXQgdGhlCkBAIC03NDksNyArNzcyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlbnRyeS5mc19tZ3JfZmxhZ3MuY2hlY2sgfHwKKyAgICBpZiAoY2hlY2tfaWZfcHJldmVudGF0aXZlX2ZzY2tfbmVlZGVkKGVudHJ5KSB8fCBlbnRyeS5mc19tZ3JfZmxhZ3MuY2hlY2sgfHwKICAgICAgICAgKGZzX3N0YXQgJiAoRlNfU1RBVF9VTkNMRUFOX1NIVVRET1dOIHwgRlNfU1RBVF9RVU9UQV9FTkFCTEVEKSkpIHsKICAgICAgICAgY2hlY2tfZnMoYmxrX2RldmljZSwgZW50cnkuZnNfdHlwZSwgbW91bnRfcG9pbnQsICZmc19zdGF0KTsKICAgICB9CkBAIC03OTUsOSArODE4LDEzIEBACiAvLyBfX21vdW50KCk6IHdyYXBwZXIgYXJvdW5kIHRoZSBtb3VudCgpIHN5c3RlbSBjYWxsIHdoaWNoIGFsc28KIC8vIHNldHMgdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIHRvIHJlYWQtb25seSBpZiB0aGUgbW91bnQgaXMgcmVhZC1vbmx5LgogLy8gU2VlICJtYW4gMiBtb3VudCIgZm9yIHJldHVybiB2YWx1ZXMuCi1zdGF0aWMgaW50IF9fbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKK3N0YXRpYyBpbnQgX19tb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICBib29sIHJlYWRfb25seSA9IGZhbHNlKSB7CiAgICAgZXJybm8gPSAwOwogICAgIHVuc2lnbmVkIGxvbmcgbW91bnRmbGFncyA9IGVudHJ5LmZsYWdzOworICAgIGlmIChyZWFkX29ubHkpIHsKKyAgICAgICAgbW91bnRmbGFncyB8PSBNU19SRE9OTFk7CisgICAgfQogICAgIGludCByZXQgPSAwOwogICAgIGludCBzYXZlX2Vycm5vID0gMDsKICAgICBpbnQgZ2NfYWxsb3dhbmNlID0gMDsKQEAgLTgyNyw3ICs4NTQsMTQgQEAKICAgICAgICAgICAgICAgICAgIDw8ICIsdHlwZT0iIDw8IGVudHJ5LmZzX3R5cGUgPDwgIiwgZ2NfYWxsb3dhbmNlPSIgPDwgZ2NfYWxsb3dhbmNlIDw8ICIlKT0iIDw8IHJldAogICAgICAgICAgICAgICAgICAgPDwgIigiIDw8IHNhdmVfZXJybm8gPDwgIikiOwogICAgICAgICB9Ci0gICAgICAgIHJldCA9IG1vdW50KHNvdXJjZS5jX3N0cigpLCB0YXJnZXQuY19zdHIoKSwgZW50cnkuZnNfdHlwZS5jX3N0cigpLCBtb3VudGZsYWdzLAorCisgICAgICAgIC8vIExldCdzIGdldCB0aGUgcmF3IGRtIHRhcmdldCwgaWYgaXQncyBhIHN5bWxpbmssIHNpbmNlIHNvbWUgZXhpc3RpbmcgYXBwbGljYXRpb25zCisgICAgICAgIC8vIHJlbHkgb24gL3Byb2MvbW91bnRzIHRvIGZpbmQgdGhlIHVzZXJkYXRhJ3MgZG0gdGFyZ2V0IHBhdGguIERvbid0IGJyZWFrIHRoYXQgYXNzdW1wdGlvbi4KKyAgICAgICAgc3RkOjpzdHJpbmcgcmVhbF9zb3VyY2U7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhbHBhdGgoc291cmNlLCAmcmVhbF9zb3VyY2UpKSB7CisgICAgICAgICAgICByZWFsX3NvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBtb3VudChyZWFsX3NvdXJjZS5jX3N0cigpLCB0YXJnZXQuY19zdHIoKSwgZW50cnkuZnNfdHlwZS5jX3N0cigpLCBtb3VudGZsYWdzLAogICAgICAgICAgICAgICAgICAgICBvcHRzLmNfc3RyKCkpOwogICAgICAgICBzYXZlX2Vycm5vID0gZXJybm87CiAgICAgICAgIGlmICh0cnlfZjJmc19nY19hbGxvd2FuY2UpIGdjX2FsbG93YW5jZSArPSAxMDsKQEAgLTg4NCw2ICs5MTgsMTAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wgc2hvdWxkX3VzZV9tZXRhZGF0YV9lbmNyeXB0aW9uKGNvbnN0IEZzdGFiRW50cnkmIGVudHJ5KSB7CisgICAgcmV0dXJuICFlbnRyeS5tZXRhZGF0YV9rZXlfZGlyLmVtcHR5KCkgJiYgZW50cnkuZnNfbWdyX2ZsYWdzLmZpbGVfZW5jcnlwdGlvbjsKK30KKwogLy8gVHJpZXMgdG8gbW91bnQgYW55IG9mIHRoZSBjb25zZWN1dGl2ZSBmc3RhYiBlbnRyaWVzIHRoYXQgbWF0Y2gKIC8vIHRoZSBtb3VudHBvaW50IG9mIHRoZSBvbmUgZ2l2ZW4gYnkgZnN0YWJbc3RhcnRfaWR4XS4KIC8vCkBAIC04OTEsOCArOTI5LDcgQEAKIC8vIGF0dGVtcHRlZF9pZHg6IE9uIHJldHVybiwgd2lsbCBpbmRpY2F0ZSB3aGljaCBmc3RhYiBlbnRyeQogLy8gICAgIHN1Y2NlZWRlZC4gSW4gY2FzZSBvZiBmYWlsdXJlLCBpdCB3aWxsIGJlIHRoZSBzdGFydF9pZHguCiAvLyBTZXRzIGVycm5vIHRvIG1hdGNoIHRoZSAxc3QgbW91bnQgZmFpbHVyZSBvbiBmYWlsdXJlLgotc3RhdGljIGJvb2wgbW91bnRfd2l0aF9hbHRlcm5hdGl2ZXMoRnN0YWImIGZzdGFiLCBpbnQgc3RhcnRfaWR4LCBpbnQqIGVuZF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGF0dGVtcHRlZF9pZHgpIHsKK3N0YXRpYyBib29sIG1vdW50X3dpdGhfYWx0ZXJuYXRpdmVzKEZzdGFiJiBmc3RhYiwgaW50IHN0YXJ0X2lkeCwgaW50KiBlbmRfaWR4LCBpbnQqIGF0dGVtcHRlZF9pZHgpIHsKICAgICB1bnNpZ25lZCBsb25nIGk7CiAgICAgaW50IG1vdW50X2Vycm5vID0gMDsKICAgICBib29sIG1vdW50ZWQgPSBmYWxzZTsKQEAgLTkzMCw4ICs5NjcsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludCByZXRyeV9jb3VudCA9IDI7CisgICAgICAgIGNvbnN0IGF1dG8gcmVhZF9vbmx5ID0gc2hvdWxkX3VzZV9tZXRhZGF0YV9lbmNyeXB0aW9uKGZzdGFiW2ldKTsKKyAgICAgICAgaWYgKHJlYWRfb25seSkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJNb3VudCBwb2ludCAiIDw8IGZzdGFiW2ldLmJsa19kZXZpY2UgPDwgIiBAICIgPDwgZnN0YWJbaV0ubW91bnRfcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIHVzZXMgbWV0YWRhdGEgZW5jcnlwdGlvbiwgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byB1bm1vdW50IGl0IGxhdGVyIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGwgZW5jcnlwdEZzdGFiL2VuY3J5cHRfaW5wbGFjZS4gVG8gYXZvaWQgZmlsZSBvcGVyYXRpb25zIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVuY3J5cHRpb24sIHdlIHdpbGwgbW91bnQgaXQgYXMgcmVhZC1vbmx5IGZpcnN0IjsKKyAgICAgICAgfQogICAgICAgICB3aGlsZSAocmV0cnlfY291bnQtLSA+IDApIHsKLSAgICAgICAgICAgIGlmICghX19tb3VudChmc3RhYltpXS5ibGtfZGV2aWNlLCBmc3RhYltpXS5tb3VudF9wb2ludCwgZnN0YWJbaV0pKSB7CisgICAgICAgICAgICBpZiAoIV9fbW91bnQoZnN0YWJbaV0uYmxrX2RldmljZSwgZnN0YWJbaV0ubW91bnRfcG9pbnQsIGZzdGFiW2ldLCByZWFkX29ubHkpKSB7CiAgICAgICAgICAgICAgICAgKmF0dGVtcHRlZF9pZHggPSBpOwogICAgICAgICAgICAgICAgIG1vdW50ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmIChpICE9IHN0YXJ0X2lkeCkgewpAQCAtMTAyMywxMCArMTA2Nyw2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBzaG91bGRfdXNlX21ldGFkYXRhX2VuY3J5cHRpb24oY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKLSAgICByZXR1cm4gIWVudHJ5Lm1ldGFkYXRhX2tleV9kaXIuZW1wdHkoKSAmJiBlbnRyeS5mc19tZ3JfZmxhZ3MuZmlsZV9lbmNyeXB0aW9uOwotfQotCiAvLyBDaGVjayB0byBzZWUgaWYgYSBtb3VudGFibGUgdm9sdW1lIGhhcyBlbmNyeXB0aW9uIHJlcXVpcmVtZW50cwogc3RhdGljIGludCBoYW5kbGVfZW5jcnlwdGFibGUoY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKICAgICBpZiAoc2hvdWxkX3VzZV9tZXRhZGF0YV9lbmNyeXB0aW9uKGVudHJ5KSkgewpAQCAtMTA5Niw4ICsxMTM2LDExIEBACiAKIGNsYXNzIENoZWNrcG9pbnRNYW5hZ2VyIHsKICAgcHVibGljOgotICAgIENoZWNrcG9pbnRNYW5hZ2VyKGludCBuZWVkc19jaGVja3BvaW50ID0gLTEsIGJvb2wgbWV0YWRhdGFfZW5jcnlwdGVkID0gZmFsc2UpCi0gICAgICAgIDogbmVlZHNfY2hlY2twb2ludF8obmVlZHNfY2hlY2twb2ludCksIG1ldGFkYXRhX2VuY3J5cHRlZF8obWV0YWRhdGFfZW5jcnlwdGVkKSB7fQorICAgIENoZWNrcG9pbnRNYW5hZ2VyKGludCBuZWVkc19jaGVja3BvaW50ID0gLTEsIGJvb2wgbWV0YWRhdGFfZW5jcnlwdGVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19lbmNyeXB0ID0gZmFsc2UpCisgICAgICAgIDogbmVlZHNfY2hlY2twb2ludF8obmVlZHNfY2hlY2twb2ludCksCisgICAgICAgICAgbWV0YWRhdGFfZW5jcnlwdGVkXyhtZXRhZGF0YV9lbmNyeXB0ZWQpLAorICAgICAgICAgIG5lZWRzX2VuY3J5cHRfKG5lZWRzX2VuY3J5cHQpIHt9CiAKICAgICBib29sIE5lZWRzQ2hlY2twb2ludCgpIHsKICAgICAgICAgaWYgKG5lZWRzX2NoZWNrcG9pbnRfICE9IFVOS05PV04pIHsKQEAgLTExNjAsNyArMTIwMyw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExFUlJPUiA8PCBlbnRyeS0+ZnNfdHlwZSA8PCAiIGRvZXMgbm90IGltcGxlbWVudCBjaGVja3BvaW50cy4iOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MuY2hlY2twb2ludF9ibGspIHsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS0+ZnNfbWdyX2ZsYWdzLmNoZWNrcG9pbnRfYmxrICYmICFuZWVkc19lbmNyeXB0XykgewogICAgICAgICAgICAgYXV0byBhY3R1YWxfYmxvY2tfZGV2aWNlID0gYmxvY2tfZGV2aWNlLmVtcHR5KCkgPyBlbnRyeS0+YmxrX2RldmljZSA6IGJsb2NrX2RldmljZTsKICAgICAgICAgICAgIGlmIChmc19tZ3JfZmluZF9ib3dfZGV2aWNlKGFjdHVhbF9ibG9ja19kZXZpY2UpLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICB1bmlxdWVfZmQgZmQoCkBAIC0xMjI4LDIxICsxMjcxLDMyIEBACiAgICAgZW51bSB7IFVOS05PV04gPSAtMSwgTk8gPSAwLCBZRVMgPSAxIH07CiAgICAgaW50IG5lZWRzX2NoZWNrcG9pbnRfOwogICAgIGJvb2wgbWV0YWRhdGFfZW5jcnlwdGVkXzsKKyAgICBib29sIG5lZWRzX2VuY3J5cHRfOwogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gZGV2aWNlX21hcF87CiB9OwogCiBzdGQ6OnN0cmluZyBmc19tZ3JfZmluZF9ib3dfZGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBibG9ja19kZXZpY2UpIHsKLSAgICBpZiAoYmxvY2tfZGV2aWNlLnN1YnN0cigwLCA1KSAhPSAiL2Rldi8iKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkV4cGVjdGVkIGJsb2NrIGRldmljZSwgZ290ICIgPDwgYmxvY2tfZGV2aWNlOwotICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAvLyBoYW5kbGUgc3ltbGluayBzdWNoIGFzICIvZGV2L2Jsb2NrL21hcHBlci91c2VyZGF0YSIKKyAgICBzdGQ6OnN0cmluZyByZWFsX3BhdGg7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFscGF0aChibG9ja19kZXZpY2UsICZyZWFsX3BhdGgpKSB7CisgICAgICAgIHJlYWxfcGF0aCA9IGJsb2NrX2RldmljZTsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBzeXNfZGlyID0gc3RkOjpzdHJpbmcoIi9zeXMvIikgKyBibG9ja19kZXZpY2Uuc3Vic3RyKDUpOwotCisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaWYgKHN0YXQocmVhbF9wYXRoLmNfc3RyKCksICZzdCkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJzdGF0IGZhaWxlZDogIiA8PCByZWFsX3BhdGg7CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKyAgICBpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgcmVhbF9wYXRoIDw8ICIgaXMgbm90IGJsb2NrIGRldmljZSI7CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBzeXNfZGlyID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIvc3lzL2Rldi9ibG9jay8ldToldSIsIG1ham9yKHN0LnN0X3JkZXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlub3Ioc3Quc3RfcmRldikpOwogICAgIGZvciAoOzspIHsKICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKHN5c19kaXIgKyAiL2RtL25hbWUiLCAmbmFtZSkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGJsb2NrX2RldmljZSA8PCAiIGlzIG5vdCBkbSBkZXZpY2UiOworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgcmVhbF9wYXRoIDw8ICIgaXMgbm90IGRtIGRldmljZSI7CiAgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKICAgICAgICAgfQogCkBAIC0xMzc2LDYgKzE0MzAsOCBAQAogICAgICAgICByZXR1cm4ge0ZTX01HUl9NTlRBTExfRkFJTCwgdXNlcmRhdGFfbW91bnRlZH07CiAgICAgfQogCisgICAgYm9vbCBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkID0gdHJ1ZTsKKwogICAgIC8vIEtlZXAgaSBpbnQgdG8gcHJldmVudCB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGZyb20gKGkgPSB0b3BfaWR4IC0gMSksCiAgICAgLy8gd2hlcmUgdG9wX2lkeCBpcyAwLiBJdCB3aWxsIGdpdmUgU0lHQUJSVAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8aW50Pihmc3RhYi0+c2l6ZSgpKTsgaSsrKSB7CkBAIC0xNDk0LDYgKzE1NTAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbmNyeXB0YWJsZSA9IHN0YXR1czsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZTX01HUl9NTlRBTExfREVWX05FRURTX01FVEFEQVRBX0VOQ1JZUFRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgZnNfbWdyX3NldF9ibGtfcm8oYXR0ZW1wdGVkX2VudHJ5LmJsa19kZXZpY2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsX3ZkYyh7ImNyeXB0ZnMiLCAiZW5jcnlwdEZzdGFiIiwgYXR0ZW1wdGVkX2VudHJ5LmJsa19kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZF9lbnRyeS5tb3VudF9wb2ludCwgd2lwZWQgPyAidHJ1ZSIgOiAiZmFsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWRfZW50cnkuZnNfdHlwZSwgYXR0ZW1wdGVkX2VudHJ5LnpvbmVkX2RldmljZX0sCkBAIC0xNTA4LDYgKzE1NjUsOSBAQAogICAgICAgICAgICAgaWYgKGN1cnJlbnRfZW50cnkubW91bnRfcG9pbnQgPT0gIi9kYXRhIikgewogICAgICAgICAgICAgICAgIHVzZXJkYXRhX21vdW50ZWQgPSB0cnVlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNb3VudE92ZXJsYXlmcyhhdHRlbXB0ZWRfZW50cnksICZzY3JhdGNoX2Nhbl9iZV9tb3VudGVkKTsKKwogICAgICAgICAgICAgLy8gU3VjY2VzcyEgIEdvIGdldCB0aGUgbmV4dCBvbmUuCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMTU5MiwxMCArMTY1Miw2IEBACiAKICAgICBzZXRfdHlwZV9wcm9wZXJ0eShlbmNyeXB0YWJsZSk7CiAKLSNpZiBBTExPV19BREJEX0RJU0FCTEVfVkVSSVRZID09IDEgIC8vICJ1c2VyZGVidWciIGJ1aWxkCi0gICAgZnNfbWdyX292ZXJsYXlmc19tb3VudF9hbGwoZnN0YWIpOwotI2VuZGlmCi0KICAgICBpZiAoZXJyb3JfY291bnQpIHsKICAgICAgICAgcmV0dXJuIHtGU19NR1JfTU5UQUxMX0ZBSUwsIHVzZXJkYXRhX21vdW50ZWR9OwogICAgIH0gZWxzZSB7CkBAIC0xODQ1LDE3ICsxOTAxLDE0IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotLy8gSWYgdG1wX21vdW50X3BvaW50IGlzIG5vbi1udWxsLCBtb3VudCB0aGUgZmlsZXN5c3RlbSB0aGVyZS4gIFRoaXMgaXMgZm9yIHRoZQotLy8gdG1wIG1vdW50IHdlIGRvIHRvIGNoZWNrIHRoZSB1c2VyIHBhc3N3b3JkCiAvLyBJZiBtdWx0aXBsZSBmc3RhYiBlbnRyaWVzIGFyZSB0byBiZSBtb3VudGVkIG9uICJuX25hbWUiLCBpdCB3aWxsIHRyeSB0byBtb3VudCBlYWNoIG9uZQogLy8gaW4gdHVybiwgYW5kIHN0b3Agb24gMXN0IHN1Y2Nlc3MsIG9yIG5vIG1vcmUgbWF0Y2guCi1zdGF0aWMgaW50IGZzX21ncl9kb19tb3VudF9oZWxwZXIoRnN0YWIqIGZzdGFiLCBjb25zdCBzdGQ6OnN0cmluZyYgbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuX2Jsa19kZXZpY2UsIGNvbnN0IGNoYXIqIHRtcF9tb3VudF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmVlZHNfY2hlY2twb2ludCwgYm9vbCBtZXRhZGF0YV9lbmNyeXB0ZWQpIHsKK2ludCBmc19tZ3JfZG9fbW91bnQoRnN0YWIqIGZzdGFiLCBjb25zdCBzdGQ6OnN0cmluZyYgbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgbl9ibGtfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbmVlZHNfY2hlY2twb2ludCwgYm9vbCBuZWVkc19lbmNyeXB0KSB7CiAgICAgaW50IG1vdW50X2Vycm9ycyA9IDA7CiAgICAgaW50IGZpcnN0X21vdW50X2Vycm5vID0gMDsKICAgICBzdGQ6OnN0cmluZyBtb3VudF9wb2ludDsKLSAgICBDaGVja3BvaW50TWFuYWdlciBjaGVja3BvaW50X21hbmFnZXIobmVlZHNfY2hlY2twb2ludCwgbWV0YWRhdGFfZW5jcnlwdGVkKTsKKyAgICBDaGVja3BvaW50TWFuYWdlciBjaGVja3BvaW50X21hbmFnZXIobmVlZHNfY2hlY2twb2ludCwgdHJ1ZSwgbmVlZHNfZW5jcnlwdCk7CiAgICAgQXZiVW5pcXVlUHRyIGF2Yl9oYW5kbGUobnVsbHB0cik7CiAKICAgICBpZiAoIWZzdGFiKSB7CkBAIC0xODk3LDExICsxOTUwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIE5vdyBtb3VudCBpdCB3aGVyZSByZXF1ZXN0ZWQgKi8KLSAgICAgICAgaWYgKHRtcF9tb3VudF9wb2ludCkgewotICAgICAgICAgICAgbW91bnRfcG9pbnQgPSB0bXBfbW91bnRfcG9pbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtb3VudF9wb2ludCA9IGZzdGFiX2VudHJ5Lm1vdW50X3BvaW50OwotICAgICAgICB9CisgICAgICAgIG1vdW50X3BvaW50ID0gZnN0YWJfZW50cnkubW91bnRfcG9pbnQ7CiAKICAgICAgICAgaW50IGZzX3N0YXQgPSBwcmVwYXJlX2ZzX2Zvcl9tb3VudChuX2Jsa19kZXZpY2UsIGZzdGFiX2VudHJ5LCBtb3VudF9wb2ludCk7CiAKQEAgLTE5MzksNiArMTk4OCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X2NvdW50IDw9IDApIGJyZWFrOyAgLy8gcnVuIGNoZWNrX2ZzIG9ubHkgb25jZQogICAgICAgICAgICAgICAgIGlmICghZmlyc3RfbW91bnRfZXJybm8pIGZpcnN0X21vdW50X2Vycm5vID0gZXJybm87CiAgICAgICAgICAgICAgICAgbW91bnRfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgUEVSUk9SIDw8ICJDYW5ub3QgbW91bnQgZmlsZXN5c3RlbSBvbiAiIDw8IG5fYmxrX2RldmljZSA8PCAiIGF0ICIgPDwgbW91bnRfcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIGZzdHlwZSAiIDw8IGZzdGFiX2VudHJ5LmZzX3R5cGU7CiAgICAgICAgICAgICAgICAgZnNfc3RhdCB8PSBGU19TVEFUX0ZVTExfTU9VTlRfRkFJTEVEOwogICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBhZnRlciBmc2NrCiAgICAgICAgICAgICAgICAgY2hlY2tfZnMobl9ibGtfZGV2aWNlLCBmc3RhYl9lbnRyeS5mc190eXBlLCBtb3VudF9wb2ludCwgJmZzX3N0YXQpOwpAQCAtMTk1OCwzNSArMjAwOSw2IEBACiAgICAgcmV0dXJuIEZTX01HUl9ET01OVF9GQUlMRUQ7CiB9CiAKLWludCBmc19tZ3JfZG9fbW91bnQoRnN0YWIqIGZzdGFiLCBjb25zdCBjaGFyKiBuX25hbWUsIGNoYXIqIG5fYmxrX2RldmljZSwgY2hhciogdG1wX21vdW50X3BvaW50KSB7Ci0gICAgcmV0dXJuIGZzX21ncl9kb19tb3VudF9oZWxwZXIoZnN0YWIsIG5fbmFtZSwgbl9ibGtfZGV2aWNlLCB0bXBfbW91bnRfcG9pbnQsIC0xLCBmYWxzZSk7Ci19Ci0KLWludCBmc19tZ3JfZG9fbW91bnQoRnN0YWIqIGZzdGFiLCBjb25zdCBjaGFyKiBuX25hbWUsIGNoYXIqIG5fYmxrX2RldmljZSwgY2hhciogdG1wX21vdW50X3BvaW50LAotICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX2NoZWNrcG9pbnQsIGJvb2wgbWV0YWRhdGFfZW5jcnlwdGVkKSB7Ci0gICAgcmV0dXJuIGZzX21ncl9kb19tb3VudF9oZWxwZXIoZnN0YWIsIG5fbmFtZSwgbl9ibGtfZGV2aWNlLCB0bXBfbW91bnRfcG9pbnQsIG5lZWRzX2NoZWNrcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfZW5jcnlwdGVkKTsKLX0KLQotLyoKLSAqIG1vdW50IGEgdG1wZnMgZmlsZXN5c3RlbSBhdCB0aGUgZ2l2ZW4gcG9pbnQuCi0gKiByZXR1cm4gMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlLgotICovCi1pbnQgZnNfbWdyX2RvX3RtcGZzX21vdW50KGNvbnN0IGNoYXIgKm5fbmFtZSkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgcmV0ID0gbW91bnQoInRtcGZzIiwgbl9uYW1lLCAidG1wZnMiLCBNU19OT0FUSU1FIHwgTVNfTk9TVUlEIHwgTVNfTk9ERVYgfCBNU19OT0VYRUMsCi0gICAgICAgICAgICAgICAgQ1JZUFRPX1RNUEZTX09QVElPTlMpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIExFUlJPUiA8PCAiQ2Fubm90IG1vdW50IHRtcGZzIGZpbGVzeXN0ZW0gYXQgIiA8PCBuX25hbWU7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBTdWNjZXNzICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBib29sIENvbmZpZ3VyZUlvU2NoZWR1bGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfcGF0aCkgewogICAgIGlmICghU3RhcnRzV2l0aChkZXZpY2VfcGF0aCwgIi9kZXYvIikpIHsKICAgICAgICAgTEVSUk9SIDw8IF9fZnVuY19fIDw8ICI6IGludmFsaWQgYXJndW1lbnQgIiA8PCBkZXZpY2VfcGF0aDsKQEAgLTIyNTgsOCArMjI4MCw4IEBACiB9CiAKIGJvb2wgZnNfbWdyX21vdW50X292ZXJsYXlmc19mc3RhYl9lbnRyeShjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgewotICAgIGF1dG8gb3ZlcmxheWZzX3ZhbGlkX3Jlc3VsdCA9IGZzX21ncl9vdmVybGF5ZnNfdmFsaWQoKTsKLSAgICBpZiAob3ZlcmxheWZzX3ZhbGlkX3Jlc3VsdCA9PSBPdmVybGF5ZnNWYWxpZFJlc3VsdDo6a05vdFN1cHBvcnRlZCkgeworICAgIGNvbnN0IGF1dG8gb3ZlcmxheWZzX2NoZWNrX3Jlc3VsdCA9IGFuZHJvaWQ6OmZzX21ncjo6Q2hlY2tPdmVybGF5ZnMoKTsKKyAgICBpZiAoIW92ZXJsYXlmc19jaGVja19yZXN1bHQuc3VwcG9ydGVkKSB7CiAgICAgICAgIExFUlJPUiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBvdmVybGF5ZnMiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMjMxMSwxMCArMjMzMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBhdXRvIG9wdGlvbnMgPSAibG93ZXJkaXI9IiArIGxvd2VyZGlyOwotICAgIGlmIChvdmVybGF5ZnNfdmFsaWRfcmVzdWx0ID09IE92ZXJsYXlmc1ZhbGlkUmVzdWx0OjprT3ZlcnJpZGVDcmVkc1JlcXVpcmVkKSB7Ci0gICAgICAgIG9wdGlvbnMgKz0gIixvdmVycmlkZV9jcmVkcz1vZmYiOwotICAgIH0KKyAgICBjb25zdCBhdXRvIG9wdGlvbnMgPSAibG93ZXJkaXI9IiArIGxvd2VyZGlyICsgb3ZlcmxheWZzX2NoZWNrX3Jlc3VsdC5tb3VudF9mbGFnczsKIAogICAgIC8vIFVzZSAib3ZlcmxheS0iICsgZW50cnkuYmxrX2RldmljZSBhcyB0aGUgbW91bnQoKSBzb3VyY2UsIHNvIHRoYXQgYWRiLXJlbW91dC10ZXN0IGRvbid0CiAgICAgLy8gY29uZnVzZSB0aGlzIHdpdGggYWRiIHJlbW91bnQgb3ZlcmxheSwgd2hvc2UgZGV2aWNlIG5hbWUgaXMgIm92ZXJsYXkiLgpAQCAtMjM3MCwzMCArMjM4OSwzNCBAQAogICAgIHJldHVybiBjb250ZXh0OwogfQogCi1PdmVybGF5ZnNWYWxpZFJlc3VsdCBmc19tZ3Jfb3ZlcmxheWZzX3ZhbGlkKCkgewotICAgIC8vIE92ZXJsYXlmcyBhdmFpbGFibGUgaW4gdGhlIGtlcm5lbCwgYW5kIHBhdGNoZWQgZm9yIG92ZXJyaWRlX2NyZWRzPwotICAgIGlmIChhY2Nlc3MoIi9zeXMvbW9kdWxlL292ZXJsYXkvcGFyYW1ldGVycy9vdmVycmlkZV9jcmVkcyIsIEZfT0spID09IDApIHsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1ZhbGlkUmVzdWx0OjprT3ZlcnJpZGVDcmVkc1JlcXVpcmVkOwotICAgIH0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmc19tZ3IgeworCitPdmVybGF5ZnNDaGVja1Jlc3VsdCBDaGVja092ZXJsYXlmcygpIHsKICAgICBpZiAoIWZzX21ncl9maWxlc3lzdGVtX2F2YWlsYWJsZSgib3ZlcmxheSIpKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNWYWxpZFJlc3VsdDo6a05vdFN1cHBvcnRlZDsKKyAgICAgICAgcmV0dXJuIHsuc3VwcG9ydGVkID0gZmFsc2V9OwogICAgIH0KICAgICBzdHJ1Y3QgdXRzbmFtZSB1dHM7CiAgICAgaWYgKHVuYW1lKCZ1dHMpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNWYWxpZFJlc3VsdDo6a05vdFN1cHBvcnRlZDsKKyAgICAgICAgcmV0dXJuIHsuc3VwcG9ydGVkID0gZmFsc2V9OwogICAgIH0KICAgICBpbnQgbWFqb3IsIG1pbm9yOwogICAgIGlmIChzc2NhbmYodXRzLnJlbGVhc2UsICIlZC4lZCIsICZtYWpvciwgJm1pbm9yKSAhPSAyKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNWYWxpZFJlc3VsdDo6a05vdFN1cHBvcnRlZDsKKyAgICAgICAgcmV0dXJuIHsuc3VwcG9ydGVkID0gZmFsc2V9OwogICAgIH0KLSAgICBpZiAobWFqb3IgPCA0KSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNWYWxpZFJlc3VsdDo6a09rOworICAgIC8vIE92ZXJsYXlmcyBhdmFpbGFibGUgaW4gdGhlIGtlcm5lbCwgYW5kIHBhdGNoZWQgZm9yIG92ZXJyaWRlX2NyZWRzPworICAgIGlmIChhY2Nlc3MoIi9zeXMvbW9kdWxlL292ZXJsYXkvcGFyYW1ldGVycy9vdmVycmlkZV9jcmVkcyIsIEZfT0spID09IDApIHsKKyAgICAgICAgYXV0byBtb3VudF9mbGFncyA9ICIsb3ZlcnJpZGVfY3JlZHM9b2ZmInM7CisgICAgICAgIGlmIChtYWpvciA+IDUgfHwgKG1ham9yID09IDUgJiYgbWlub3IgPj0gMTUpKSB7CisgICAgICAgICAgICBtb3VudF9mbGFncyArPSAiLHVzZXJ4YXR0ciJzOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7LnN1cHBvcnRlZCA9IHRydWUsIC5tb3VudF9mbGFncyA9IG1vdW50X2ZsYWdzfTsKICAgICB9Ci0gICAgaWYgKG1ham9yID4gNCkgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtOb3RTdXBwb3J0ZWQ7CisgICAgaWYgKG1ham9yIDwgNCB8fCAobWFqb3IgPT0gNCAmJiBtaW5vciA8PSAzKSkgeworICAgICAgICByZXR1cm4gey5zdXBwb3J0ZWQgPSB0cnVlfTsKICAgICB9Ci0gICAgaWYgKG1pbm9yID4gMykgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtOb3RTdXBwb3J0ZWQ7Ci0gICAgfQotICAgIHJldHVybiBPdmVybGF5ZnNWYWxpZFJlc3VsdDo6a09rOworICAgIHJldHVybiB7LnN1cHBvcnRlZCA9IGZhbHNlfTsKIH0KKworfSAgLy8gbmFtZXNwYWNlIGZzX21ncgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3JfYm9vdF9jb25maWcuY3BwIGIvZnNfbWdyL2ZzX21ncl9ib290X2NvbmZpZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDFlMGQuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2ZzX21ncl9ib290X2NvbmZpZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgImZzX21ncl9wcml2LmgiCi0KLXN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBmc19tZ3JfcGFyc2VfY21kbGluZShjb25zdCBzdGQ6OnN0cmluZyYgY21kbGluZSkgewotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBxdW90ZSA9ICciJzsKLQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiByZXN1bHQ7Ci0gICAgc2l6ZV90IGJhc2UgPSAwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIC8vIHNraXAgcXVvdGVkIHNwYW5zCi0gICAgICAgIGF1dG8gZm91bmQgPSBiYXNlOwotICAgICAgICB3aGlsZSAoKChmb3VuZCA9IGNtZGxpbmUuZmluZF9maXJzdF9vZigiIFwiIiwgZm91bmQpKSAhPSBjbWRsaW5lLm5wb3MpICYmCi0gICAgICAgICAgICAgICAoY21kbGluZVtmb3VuZF0gPT0gcXVvdGUpKSB7Ci0gICAgICAgICAgICAvLyB1bmJhbGFuY2VkIHF1b3RlIGlzIG9rCi0gICAgICAgICAgICBpZiAoKGZvdW5kID0gY21kbGluZS5maW5kKHF1b3RlLCBmb3VuZCArIDEpKSA9PSBjbWRsaW5lLm5wb3MpIGJyZWFrOwotICAgICAgICAgICAgKytmb3VuZDsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnN0cmluZyBwaWVjZTsKLSAgICAgICAgYXV0byBzb3VyY2UgPSBjbWRsaW5lLnN1YnN0cihiYXNlLCBmb3VuZCAtIGJhc2UpOwotICAgICAgICBzdGQ6OnJlbW92ZV9jb3B5KHNvdXJjZS5iZWdpbigpLCBzb3VyY2UuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcjxzdGQ6OnN0cmluZz4ocGllY2UpLCBxdW90ZSk7Ci0gICAgICAgIGF1dG8gZXF1YWxfc2lnbiA9IHBpZWNlLmZpbmQoJz0nKTsKLSAgICAgICAgaWYgKGVxdWFsX3NpZ24gPT0gcGllY2UubnBvcykgewotICAgICAgICAgICAgaWYgKCFwaWVjZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIDxrZXk+IGFuZCA8a2V5Pj0KLSAgICAgICAgICAgICAgICByZXN1bHQuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShwaWVjZSksICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5lbXBsYWNlX2JhY2socGllY2Uuc3Vic3RyKDAsIGVxdWFsX3NpZ24pLCBwaWVjZS5zdWJzdHIoZXF1YWxfc2lnbiArIDEpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm91bmQgPT0gY21kbGluZS5ucG9zKSBicmVhazsKLSAgICAgICAgYmFzZSA9IGZvdW5kICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gZnNfbWdyX3BhcnNlX3Byb2NfYm9vdGNvbmZpZygKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUpIHsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgcXVvdGUgPSAnIic7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcmVzdWx0OwotICAgIGZvciAoYXV0byYgbGluZSA6IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGNtZGxpbmUsICJcbiIpKSB7Ci0gICAgICAgIGxpbmUuZXJhc2Uoc3RkOjpyZW1vdmUobGluZS5iZWdpbigpLCBsaW5lLmVuZCgpLCBxdW90ZSksIGxpbmUuZW5kKCkpOwotICAgICAgICBhdXRvIGVxdWFsX3NpZ24gPSBsaW5lLmZpbmQoJz0nKTsKLSAgICAgICAgaWYgKGVxdWFsX3NpZ24gPT0gbGluZS5ucG9zKSB7Ci0gICAgICAgICAgICBpZiAoIWxpbmUuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiA8a2V5PiBhbmQgPGtleT49Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUobGluZSksICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soYW5kcm9pZDo6YmFzZTo6VHJpbShsaW5lLnN1YnN0cigwLCBlcXVhbF9zaWduKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlRyaW0obGluZS5zdWJzdHIoZXF1YWxfc2lnbiArIDEpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBib290Y29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYW5kcm9pZF9rZXksIHN0ZDo6c3RyaW5nKiBvdXRfdmFsKSB7Ci0gICAgRlNfTUdSX0NIRUNLKG91dF92YWwgIT0gbnVsbHB0cik7Ci0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBib290Y29uZmlnX2tleSgiYW5kcm9pZGJvb3QuIiArIGFuZHJvaWRfa2V5KTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIFtrZXksIHZhbHVlXSA6IGZzX21ncl9wYXJzZV9wcm9jX2Jvb3Rjb25maWcoYm9vdGNvbmZpZykpIHsKLSAgICAgICAgaWYgKGtleSA9PSBib290Y29uZmlnX2tleSkgewotICAgICAgICAgICAgKm91dF92YWwgPSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKm91dF92YWwgPSAiIjsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgZnNfbWdyX2dldF9ib290X2NvbmZpZ19mcm9tX2tlcm5lbChjb25zdCBzdGQ6OnN0cmluZyYgY21kbGluZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFuZHJvaWRfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfdmFsKSB7Ci0gICAgRlNfTUdSX0NIRUNLKG91dF92YWwgIT0gbnVsbHB0cik7Ci0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBjbWRsaW5lX2tleSgiYW5kcm9pZGJvb3QuIiArIGFuZHJvaWRfa2V5KTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIFtrZXksIHZhbHVlXSA6IGZzX21ncl9wYXJzZV9jbWRsaW5lKGNtZGxpbmUpKSB7Ci0gICAgICAgIGlmIChrZXkgPT0gY21kbGluZV9rZXkpIHsKLSAgICAgICAgICAgICpvdXRfdmFsID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpvdXRfdmFsID0gIiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBUcmllcyB0byBnZXQgdGhlIGdpdmVuIGJvb3QgY29uZmlnIHZhbHVlIGZyb20gYm9vdGNvbmZpZy4KLS8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgZnNfbWdyX2dldF9ib290X2NvbmZpZ19mcm9tX2Jvb3Rjb25maWdfc291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBvdXRfdmFsKSB7Ci0gICAgc3RkOjpzdHJpbmcgYm9vdGNvbmZpZzsKLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2Jvb3Rjb25maWciLCAmYm9vdGNvbmZpZykpIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIWJvb3Rjb25maWcuZW1wdHkoKSAmJiBib290Y29uZmlnLmJhY2soKSA9PSAnXG4nKSB7Ci0gICAgICAgIGJvb3Rjb25maWcucG9wX2JhY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnKGJvb3Rjb25maWcsIGtleSwgb3V0X3ZhbCk7Ci19Ci0KLS8vIFRyaWVzIHRvIGdldCB0aGUgZ2l2ZW4gYm9vdCBjb25maWcgdmFsdWUgZnJvbSBrZXJuZWwgY21kbGluZS4KLS8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgZnNfbWdyX2dldF9ib290X2NvbmZpZ19mcm9tX2tlcm5lbF9jbWRsaW5lKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBvdXRfdmFsKSB7Ci0gICAgc3RkOjpzdHJpbmcgY21kbGluZTsKLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2NtZGxpbmUiLCAmY21kbGluZSkpIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIWNtZGxpbmUuZW1wdHkoKSAmJiBjbWRsaW5lLmJhY2soKSA9PSAnXG4nKSB7Ci0gICAgICAgIGNtZGxpbmUucG9wX2JhY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9rZXJuZWwoY21kbGluZSwga2V5LCBvdXRfdmFsKTsKLX0KLQotLy8gVHJpZXMgdG8gZ2V0IHRoZSBib290IGNvbmZpZyB2YWx1ZSBpbiBkZXZpY2UgdHJlZSwgcHJvcGVydGllcyBhbmQKLS8vIGtlcm5lbCBjbWRsaW5lIChpbiB0aGF0IG9yZGVyKS4gIFJldHVybnMgJ3RydWUnIGlmIHN1Y2Nlc3NmdWxseQotLy8gZm91bmQsICdmYWxzZScgb3RoZXJ3aXNlLgotYm9vbCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBvdXRfdmFsKSB7Ci0gICAgRlNfTUdSX0NIRUNLKG91dF92YWwgIT0gbnVsbHB0cik7Ci0KLSAgICAvLyBmaXJzdGx5LCBjaGVjayB0aGUgZGV2aWNlIHRyZWUKLSAgICBpZiAoaXNfZHRfY29tcGF0aWJsZSgpKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IGdldF9hbmRyb2lkX2R0X2RpcigpICsgIi8iICsga2V5OwotICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhmaWxlX25hbWUsIG91dF92YWwpKSB7Ci0gICAgICAgICAgICBpZiAoIW91dF92YWwtPmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBvdXRfdmFsLT5wb3BfYmFjaygpOyAgLy8gVHJpbXMgdGhlIHRyYWlsaW5nICdcMCcgb3V0LgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gbmV4dCwgY2hlY2sgaWYgd2UgaGF2ZSAicm8uYm9vdCIgcHJvcGVydHkgYWxyZWFkeQotICAgICpvdXRfdmFsID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLmJvb3QuIiArIGtleSwgIiIpOwotICAgIGlmICghb3V0X3ZhbC0+ZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBuZXh0LCBjaGVjayBpZiB3ZSBoYXZlIHRoZSBwcm9wZXJ0eSBpbiBib290Y29uZmlnCi0gICAgaWYgKGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnX3NvdXJjZShrZXksIG91dF92YWwpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIGZpbmFsbHksIGZhbGxiYWNrIHRvIGtlcm5lbCBjbWRsaW5lLCBwcm9wZXJ0aWVzIG1heSBub3QgYmUgcmVhZHkgeWV0Ci0gICAgaWYgKGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9rZXJuZWxfY21kbGluZShrZXksIG91dF92YWwpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3JfZm9ybWF0LmNwcCBiL2ZzX21nci9mc19tZ3JfZm9ybWF0LmNwcAppbmRleCA3Mzg1Zjc5Li44ZTc2MTUwIDEwMDY0NAotLS0gYS9mc19tZ3IvZnNfbWdyX2Zvcm1hdC5jcHAKKysrIGIvZnNfbWdyL2ZzX21ncl9mb3JtYXQuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9sYWJlbC5oPgogI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImZzX21ncl9wcml2LmgiCiAKQEAgLTY4LDYgKzY5LDEzIEBACiAKICAgICAvKiBGb3JtYXQgdGhlIHBhcnRpdGlvbiB1c2luZyB0aGUgY2FsY3VsYXRlZCBsZW5ndGggKi8KIAorICAgIC8vIEVYVDQgc3VwcG9ydHMgNEsgYmxvY2sgc2l6ZSBvbiAxNksgcGFnZSBzaXplcy4gQSA0SyBibG9jaworICAgIC8vIHNpemUgZm9ybWF0dGVkIEVYVDQgcGFydGl0aW9uIHdpbGwgbW91bnQgZmluZSBvbiBib3RoIDRLIGFuZCAxNksgcGFnZQorICAgIC8vIHNpemUga2VybmVscy4KKyAgICAvLyBIb3dldmVyLCBFWFQ0IGRvZXMgbm90IHN1cHBvcnQgMTZLIGJsb2NrIHNpemUgb24gNEsgc3lzdGVtcy4KKyAgICAvLyBJZiB3ZSB3YW50IHRoZSBzYW1lIHVzZXJzcGFjZSBjb2RlIHRvIHdvcmsgb24gYm90aCA0ay8xNmsga2VybmVscywKKyAgICAvLyB1c2luZyBhIGhhcmRjb2RlZCA0MDk2IGJsb2NrIHNpemUgaXMgYSBzaW1wbGUgc29sdXRpb24uIFVzaW5nCisgICAgLy8gZ2V0cGFnZXNpemUoKSBoZXJlIHdvdWxkIHdvcmsgYXMgd2VsbCwgYnV0IDQwOTYgaXMgc2ltcGxlci4KICAgICBzdGQ6OnN0cmluZyBzaXplX3N0ciA9IHN0ZDo6dG9fc3RyaW5nKGRldl9zeiAvIDQwOTYpOwogCiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IG1rZTJmc19hcmdzID0geyIvc3lzdGVtL2Jpbi9ta2UyZnMiLCAiLXQiLCAiZXh0NCIsICItYiIsICI0MDk2In07CkBAIC0xMjcsNyArMTM1LDggQEAKIAogICAgIC8qIEZvcm1hdCB0aGUgcGFydGl0aW9uIHVzaW5nIHRoZSBjYWxjdWxhdGVkIGxlbmd0aCAqLwogCi0gICAgc3RkOjpzdHJpbmcgc2l6ZV9zdHIgPSBzdGQ6OnRvX3N0cmluZyhkZXZfc3ogLyA0MDk2KTsKKyAgICBjb25zdCBhdXRvIHNpemVfc3RyID0gc3RkOjp0b19zdHJpbmcoZGV2X3N6IC8gZ2V0cGFnZXNpemUoKSk7CisgICAgc3RkOjpzdHJpbmcgYmxvY2tfc2l6ZSA9IHN0ZDo6dG9fc3RyaW5nKGdldHBhZ2VzaXplKCkpOwogCiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGFyZ3MgPSB7Ii9zeXN0ZW0vYmluL21ha2VfZjJmcyIsICItZyIsICJhbmRyb2lkIn07CiAgICAgaWYgKG5lZWRzX3Byb2ppZCkgewpAQCAtMTQ2LDYgKzE1NSwxMCBAQAogICAgICAgICBhcmdzLnB1c2hfYmFjaygiLU8iKTsKICAgICAgICAgYXJncy5wdXNoX2JhY2soImV4dHJhX2F0dHIiKTsKICAgICB9CisgICAgYXJncy5wdXNoX2JhY2soIi13Iik7CisgICAgYXJncy5wdXNoX2JhY2soYmxvY2tfc2l6ZS5jX3N0cigpKTsKKyAgICBhcmdzLnB1c2hfYmFjaygiLWIiKTsKKyAgICBhcmdzLnB1c2hfYmFjayhibG9ja19zaXplLmNfc3RyKCkpOwogICAgIGlmICghem9uZWRfZGV2aWNlLmVtcHR5KCkpIHsKICAgICAgICAgYXJncy5wdXNoX2JhY2soIi1jIik7CiAgICAgICAgIGFyZ3MucHVzaF9iYWNrKHpvbmVkX2RldmljZS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzLmNwcCBiL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0OWMyMC4uMDAwMDAwMAotLS0gYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvbW91bnQuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNpbmNsdWRlIDxzeXMvdmZzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgotI2luY2x1ZGUgPGZzX21nci5oPgotI2luY2x1ZGUgPGZzX21nci9maWxlX3dhaXQuaD4KLSNpbmNsdWRlIDxmc19tZ3JfZG1fbGluZWFyLmg+Ci0jaW5jbHVkZSA8ZnNfbWdyX292ZXJsYXlmcy5oPgotI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+Ci0jaW5jbHVkZSA8bGliZG0vZG0uaD4KLSNpbmNsdWRlIDxsaWJmaWVtYXAvaW1hZ2VfbWFuYWdlci5oPgotI2luY2x1ZGUgPGxpYmdzaS9saWJnc2kuaD4KLSNpbmNsdWRlIDxsaWJscC9idWlsZGVyLmg+Ci0jaW5jbHVkZSA8bGlibHAvbGlibHAuaD4KLSNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KLQotI2luY2x1ZGUgImZzX21ncl9wcml2LmgiCi0jaW5jbHVkZSAiZnNfbWdyX3ByaXZfb3ZlcmxheWZzLmgiCi0jaW5jbHVkZSAibGliZmllbWFwL3V0aWxpdHkuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDo6bGl0ZXJhbHM7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZG07Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZnNfbWdyOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnN0b3JhZ2VfbGl0ZXJhbHM7Ci11c2luZyBhbmRyb2lkOjpmaWVtYXA6OkZpbGVzeXN0ZW1IYXNSZWxpYWJsZVBpbm5pbmc7Ci11c2luZyBhbmRyb2lkOjpmaWVtYXA6OklJbWFnZU1hbmFnZXI7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciBjaGFyIGtEYXRhU2NyYXRjaFNpemVNYlByb3BbXSA9ICJmc19tZ3Iub3ZlcmxheWZzLmRhdGFfc2NyYXRjaF9zaXplX21iIjsKLWNvbnN0ZXhwciBjaGFyIGtQcmVmZXJDYWNoZUJhY2tpbmdTdG9yYWdlUHJvcFtdID0gImZzX21nci5vdmVybGF5ZnMucHJlZmVyX2NhY2hlX2JhY2tpbmdfc3RvcmFnZSI7Ci0KLWJvb2wgZnNfbWdyX2FjY2Vzcyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIHJldHVybiBhY2Nlc3MocGF0aC5jX3N0cigpLCBGX09LKSA9PSAwOwotfQotCi1jb25zdCBhdXRvIGtMb3dlcmRpck9wdGlvbiA9ICJsb3dlcmRpcj0iczsKLWNvbnN0IGF1dG8ga1VwcGVyZGlyT3B0aW9uID0gInVwcGVyZGlyPSJzOwotCi1ib29sIGZzX21ncl9pbl9yZWNvdmVyeSgpIHsKLSAgICAvLyBDaGVjayB0aGUgZXhpc3RlbmNlIG9mIHJlY292ZXJ5IGJpbmFyeSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBjb21waWxlIHRpbWUKLSAgICAvLyBfX0FORFJPSURfUkVDT1ZFUllfXyBtYWNyby4KLSAgICAvLyBJZiBCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QgaXMgdHJ1ZSwgYm90aCBub3JtYWwgYW5kIHJlY292ZXJ5IGJvb3QKLSAgICAvLyBtb2RlIHdvdWxkIHVzZSB0aGUgc2FtZSBpbml0IGJpbmFyeSwgd2hpY2ggd291bGQgbWVhbiBkdXJpbmcgbm9ybWFsIGJvb3QKLSAgICAvLyB0aGUgJy9pbml0JyBiaW5hcnkgaXMgYWN0dWFsbHkgYSBzeW1saW5rIHBvaW50aW5nIHRvCi0gICAgLy8gaW5pdF9zZWNvbmRfc3RhZ2UucmVjb3ZlcnksIHdoaWNoIHdvdWxkIGJlIGNvbXBpbGVkIHdpdGgKLSAgICAvLyBfX0FORFJPSURfUkVDT1ZFUllfXyBkZWZpbmVkLgotICAgIHJldHVybiBmc19tZ3JfYWNjZXNzKCIvc3lzdGVtL2Jpbi9yZWNvdmVyeSIpOwotfQotCi1ib29sIGZzX21ncl9pc19kc3VfcnVubmluZygpIHsKLSAgICAvLyBTaW5jZSBhbmRyb2lkOjpnc2k6OkNhbkJvb3RJbnRvR3NpKCkgb3IgYW5kcm9pZDo6Z3NpOjpNYXJrU3lzdGVtQXNHc2koKSBpcwotICAgIC8vIG5ldmVyIGNhbGxlZCBpbiByZWNvdmVyeSwgdGhlIHJldHVybiB2YWx1ZSBvZiBhbmRyb2lkOjpnc2k6OklzR3NpUnVubmluZygpCi0gICAgLy8gaXMgbm90IHdlbGwtZGVmaW5lZC4gSW4gdGhpcyBjYXNlLCBqdXN0IHJldHVybiBmYWxzZSBhcyBiZWluZyBpbiByZWNvdmVyeQotICAgIC8vIGltcGxpZXMgbm90IHJ1bm5pbmcgYSBEU1Ugc3lzdGVtLgotICAgIGlmIChmc19tZ3JfaW5fcmVjb3ZlcnkoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBhbmRyb2lkOjpnc2k6OklzR3NpUnVubmluZygpOwotfQotCi0vLyBsaXN0IG9mIGFjY2VwdGFibGUgb3ZlcmxheWZzIGJhY2tpbmcgc3RvcmFnZQotY29uc3QgYXV0byBrU2NyYXRjaE1vdW50UG9pbnQgPSAiL21udC9zY3JhdGNoInM7Ci1jb25zdCBhdXRvIGtDYWNoZU1vdW50UG9pbnQgPSAiL2NhY2hlInM7Ci0KLWJvb2wgSXNBQkRldmljZSgpIHsKLSAgICByZXR1cm4gIWFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5ib290LnNsb3Rfc3VmZml4IiwgIiIpLmVtcHR5KCk7Ci19Ci0KLXN0ZDo6dmVjdG9yPGNvbnN0IHN0ZDo6c3RyaW5nPiBPdmVybGF5TW91bnRQb2ludHMoKSB7Ci0gICAgLy8gTmV2ZXIgZmFsbGJhY2sgdG8gbGVnYWN5IGNhY2hlIG1vdW50IHBvaW50IGlmIHdpdGhpbiBhIERTVSBzeXN0ZW0sCi0gICAgLy8gYmVjYXVzZSBydW5uaW5nIGEgRFNVIHN5c3RlbSBpbXBsaWVzIHRoZSBkZXZpY2Ugc3VwcG9ydHMgZHluYW1pYwotICAgIC8vIHBhcnRpdGlvbnMsIHdoaWNoIG1lYW5zIGxlZ2FjeSBjYWNoZSBtdXN0bid0IGJlIHVzZWQuCi0gICAgaWYgKGZzX21ncl9pc19kc3VfcnVubmluZygpKSB7Ci0gICAgICAgIHJldHVybiB7a1NjcmF0Y2hNb3VudFBvaW50fTsKLSAgICB9Ci0KLSAgICAvLyBGb3Igbm9uLUEvQiBkZXZpY2VzIHByZWZlciBjYWNoZSBiYWNraW5nIHN0b3JhZ2UgaWYKLSAgICAvLyBrUHJlZmVyQ2FjaGVCYWNraW5nU3RvcmFnZVByb3AgcHJvcGVydHkgc2V0LgotICAgIGlmICghSXNBQkRldmljZSgpICYmIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eShrUHJlZmVyQ2FjaGVCYWNraW5nU3RvcmFnZVByb3AsIGZhbHNlKSAmJgotICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8udmVuZG9yLmFwaV9sZXZlbCIsIC0xKSA8IF9fQU5EUk9JRF9BUElfVF9fKSB7Ci0gICAgICAgIHJldHVybiB7a0NhY2hlTW91bnRQb2ludCwga1NjcmF0Y2hNb3VudFBvaW50fTsKLSAgICB9Ci0KLSAgICByZXR1cm4ge2tTY3JhdGNoTW91bnRQb2ludCwga0NhY2hlTW91bnRQb2ludH07Ci19Ci0KLS8vIFJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgaXMgbW91bnRlZCwgYnV0IGJlZm9yZSBhZGIgaXMgc3RhcnRlZC4gIFJpZ2h0Ci0vLyBhZnRlciAndHJpZ2dlciBsb2FkX3BlcnNpc3RfcHJvcHNfYWN0aW9uJyBpcyBkb25lLgotYm9vbCBmc19tZ3JfYm9vdF9jb21wbGV0ZWQoKSB7Ci0gICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8ucGVyc2lzdGVudF9wcm9wZXJ0aWVzLnJlYWR5IiwgZmFsc2UpOwotfQotCi1ib29sIGZzX21ncl9pc19kaXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICByZXR1cm4gIXN0YXQocGF0aC5jX3N0cigpLCAmc3QpICYmIFNfSVNESVIoc3Quc3RfbW9kZSk7Ci19Ci0KLWJvb2wgZnNfbWdyX3J3X2FjY2Vzcyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIGlmIChwYXRoLmVtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSyB8IFdfT0spID09IDA7Ci19Ci0KLS8vIEF0IGxlc3MgdGhhbiAxJSBvciA4TUIgb2YgZnJlZSBzcGFjZSByZXR1cm4gdmFsdWUgb2YgZmFsc2UsCi0vLyBtZWFucyB3ZSB3aWxsIHRyeSB0byB3cmFwIHdpdGggb3ZlcmxheWZzLgotYm9vbCBmc19tZ3JfZmlsZXN5c3RlbV9oYXNfc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7Ci0gICAgLy8gSWYgd2UgaGF2ZSBhY2Nlc3MgaXNzdWVzIHRvIGZpbmQgb3V0IHNwYWNlIHJlbWFpbmluZywgcmV0dXJuIHRydWUKLSAgICAvLyB0byBwcmV2ZW50IHVzIHRyeWluZyB0byBvdmVycmlkZSB3aXRoIG92ZXJsYXlmcy4KLSAgICBzdHJ1Y3Qgc3RhdHZmcyB2c3Q7Ci0gICAgaWYgKHN0YXR2ZnMobW91bnRfcG9pbnQuY19zdHIoKSwgJnZzdCkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgInN0YXR2ZnMgIiA8PCBtb3VudF9wb2ludDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1BlcmNlbnRUaHJlc2hvbGQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLy8gMSUKLSAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGxvbmcga1NpemVUaHJlc2hvbGQgPSA4ICogMTAyNCAqIDEwMjQ7ICAvLyA4TUIKLQotICAgIHJldHVybiAodnN0LmZfYmZyZWUgPj0gKHZzdC5mX2Jsb2NrcyAqIGtQZXJjZW50VGhyZXNob2xkIC8gMTAwKSkgJiYKLSAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90Pih2c3QuZl9iZnJlZSkgKiB2c3QuZl9mcnNpemUpID49IGtTaXplVGhyZXNob2xkOwotfQotCi1jb25zdCBhdXRvIGtQaHlzaWNhbERldmljZSA9ICIvZGV2L2Jsb2NrL2J5LW5hbWUvInM7Ci1jb25zdGV4cHIgY2hhciBrU2NyYXRjaEltYWdlTWV0YWRhdGFbXSA9ICIvbWV0YWRhdGEvZ3NpL3JlbW91bnQvbHBfbWV0YWRhdGEiOwotCi0vLyBOb3RlOiB0aGlzIGlzIG1lYW50IG9ubHkgZm9yIHJlY292ZXJ5L2ZpcnN0LXN0YWdlIGluaXQuCi1ib29sIFNjcmF0Y2hJc09uRGF0YSgpIHsKLSAgICAvLyBUaGUgc2NyYXRjaCBwYXJ0aXRpb24gb2YgRFNVIGlzIG1hbmFnZWQgYnkgZ3NpZC4KLSAgICBpZiAoZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gZnNfbWdyX2FjY2VzcyhrU2NyYXRjaEltYWdlTWV0YWRhdGEpOwotfQotCi1ib29sIGZzX21ncl91cGRhdGVfYmxrX2RldmljZShGc3RhYkVudHJ5KiBlbnRyeSkgewotICAgIGlmIChlbnRyeS0+ZnNfbWdyX2ZsYWdzLmxvZ2ljYWwpIHsKLSAgICAgICAgZnNfbWdyX3VwZGF0ZV9sb2dpY2FsX3BhcnRpdGlvbihlbnRyeSk7Ci0gICAgfQotICAgIGlmIChmc19tZ3JfYWNjZXNzKGVudHJ5LT5ibGtfZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGVudHJ5LT5ibGtfZGV2aWNlICE9ICIvZGV2L3Jvb3QiKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHN5c3RlbS1hcy1yb290ICh0YWltZW4gYW5kIG90aGVycykKLSAgICBhdXRvIGJsa19kZXZpY2UgPSBrUGh5c2ljYWxEZXZpY2UgKyAic3lzdGVtIjsKLSAgICBpZiAoIWZzX21ncl9hY2Nlc3MoYmxrX2RldmljZSkpIHsKLSAgICAgICAgYmxrX2RldmljZSArPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7Ci0gICAgICAgIGlmICghZnNfbWdyX2FjY2VzcyhibGtfZGV2aWNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVudHJ5LT5ibGtfZGV2aWNlID0gYmxrX2RldmljZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBmc19tZ3JfaGFzX3NoYXJlZF9ibG9ja3MoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2KSB7Ci0gICAgc3RydWN0IHN0YXRmcyBmczsKLSAgICBpZiAoKHN0YXRmcygobW91bnRfcG9pbnQgKyAiL2xvc3QrZm91bmQiKS5jX3N0cigpLCAmZnMpID09IC0xKSB8fAotICAgICAgICAoZnMuZl90eXBlICE9IEVYVDRfU1VQRVJfTUFHSUMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQob3BlbihkZXYuY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKLSAgICBpZiAoZmQgPCAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayBzYjsKLSAgICBpZiAoKFRFTVBfRkFJTFVSRV9SRVRSWShsc2VlazY0KGZkLCAxMDI0LCBTRUVLX1NFVCkpIDwgMCkgfHwKLSAgICAgICAgKFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCAmc2IsIHNpemVvZihzYikpKSA8IDApKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgZnNfaW5mbyBpbmZvOwotICAgIGlmIChleHQ0X3BhcnNlX3NiKCZzYiwgJmluZm8pIDwgMCkgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIChpbmZvLmZlYXRfcm9fY29tcGF0ICYgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TSEFSRURfQkxPQ0tTKSAhPSAwOwotfQotCi0jZGVmaW5lIEYyRlNfU1VQRVJfT0ZGU0VUIDEwMjQKLSNkZWZpbmUgRjJGU19GRUFUVVJFX09GRlNFVCAyMTgwCi0jZGVmaW5lIEYyRlNfRkVBVFVSRV9STyAweDQwMDAKLWJvb2wgZnNfbWdyX2lzX3JlYWRfb25seV9mMmZzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXYpIHsKLSAgICBpZiAoIWZzX21ncl9pc19mMmZzKGRldikpIHJldHVybiBmYWxzZTsKLQotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChvcGVuKGRldi5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOwotICAgIGlmIChmZCA8IDApIHJldHVybiBmYWxzZTsKLQotICAgIF9fbGUzMiBmZWF0OwotICAgIGlmICgoVEVNUF9GQUlMVVJFX1JFVFJZKGxzZWVrNjQoZmQsIEYyRlNfU1VQRVJfT0ZGU0VUICsgRjJGU19GRUFUVVJFX09GRlNFVCwgU0VFS19TRVQpKSA8IDApIHx8Ci0gICAgICAgIChURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgJmZlYXQsIHNpemVvZihmZWF0KSkpIDwgMCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiAoZmVhdCAmIGNwdV90b19sZTMyKEYyRlNfRkVBVFVSRV9STykpICE9IDA7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19lbmFibGVkKEZzdGFiRW50cnkqIGVudHJ5KSB7Ci0gICAgLy8gcmVhZG9ubHkgZmlsZXN5c3RlbSwgY2FuIG5vdCBiZSBtb3VudCAtbyByZW1vdW50LHJ3Ci0gICAgLy8gZm9yIHNxdWFzaGZzLCBlcm9mcyBvciBpZiBmcmVlIHNwYWNlIGlzIChuZWFyKSB6ZXJvIG1ha2luZyBzdWNoIGEgcmVtb3VudAotICAgIC8vIHZpcnR1YWxseSB1c2VsZXNzLCBvciBpZiB0aGVyZSBhcmUgc2hhcmVkIGJsb2NrcyB0aGF0IHByZXZlbnQgcmVtb3VudCxydwotICAgIGlmICghZnNfbWdyX2ZpbGVzeXN0ZW1faGFzX3NwYWNlKGVudHJ5LT5tb3VudF9wb2ludCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gYmxrX2RldmljZSBuZWVkcyB0byBiZSBzZXR1cCBzbyB3ZSBjYW4gY2hlY2sgc3VwZXJibG9jay4KLSAgICAvLyBJZiB3ZSBmYWlsIGhlcmUsIGJlY2F1c2UgZHVyaW5nIGluaXQgZmlyc3Qgc3RhZ2UgYW5kIGhhdmUgZG91YnRzLgotICAgIGlmICghZnNfbWdyX3VwZGF0ZV9ibGtfZGV2aWNlKGVudHJ5KSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBmMmZzIHJlYWQtb25seSBtb2RlIGRvZXNuJ3Qgc3VwcG9ydCByZW1vdW50LHJ3Ci0gICAgaWYgKGZzX21ncl9pc19yZWFkX29ubHlfZjJmcyhlbnRyeS0+YmxrX2RldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgaWYgZXh0NCBkZS1kdXBlCi0gICAgYXV0byBoYXNfc2hhcmVkX2Jsb2NrcyA9IGZzX21ncl9oYXNfc2hhcmVkX2Jsb2NrcyhlbnRyeS0+bW91bnRfcG9pbnQsIGVudHJ5LT5ibGtfZGV2aWNlKTsKLSAgICBpZiAoIWhhc19zaGFyZWRfYmxvY2tzICYmIChlbnRyeS0+bW91bnRfcG9pbnQgPT0gIi9zeXN0ZW0iKSkgewotICAgICAgICBoYXNfc2hhcmVkX2Jsb2NrcyA9IGZzX21ncl9oYXNfc2hhcmVkX2Jsb2NrcygiLyIsIGVudHJ5LT5ibGtfZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc19zaGFyZWRfYmxvY2tzOwotfQotCi1ib29sIGZzX21ncl9ybV9hbGwoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGJvb2wqIGNoYW5nZSA9IG51bGxwdHIsIGludCBsZXZlbCA9IDApIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RElSLCBkZWNsdHlwZSgmY2xvc2VkaXIpPiBkaXIob3BlbmRpcihwYXRoLmNfc3RyKCkpLCBjbG9zZWRpcik7Ci0gICAgaWYgKCFkaXIpIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgUEVSUk9SIDw8ICJvcGVuZGlyICIgPDwgcGF0aCA8PCAiIGRlcHRoPSIgPDwgbGV2ZWw7Ci0gICAgICAgIGlmICgoZXJybm8gPT0gRVBFUk0pICYmIChsZXZlbCAhPSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBkaXJlbnQqIGVudHJ5OwotICAgIGF1dG8gcmV0ID0gdHJ1ZTsKLSAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIuZ2V0KCkpKSkgewotICAgICAgICBpZiAoKCIuInMgPT0gZW50cnktPmRfbmFtZSkgfHwgKCIuLiJzID09IGVudHJ5LT5kX25hbWUpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byBmaWxlID0gcGF0aCArICIvIiArIGVudHJ5LT5kX25hbWU7Ci0gICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX1VOS05PV04pIHsKLSAgICAgICAgICAgIHN0cnVjdCBzdGF0IHN0OwotICAgICAgICAgICAgaWYgKCFsc3RhdChmaWxlLmNfc3RyKCksICZzdCkgJiYgKHN0LnN0X21vZGUgJiBTX0lGRElSKSkgZW50cnktPmRfdHlwZSA9IERUX0RJUjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9ESVIpIHsKLSAgICAgICAgICAgIHJldCAmPSBmc19tZ3Jfcm1fYWxsKGZpbGUsIGNoYW5nZSwgbGV2ZWwgKyAxKTsKLSAgICAgICAgICAgIGlmICghcm1kaXIoZmlsZS5jX3N0cigpKSkgewotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UpICpjaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKSByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBQRVJST1IgPDwgInJtZGlyICIgPDwgZmlsZSA8PCAiIGRlcHRoPSIgPDwgbGV2ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXVubGluayhmaWxlLmNfc3RyKCkpKSB7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlKSAqY2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpIHJldCA9IGZhbHNlOwotICAgICAgICAgICAgUEVSUk9SIDw8ICJybSAiIDw8IGZpbGUgPDwgIiBkZXB0aD0iIDw8IGxldmVsOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWNvbnN0IGF1dG8ga1VwcGVyTmFtZSA9ICJ1cHBlciJzOwotY29uc3QgYXV0byBrV29ya05hbWUgPSAid29yayJzOwotY29uc3QgYXV0byBrT3ZlcmxheVRvcERpciA9ICIvb3ZlcmxheSJzOwotCi1zdGQ6OnN0cmluZyBmc19tZ3JfZ2V0X292ZXJsYXlmc19jYW5kaWRhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7Ci0gICAgaWYgKCFmc19tZ3JfaXNfZGlyKG1vdW50X3BvaW50KSkgcmV0dXJuICIiOwotICAgIGNvbnN0IGF1dG8gYmFzZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKG1vdW50X3BvaW50KSArICIvIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIG92ZXJsYXlfbW91bnRfcG9pbnQgOiBPdmVybGF5TW91bnRQb2ludHMoKSkgewotICAgICAgICBhdXRvIGRpciA9IG92ZXJsYXlfbW91bnRfcG9pbnQgKyBrT3ZlcmxheVRvcERpciArICIvIiArIGJhc2U7Ci0gICAgICAgIGF1dG8gdXBwZXIgPSBkaXIgKyBrVXBwZXJOYW1lOwotICAgICAgICBpZiAoIWZzX21ncl9pc19kaXIodXBwZXIpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byB3b3JrID0gZGlyICsga1dvcmtOYW1lOwotICAgICAgICBpZiAoIWZzX21ncl9pc19kaXIod29yaykpIGNvbnRpbnVlOwotICAgICAgICBpZiAoIWZzX21ncl9yd19hY2Nlc3Mod29yaykpIGNvbnRpbnVlOwotICAgICAgICByZXR1cm4gZGlyOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBLZXJuZWxTdXBwb3J0c1VzZXJYYXR0cnMoKSB7Ci0gICAgc3RydWN0IHV0c25hbWUgdXRzOwotICAgIHVuYW1lKCZ1dHMpOwotCi0gICAgaW50IG1ham9yLCBtaW5vcjsKLSAgICBpZiAoc3NjYW5mKHV0cy5yZWxlYXNlLCAiJWQuJWQiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBtYWpvciA+IDUgfHwgKG1ham9yID09IDUgJiYgbWlub3IgPj0gMTUpOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyBmc19tZ3JfbW91bnRfcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7Ci0gICAgaWYgKCIvInMgIT0gbW91bnRfcG9pbnQpIHJldHVybiBtb3VudF9wb2ludDsKLSAgICByZXR1cm4gIi9zeXN0ZW0iOwotfQotCi0vLyBkZWZhdWx0IG9wdGlvbnMgZm9yIG1vdW50X3BvaW50LCByZXR1cm5zIGVtcHR5IHN0cmluZyBmb3Igbm9uZSBhdmFpbGFibGUuCi1zdGQ6OnN0cmluZyBmc19tZ3JfZ2V0X292ZXJsYXlmc19vcHRpb25zKGNvbnN0IEZzdGFiRW50cnkmIGVudHJ5KSB7Ci0gICAgY29uc3QgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChlbnRyeS5tb3VudF9wb2ludCk7Ci0gICAgYXV0byBjYW5kaWRhdGUgPSBmc19tZ3JfZ2V0X292ZXJsYXlmc19jYW5kaWRhdGUobW91bnRfcG9pbnQpOwotICAgIGlmIChjYW5kaWRhdGUuZW1wdHkoKSkgcmV0dXJuICIiOwotICAgIGF1dG8gcmV0ID0ga0xvd2VyZGlyT3B0aW9uICsgbW91bnRfcG9pbnQgKyAiLCIgKyBrVXBwZXJkaXJPcHRpb24gKyBjYW5kaWRhdGUgKyBrVXBwZXJOYW1lICsKLSAgICAgICAgICAgICAgICIsd29ya2Rpcj0iICsgY2FuZGlkYXRlICsga1dvcmtOYW1lOwotICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX3ZhbGlkKCkgPT0gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtPdmVycmlkZUNyZWRzUmVxdWlyZWQpIHsKLSAgICAgICAgcmV0ICs9ICIsb3ZlcnJpZGVfY3JlZHM9b2ZmIjsKLSAgICB9Ci0gICAgaWYgKEtlcm5lbFN1cHBvcnRzVXNlclhhdHRycygpKSB7Ci0gICAgICAgIHJldCArPSAiLHVzZXJ4YXR0ciI7Ci0gICAgfQotICAgIGZvciAoY29uc3QgYXV0byYgZmxhZyA6IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGVudHJ5LmZzX29wdGlvbnMsICIsIikpIHsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZmxhZywgImNvbnRleHQ9IikpIHsKLSAgICAgICAgICAgIHJldCArPSAiLCIgKyBmbGFnOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWNvbnN0ZXhwciBjaGFyIGtPdmVybGF5ZnNGaWxlQ29udGV4dFtdID0gInU6b2JqZWN0X3I6b3ZlcmxheWZzX2ZpbGU6czAiOwotCi1jbGFzcyBBdXRvU2V0RnNDcmVhdGVDb24gZmluYWwgewotICBwdWJsaWM6Ci0gICAgQXV0b1NldEZzQ3JlYXRlQ29uKCkge30KLSAgICBBdXRvU2V0RnNDcmVhdGVDb24oY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRleHQpIHsgU2V0KGNvbnRleHQpOyB9Ci0gICAgfkF1dG9TZXRGc0NyZWF0ZUNvbigpIHsgUmVzdG9yZSgpOyB9Ci0KLSAgICBib29sIE9rKCkgY29uc3QgeyByZXR1cm4gb2tfOyB9Ci0gICAgYm9vbCBTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNldGZzY3JlYXRlY29uKGNvbnRleHQuY19zdHIoKSkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiAiIDw8IGNvbnRleHQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgb2tfID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGJvb2wgUmVzdG9yZSgpIHsKLSAgICAgICAgaWYgKHJlc3RvcmVkXyB8fCAhb2tfKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2V0ZnNjcmVhdGVjb24obnVsbHB0cikpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiBudWxsIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXN0b3JlZF8gPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBib29sIG9rXyA9IGZhbHNlOwotICAgIGJvb2wgcmVzdG9yZWRfID0gZmFsc2U7Ci19OwotCi1zdGQ6OnN0cmluZyBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwX2Rpcihjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSB7Ci0gICAgYXV0byB0b3AgPSBkaXIgKyBrT3ZlcmxheVRvcERpcjsKLQotICAgIEF1dG9TZXRGc0NyZWF0ZUNvbiBjcmVhdGVjb24oa092ZXJsYXlmc0ZpbGVDb250ZXh0KTsKLSAgICBpZiAoIWNyZWF0ZWNvbi5PaygpKSB7Ci0gICAgICAgIHJldHVybiB7fTsKLSAgICB9Ci0gICAgaWYgKG1rZGlyKHRvcC5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgewotICAgICAgICBQRVJST1IgPDwgIm1rZGlyICIgPDwgdG9wOwotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotICAgIGlmICghY3JlYXRlY29uLlJlc3RvcmUoKSkgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotICAgIHJldHVybiB0b3A7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cF9vbmUoY29uc3Qgc3RkOjpzdHJpbmcmIG92ZXJsYXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QpIHsKLSAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQobW91bnRfcG9pbnQpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBhdXRvIGZzcmVjX21vdW50X3BvaW50ID0gb3ZlcmxheSArICIvIiArIGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKG1vdW50X3BvaW50KSArICIvIjsKLQotICAgIEF1dG9TZXRGc0NyZWF0ZUNvbiBjcmVhdGVjb24oa092ZXJsYXlmc0ZpbGVDb250ZXh0KTsKLSAgICBpZiAoIWNyZWF0ZWNvbi5PaygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1rZGlyKGZzcmVjX21vdW50X3BvaW50LmNfc3RyKCksIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7Ci0gICAgICAgIFBFUlJPUiA8PCAibWtkaXIgIiA8PCBmc3JlY19tb3VudF9wb2ludDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobWtkaXIoKGZzcmVjX21vdW50X3BvaW50ICsga1dvcmtOYW1lKS5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgewotICAgICAgICBQRVJST1IgPDwgIm1rZGlyICIgPDwgZnNyZWNfbW91bnRfcG9pbnQgPDwga1dvcmtOYW1lOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghY3JlYXRlY29uLlJlc3RvcmUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY3JlYXRlY29uID0ge307Ci0KLSAgICBhdXRvIG5ld19jb250ZXh0ID0gZnNfbWdyX2dldF9jb250ZXh0KG1vdW50X3BvaW50KTsKLSAgICBpZiAobmV3X2NvbnRleHQuZW1wdHkoKSB8fCAhY3JlYXRlY29uLlNldChuZXdfY29udGV4dCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGF1dG8gdXBwZXIgPSBmc3JlY19tb3VudF9wb2ludCArIGtVcHBlck5hbWU7Ci0gICAgaWYgKG1rZGlyKHVwcGVyLmNfc3RyKCksIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7Ci0gICAgICAgIFBFUlJPUiA8PCAibWtkaXIgIiA8PCB1cHBlcjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh3YW50X3JlYm9vdCkgKndhbnRfcmVib290ID0gdHJ1ZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi11aW50MzJfdCBmc19tZ3Jfb3ZlcmxheWZzX3Nsb3RfbnVtYmVyKCkgewotICAgIHJldHVybiBTbG90TnVtYmVyRm9yU2xvdFN1ZmZpeChmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCkpOwotfQotCi1zdGQ6OnN0cmluZyBmc19tZ3Jfb3ZlcmxheWZzX3N1cGVyX2RldmljZSh1aW50MzJfdCBzbG90X251bWJlcikgewotICAgIHJldHVybiBrUGh5c2ljYWxEZXZpY2UgKyBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKHNsb3RfbnVtYmVyKTsKLX0KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX2hhc19sb2dpY2FsKGNvbnN0IEZzdGFiJiBmc3RhYikgewotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc3RhYikgewotICAgICAgICBpZiAoZW50cnkuZnNfbWdyX2ZsYWdzLmxvZ2ljYWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIGltbWVkaWF0ZSB1bm1vdW50IHN1Y2NlZWRlZCBhbmQgdGhlIHNjcmF0Y2ggbW91bnQgcG9pbnQgd2FzCi0vLyByZW1vdmVkLgotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCkgewotICAgIGlmICh1bW91bnQoa1NjcmF0Y2hNb3VudFBvaW50LmNfc3RyKCkpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAocm1kaXIoa1NjcmF0Y2hNb3VudFBvaW50LmNfc3RyKCkpICE9IDAgJiYgZXJybm8gIT0gRU5PRU5UKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJybWRpciAiIDw8IGtTY3JhdGNoTW91bnRQb2ludDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLU92ZXJsYXlmc1RlYXJkb3duUmVzdWx0IFRlYXJkb3duRGF0YVNjcmF0Y2goSUltYWdlTWFuYWdlciogaW1hZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGJvb2wgd2FzX21vdW50ZWQpIHsKLSAgICBpZiAoIWltYWdlcykgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOwotICAgIH0KLSAgICBpZiAoIWltYWdlcy0+RGlzYWJsZUltYWdlKHBhcnRpdGlvbl9uYW1lKSkgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOwotICAgIH0KLSAgICBpZiAod2FzX21vdW50ZWQpIHsKLSAgICAgICAgLy8gSWYgb3ZlcmxheWZzIHdhcyBtb3VudGVkLCBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIHVubWFwIHNpbmNlCi0gICAgICAgIC8vIGl0J2xsIGZhaWwgYW5kIGNyZWF0ZSBlcnJvciBzcGFtLgotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkJ1c3k7Ci0gICAgfQotICAgIGlmICghaW1hZ2VzLT5Vbm1hcEltYWdlSWZFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6QnVzeTsKLSAgICB9Ci0gICAgaWYgKCFpbWFnZXMtPkRlbGV0ZUJhY2tpbmdJbWFnZShwYXJ0aXRpb25fbmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpCdXN5OwotICAgIH0KLSAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOwotfQotCi1PdmVybGF5ZnNUZWFyZG93blJlc3VsdCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX3NjcmF0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIG92ZXJsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogY2hhbmdlKSB7Ci0gICAgLy8gdW1vdW50IGFuZCBkZWxldGUga1NjcmF0Y2hNb3VudFBvaW50IHN0b3JhZ2UgaWYgd2UgaGF2ZSBsb2dpY2FsIHBhcnRpdGlvbnMKLSAgICBpZiAob3ZlcmxheSAhPSBrU2NyYXRjaE1vdW50UG9pbnQpIHsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0aW9uIGNoZWNrLgotICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgewotICAgICAgICBMRVJST1IgPDwgIkRlc3Ryb3lpbmcgRFNVIHNjcmF0Y2ggaXMgbm90IGFsbG93ZWQuIjsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpFcnJvcjsKLSAgICB9Ci0KLSAgICBib29sIHdhc19tb3VudGVkID0gZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoa1NjcmF0Y2hNb3VudFBvaW50LCBmYWxzZSk7Ci0gICAgaWYgKHdhc19tb3VudGVkKSB7Ci0gICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKTsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKLQotICAgIGF1dG8gaW1hZ2VzID0gSUltYWdlTWFuYWdlcjo6T3BlbigicmVtb3VudCIsIDEwcyk7Ci0gICAgaWYgKGltYWdlcyAmJiBpbWFnZXMtPkJhY2tpbmdJbWFnZUV4aXN0cyhwYXJ0aXRpb25fbmFtZSkpIHsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBjaGVjayBzdXBlciBwYXJ0aXRpb24sIGlmIHdlIGtuZXcgd2UgaGFkIGEgc2NyYXRjaCBkZXZpY2UKLSAgICAgICAgLy8gaW4gL2RhdGEuCi0gICAgICAgIHJldHVybiBUZWFyZG93bkRhdGFTY3JhdGNoKGltYWdlcy5nZXQoKSwgcGFydGl0aW9uX25hbWUsIHdhc19tb3VudGVkKTsKLSAgICB9Ci0KLSAgICBhdXRvIHNsb3RfbnVtYmVyID0gZnNfbWdyX292ZXJsYXlmc19zbG90X251bWJlcigpOwotICAgIGF1dG8gc3VwZXJfZGV2aWNlID0gZnNfbWdyX292ZXJsYXlmc19zdXBlcl9kZXZpY2Uoc2xvdF9udW1iZXIpOwotICAgIGlmICghZnNfbWdyX3J3X2FjY2VzcyhzdXBlcl9kZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6T2s7Ci0gICAgfQotCi0gICAgYXV0byBidWlsZGVyID0gTWV0YWRhdGFCdWlsZGVyOjpOZXcoc3VwZXJfZGV2aWNlLCBzbG90X251bWJlcik7Ci0gICAgaWYgKCFidWlsZGVyKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6T2s7Ci0gICAgfQotICAgIGlmIChidWlsZGVyLT5GaW5kUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6T2s7Ci0gICAgfQotICAgIGJ1aWxkZXItPlJlbW92ZVBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSk7Ci0gICAgYXV0byBtZXRhZGF0YSA9IGJ1aWxkZXItPkV4cG9ydCgpOwotICAgIGlmIChtZXRhZGF0YSAmJiBVcGRhdGVQYXJ0aXRpb25UYWJsZShzdXBlcl9kZXZpY2UsICptZXRhZGF0YS5nZXQoKSwgc2xvdF9udW1iZXIpKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UpICpjaGFuZ2UgPSB0cnVlOwotICAgICAgICBpZiAoIURlc3Ryb3lMb2dpY2FsUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpFcnJvcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIExFUlJPUiA8PCAiZGVsZXRlIHBhcnRpdGlvbiAiIDw8IG92ZXJsYXk7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6RXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKHdhc19tb3VudGVkKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6QnVzeTsKLSAgICB9Ci0gICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKLX0KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX29uZShjb25zdCBzdGQ6OnN0cmluZyYgb3ZlcmxheSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBjaGFuZ2UsIGJvb2wqIHNob3VsZF9kZXN0cm95X3NjcmF0Y2ggPSBudWxscHRyKSB7Ci0gICAgY29uc3QgYXV0byB0b3AgPSBvdmVybGF5ICsga092ZXJsYXlUb3BEaXI7Ci0KLSAgICBpZiAoIWZzX21ncl9hY2Nlc3ModG9wKSkgewotICAgICAgICBpZiAoc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCkgKnNob3VsZF9kZXN0cm95X3NjcmF0Y2ggPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBhdXRvIGNsZWFudXBfYWxsID0gbW91bnRfcG9pbnQuZW1wdHkoKTsKLSAgICBjb25zdCBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUobW91bnRfcG9pbnQpOwotICAgIGNvbnN0IGF1dG8gb2xkcGF0aCA9IHRvcCArIChjbGVhbnVwX2FsbCA/ICIiIDogKCIvIiArIHBhcnRpdGlvbl9uYW1lKSk7Ci0gICAgY29uc3QgYXV0byBuZXdwYXRoID0gY2xlYW51cF9hbGwgPyBvdmVybGF5ICsgIi8uIiArIGtPdmVybGF5VG9wRGlyLnN1YnN0cigxKSArICIudGVhcmRvd24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0b3AgKyAiLy4iICsgcGFydGl0aW9uX25hbWUgKyAiLnRlYXJkb3duIjsKLSAgICBhdXRvIHJldCA9IGZzX21ncl9ybV9hbGwobmV3cGF0aCk7Ci0gICAgaWYgKCFyZW5hbWUob2xkcGF0aC5jX3N0cigpLCBuZXdwYXRoLmNfc3RyKCkpKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UpICpjaGFuZ2UgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoZXJybm8gIT0gRU5PRU5UKSB7Ci0gICAgICAgIHJldCA9IGZhbHNlOwotICAgICAgICBQRVJST1IgPDwgIm12ICIgPDwgb2xkcGF0aCA8PCAiICIgPDwgbmV3cGF0aDsKLSAgICB9Ci0gICAgcmV0ICY9IGZzX21ncl9ybV9hbGwobmV3cGF0aCwgY2hhbmdlKTsKLSAgICBpZiAoIXJtZGlyKG5ld3BhdGguY19zdHIoKSkpIHsKLSAgICAgICAgaWYgKGNoYW5nZSkgKmNoYW5nZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChlcnJubyAhPSBFTk9FTlQpIHsKLSAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIFBFUlJPUiA8PCAicm1kaXIgIiA8PCBuZXdwYXRoOwotICAgIH0KLSAgICBpZiAoIWNsZWFudXBfYWxsKSB7Ci0gICAgICAgIGlmICghcm1kaXIodG9wLmNfc3RyKCkpKSB7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlKSAqY2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIGNsZWFudXBfYWxsID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChlcnJubyA9PSBFTk9URU1QVFkpIHsKLSAgICAgICAgICAgIGNsZWFudXBfYWxsID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIGNsZWFudXAgYWxsIGlmIHRoZSBjb250ZW50IGlzIGFsbCBoaWRkZW4gKGxlYWRpbmcgLikKLSAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxESVIsIGRlY2x0eXBlKCZjbG9zZWRpcik+IGRpcihvcGVuZGlyKHRvcC5jX3N0cigpKSwgY2xvc2VkaXIpOwotICAgICAgICAgICAgaWYgKCFkaXIpIHsKLSAgICAgICAgICAgICAgICBQRVJST1IgPDwgIm9wZW5kaXIgIiA8PCB0b3A7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpcmVudCogZW50cnk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyLmdldCgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5kX25hbWVbMF0gIT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwX2FsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJybm8gPT0gRU5PRU5UKSB7Ci0gICAgICAgICAgICBjbGVhbnVwX2FsbCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIFBFUlJPUiA8PCAicm1kaXIgIiA8PCB0b3A7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNob3VsZF9kZXN0cm95X3NjcmF0Y2gpICpzaG91bGRfZGVzdHJveV9zY3JhdGNoID0gY2xlYW51cF9hbGw7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBib29sIHNoYXJlZF9mbGFnKSB7Ci0gICAgYXV0byByZXQgPSBtb3VudChudWxscHRyLCBtb3VudF9wb2ludC5jX3N0cigpLCBudWxscHRyLCBzaGFyZWRfZmxhZyA/IE1TX1NIQVJFRCA6IE1TX1BSSVZBVEUsCi0gICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIFBFUlJPUiA8PCAiX19tb3VudCh0YXJnZXQ9IiA8PCBtb3VudF9wb2ludAotICAgICAgICAgICAgICAgPDwgIixmbGFnPSIgPDwgKHNoYXJlZF9mbGFnID8gIk1TX1NIQVJFRCIgOiAiTVNfUFJJVkFURSIpIDw8ICIpPSIgPDwgcmV0OwotICAgICAgICAvLyBJZiAiL3N5c3RlbSIgZG9lc24ndCBsb29rIGxpa2UgYSBtb3VudHBvaW50LCByZXRyeSB3aXRoICIvIi4KLSAgICAgICAgaWYgKGVycm5vID09IEVJTlZBTCAmJiBtb3VudF9wb2ludCA9PSAiL3N5c3RlbSIpIHsKLSAgICAgICAgICAgIHJldHVybiBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi8iLCBzaGFyZWRfZmxhZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX21vdmVfbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCkgewotICAgIGF1dG8gcmV0ID0gbW91bnQoc291cmNlLmNfc3RyKCksIHRhcmdldC5jX3N0cigpLCBudWxscHRyLCBNU19NT1ZFLCBudWxscHRyKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIFBFUlJPUiA8PCAiX19tb3VudChzb3VyY2U9IiA8PCBzb3VyY2UgPDwgIix0YXJnZXQ9IiA8PCB0YXJnZXQgPDwgIixmbGFnPU1TX01PVkUpPSIgPDwgcmV0OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdHJ1Y3QgbW91bnRfaW5mbyB7Ci0gICAgc3RkOjpzdHJpbmcgbW91bnRfcG9pbnQ7Ci0gICAgYm9vbCBzaGFyZWRfZmxhZzsKLX07Ci0KLXN0ZDo6dmVjdG9yPG1vdW50X2luZm8+IFJlYWRNb3VudGluZm9Gcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIHN0ZDo6dmVjdG9yPG1vdW50X2luZm8+IGluZm87Ci0KLSAgICBhdXRvIGZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+e2ZvcGVuKHBhdGguY19zdHIoKSwgInJlIiksIGZjbG9zZX07Ci0gICAgaWYgKCFmaWxlKSB7Ci0gICAgICAgIFBFUlJPUiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBjYW5ub3Qgb3BlbiBmaWxlOiAnIiA8PCBwYXRoIDw8ICInIjsKLSAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgfQotCi0gICAgc3NpemVfdCBsZW47Ci0gICAgc2l6ZV90IGFsbG9jX2xlbiA9IDA7Ci0gICAgY2hhciogbGluZSA9IG51bGxwdHI7Ci0gICAgd2hpbGUgKChsZW4gPSBnZXRsaW5lKCZsaW5lLCAmYWxsb2NfbGVuLCBmaWxlLmdldCgpKSkgIT0gLTEpIHsKLSAgICAgICAgLyogaWYgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgbmV3bGluZSwgc2hvcnRlbiB0aGUgc3RyaW5nIGJ5IDEgYnl0ZSAqLwotICAgICAgICBpZiAobGluZVtsZW4gLSAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBsaW5lW2xlbiAtIDFdID0gJ1wwJzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBkZWxpbVtdID0gIiBcdCI7Ci0gICAgICAgIGNoYXIqIHNhdmVfcHRyOwotICAgICAgICBpZiAoIXN0cnRva19yKGxpbmUsIGRlbGltLCAmc2F2ZV9wdHIpKSB7Ci0gICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgbW91bnQgSUQiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJ0b2tfcihudWxscHRyLCBkZWxpbSwgJnNhdmVfcHRyKSkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIHBhcmVudCBJRCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cnRva19yKG51bGxwdHIsIGRlbGltLCAmc2F2ZV9wdHIpKSB7Ci0gICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgbW91bnQgc291cmNlIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpIHsKLSAgICAgICAgICAgIExFUlJPUiA8PCAiRXJyb3IgcGFyc2luZyByb290IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciogcDsKLSAgICAgICAgaWYgKCEocCA9IHN0cnRva19yKG51bGxwdHIsIGRlbGltLCAmc2F2ZV9wdHIpKSkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIG1vdW50X3BvaW50IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1vdW50X2luZm8gZW50cnkgPSB7cCwgZmFsc2V9OwotCi0gICAgICAgIGlmICghc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpIHsKLSAgICAgICAgICAgIExFUlJPUiA8PCAiRXJyb3IgcGFyc2luZyBtb3VudF9mbGFncyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICgocCA9IHN0cnRva19yKG51bGxwdHIsIGRlbGltLCAmc2F2ZV9wdHIpKSkgewotICAgICAgICAgICAgaWYgKChwWzBdID09ICctJykgJiYgKHBbMV0gPT0gJ1wwJykpIGJyZWFrOwotICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgocCwgInNoYXJlZDoiKSkgZW50cnkuc2hhcmVkX2ZsYWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcCkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIGZpZWxkcyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbmZvLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZW50cnkpKTsKLSAgICB9Ci0KLSAgICBmcmVlKGxpbmUpOwotICAgIGlmIChpbmZvLmVtcHR5KCkpIHsKLSAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IGZhaWxlZCB0byBsb2FkIG1vdW50aW5mbyBmcm9tIDogJyIgPDwgcGF0aCA8PCAiJyI7Ci0gICAgfQotICAgIHJldHVybiBpbmZvOwotfQotCi1ib29sIGZzX21ncl9vdmVybGF5ZnNfbW91bnQoY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKLSAgICBjb25zdCBhdXRvIG1vdW50X3BvaW50ID0gZnNfbWdyX21vdW50X3BvaW50KGVudHJ5Lm1vdW50X3BvaW50KTsKLSAgICBjb25zdCBhdXRvIG9wdGlvbnMgPSBmc19tZ3JfZ2V0X292ZXJsYXlmc19vcHRpb25zKGVudHJ5KTsKLSAgICBpZiAob3B0aW9ucy5lbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvIHJldHZhbCA9IHRydWU7Ci0KLSAgICBzdHJ1Y3QgbW92ZV9lbnRyeSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG1vdW50X3BvaW50OwotICAgICAgICBzdGQ6OnN0cmluZyBkaXI7Ci0gICAgICAgIGJvb2wgc2hhcmVkX2ZsYWc7Ci0gICAgfTsKLSAgICBzdGQ6OnZlY3Rvcjxtb3ZlX2VudHJ5PiBtb3ZlOwotICAgIGF1dG8gcGFyZW50X3ByaXZhdGUgPSBmYWxzZTsKLSAgICBhdXRvIHBhcmVudF9tYWRlX3ByaXZhdGUgPSBmYWxzZTsKLSAgICBhdXRvIGRldl9wcml2YXRlID0gZmFsc2U7Ci0gICAgYXV0byBkZXZfbWFkZV9wcml2YXRlID0gZmFsc2U7Ci0gICAgZm9yIChhdXRvJiBlbnRyeSA6IFJlYWRNb3VudGluZm9Gcm9tRmlsZSgiL3Byb2Mvc2VsZi9tb3VudGluZm8iKSkgewotICAgICAgICBpZiAoKGVudHJ5Lm1vdW50X3BvaW50ID09IG1vdW50X3BvaW50KSAmJiAhZW50cnkuc2hhcmVkX2ZsYWcpIHsKLSAgICAgICAgICAgIHBhcmVudF9wcml2YXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGVudHJ5Lm1vdW50X3BvaW50ID09ICIvZGV2IikgJiYgIWVudHJ5LnNoYXJlZF9mbGFnKSB7Ci0gICAgICAgICAgICBkZXZfcHJpdmF0ZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZW50cnkubW91bnRfcG9pbnQsIG1vdW50X3BvaW50ICsgIi8iKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0ZDo6ZmluZF9pZihtb3ZlLmJlZ2luKCksIG1vdmUuZW5kKCksIFsmZW50cnldKGNvbnN0IGF1dG8mIGl0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZW50cnkubW91bnRfcG9pbnQsIGl0Lm1vdW50X3BvaW50ICsgIi8iKTsKLSAgICAgICAgICAgIH0pICE9IG1vdmUuZW5kKCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXNlIGFzIHRoZSBib3VuZCBkaXJlY3RvcnkgaW4gL2Rldi4KLSAgICAgICAgQXV0b1NldEZzQ3JlYXRlQ29uIGNyZWF0ZWNvbjsKLSAgICAgICAgYXV0byBuZXdfY29udGV4dCA9IGZzX21ncl9nZXRfY29udGV4dChlbnRyeS5tb3VudF9wb2ludCk7Ci0gICAgICAgIGlmIChuZXdfY29udGV4dC5lbXB0eSgpIHx8ICFjcmVhdGVjb24uU2V0KG5ld19jb250ZXh0KSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbW92ZV9lbnRyeSBuZXdfZW50cnkgPSB7c3RkOjptb3ZlKGVudHJ5Lm1vdW50X3BvaW50KSwgIi9kZXYvVGVtcG9yYXJ5RGlyLVhYWFhYWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNoYXJlZF9mbGFnfTsKLSAgICAgICAgY29uc3QgYXV0byB0YXJnZXQgPSBta2R0ZW1wKG5ld19lbnRyeS5kaXIuZGF0YSgpKTsKLSAgICAgICAgaWYgKCFjcmVhdGVjb24uUmVzdG9yZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF0YXJnZXQpIHsKLSAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOwotICAgICAgICAgICAgUEVSUk9SIDw8ICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBNU19CSU5EIjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwYXJlbnRfcHJpdmF0ZSAmJiAhcGFyZW50X21hZGVfcHJpdmF0ZSkgewotICAgICAgICAgICAgcGFyZW50X21hZGVfcHJpdmF0ZSA9IGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChtb3VudF9wb2ludCwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXdfZW50cnkuc2hhcmVkX2ZsYWcpIHsKLSAgICAgICAgICAgIG5ld19lbnRyeS5zaGFyZWRfZmxhZyA9IGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChuZXdfZW50cnkubW91bnRfcG9pbnQsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfbW92ZV9tb3VudChuZXdfZW50cnkubW91bnRfcG9pbnQsIG5ld19lbnRyeS5kaXIpKSB7Ci0gICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChuZXdfZW50cnkuc2hhcmVkX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQobmV3X2VudHJ5Lm1vdW50X3BvaW50LCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG1vdmUuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShuZXdfZW50cnkpKTsKLSAgICB9Ci0KLSAgICAvLyBoaWphY2sgX19tb3VudCgpIHJlcG9ydCBmb3JtYXQgdG8gaGVscCB0cmlhZ2UKLSAgICBhdXRvIHJlcG9ydCA9ICJfX21vdW50KHNvdXJjZT1vdmVybGF5LHRhcmdldD0icyArIG1vdW50X3BvaW50ICsgIix0eXBlPW92ZXJsYXkiOwotICAgIGNvbnN0IGF1dG8gb3B0X2xpc3QgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChvcHRpb25zLCAiLCIpOwotICAgIGZvciAoY29uc3QgYXV0byYgb3B0IDogb3B0X2xpc3QpIHsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgob3B0LCBrVXBwZXJkaXJPcHRpb24pKSB7Ci0gICAgICAgICAgICByZXBvcnQgPSByZXBvcnQgKyAiLCIgKyBvcHQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXBvcnQgPSByZXBvcnQgKyAiKT0iOwotCi0gICAgYXV0byByZXQgPSBtb3VudCgib3ZlcmxheSIsIG1vdW50X3BvaW50LmNfc3RyKCksICJvdmVybGF5IiwgTVNfUkRPTkxZIHwgTVNfTk9BVElNRSwKLSAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY19zdHIoKSk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICAgICAgUEVSUk9SIDw8IHJlcG9ydCA8PCByZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTElORk8gPDwgcmVwb3J0IDw8IHJldDsKLSAgICB9Ci0KLSAgICAvLyBNb3ZlIHN1Ym1vdW50cyBiYWNrLgotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBtb3ZlKSB7Ci0gICAgICAgIGlmICghZGV2X3ByaXZhdGUgJiYgIWRldl9tYWRlX3ByaXZhdGUpIHsKLSAgICAgICAgICAgIGRldl9tYWRlX3ByaXZhdGUgPSBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi9kZXYiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfbW92ZV9tb3VudChlbnRyeS5kaXIsIGVudHJ5Lm1vdW50X3BvaW50KSkgewotICAgICAgICAgICAgcmV0dmFsID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoZW50cnkuc2hhcmVkX2ZsYWcgJiYKLSAgICAgICAgICAgICAgICAgICAhZnNfbWdyX292ZXJsYXlmc19zZXRfc2hhcmVkX21vdW50KGVudHJ5Lm1vdW50X3BvaW50LCB0cnVlKSkgewotICAgICAgICAgICAgcmV0dmFsID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcm1kaXIoZW50cnkuZGlyLmNfc3RyKCkpOwotICAgIH0KLSAgICBpZiAoZGV2X21hZGVfcHJpdmF0ZSkgewotICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi9kZXYiLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKHBhcmVudF9tYWRlX3ByaXZhdGUpIHsKLSAgICAgICAgZnNfbWdyX292ZXJsYXlmc19zZXRfc2hhcmVkX21vdW50KG1vdW50X3BvaW50LCB0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vLyBNb3VudCBrU2NyYXRjaE1vdW50UG9pbnQKLWJvb2wgTW91bnRTY3JhdGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfcGF0aCwgYm9vbCByZWFkb25seSA9IGZhbHNlKSB7Ci0gICAgaWYgKHJlYWRvbmx5KSB7Ci0gICAgICAgIGlmICghZnNfbWdyX2FjY2VzcyhkZXZpY2VfcGF0aCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlBhdGggZG9lcyBub3QgZXhpc3Q6ICIgPDwgZGV2aWNlX3BhdGg7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFmc19tZ3JfcndfYWNjZXNzKGRldmljZV9wYXRoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJQYXRoIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCByZWFkd3JpdGU6ICIgPDwgZGV2aWNlX3BhdGg7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gZmlsZXN5c3RlbV9jYW5kaWRhdGVzOwotICAgIGlmIChmc19tZ3JfaXNfZjJmcyhkZXZpY2VfcGF0aCkpIHsKLSAgICAgICAgZmlsZXN5c3RlbV9jYW5kaWRhdGVzID0geyJmMmZzIiwgImV4dDQifTsKLSAgICB9IGVsc2UgaWYgKGZzX21ncl9pc19leHQ0KGRldmljZV9wYXRoKSkgewotICAgICAgICBmaWxlc3lzdGVtX2NhbmRpZGF0ZXMgPSB7ImV4dDQiLCAiZjJmcyJ9OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlNjcmF0Y2ggcGFydGl0aW9uIGlzIG5vdCBmMmZzIG9yIGV4dDQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQXV0b1NldEZzQ3JlYXRlQ29uIGNyZWF0ZWNvbihrT3ZlcmxheWZzRmlsZUNvbnRleHQpOwotICAgIGlmICghY3JlYXRlY29uLk9rKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobWtkaXIoa1NjcmF0Y2hNb3VudFBvaW50LmNfc3RyKCksIDA3NTUpICYmIChlcnJubyAhPSBFRVhJU1QpKSB7Ci0gICAgICAgIFBFUlJPUiA8PCAiY3JlYXRlICIgPDwga1NjcmF0Y2hNb3VudFBvaW50OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgRnN0YWJFbnRyeSBlbnRyeTsKLSAgICBlbnRyeS5ibGtfZGV2aWNlID0gZGV2aWNlX3BhdGg7Ci0gICAgZW50cnkubW91bnRfcG9pbnQgPSBrU2NyYXRjaE1vdW50UG9pbnQ7Ci0gICAgZW50cnkuZmxhZ3MgPSBNU19OT0FUSU1FIHwgTVNfUkRPTkxZOwotICAgIGlmICghcmVhZG9ubHkpIHsKLSAgICAgICAgZW50cnkuZmxhZ3MgJj0gfk1TX1JET05MWTsKLSAgICAgICAgZW50cnkuZmxhZ3MgfD0gTVNfU1lOQ0hST05PVVM7Ci0gICAgICAgIGVudHJ5LmZzX29wdGlvbnMgPSAibm9kaXNjYXJkIjsKLSAgICAgICAgZnNfbWdyX3NldF9ibGtfcm8oZGV2aWNlX3BhdGgsIGZhbHNlKTsKLSAgICB9Ci0gICAgLy8gY2hlY2tfZnMgcmVxdWlyZXMgYXBleCBydW50aW1lIGxpYnJhcnkKLSAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoIi9kYXRhIiwgZmFsc2UpKSB7Ci0gICAgICAgIGVudHJ5LmZzX21ncl9mbGFncy5jaGVjayA9IHRydWU7Ci0gICAgfQotICAgIGJvb2wgbW91bnRlZCA9IGZhbHNlOwotICAgIGZvciAoYXV0byBmc190eXBlIDogZmlsZXN5c3RlbV9jYW5kaWRhdGVzKSB7Ci0gICAgICAgIGVudHJ5LmZzX3R5cGUgPSBmc190eXBlOwotICAgICAgICBpZiAoZnNfbWdyX2RvX21vdW50X29uZShlbnRyeSkgPT0gMCkgewotICAgICAgICAgICAgbW91bnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIW1vdW50ZWQpIHsKLSAgICAgICAgcm1kaXIoa1NjcmF0Y2hNb3VudFBvaW50LmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyBrTWtGMmZzKCIvc3lzdGVtL2Jpbi9tYWtlX2YyZnMiKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtNa0V4dDQoIi9zeXN0ZW0vYmluL21rZTJmcyIpOwotCi0vLyBOb3RlOiBUaGUgc2NyYXRjaCBwYXJ0aXRpb24gb2YgRFNVIGlzIG1hbmFnZWQgYnkgZ3NpZCwgYW5kIHNob3VsZCBiZSBpbml0aWFsaXplZCBkdXJpbmcKLS8vIGZpcnN0LXN0YWdlLW1vdW50LiBKdXN0IGNoZWNrIGlmIHRoZSBETSBkZXZpY2UgZm9yIERTVSBzY3JhdGNoIHBhcnRpdGlvbiBpcyBjcmVhdGVkIG9yIG5vdC4KLXN0YXRpYyBzdGQ6OnN0cmluZyBHZXREc3VTY3JhdGNoRGV2aWNlKCkgewotICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICBpZiAoZG0uR2V0U3RhdGUoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJgotICAgICAgICBkbS5HZXREbURldmljZVBhdGhCeU5hbWUoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCwgJmRldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotCi0vLyBUaGlzIHJldHVybnMgdGhlIHNjcmF0Y2ggZGV2aWNlIHRoYXQgd2FzIGRldGVjdGVkIGR1cmluZyBlYXJseSBib290IChmaXJzdC0KLS8vIHN0YWdlIGluaXQpLiBJZiB0aGUgZGV2aWNlIHdhcyBjcmVhdGVkIGxhdGVyLCBmb3IgZXhhbXBsZSBkdXJpbmcgc2V0dXAgZm9yCi0vLyB0aGUgYWRiIHJlbW91bnQgY29tbWFuZCwgaXQgY2FuIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgc2luY2UgaXQgZG9lcyBub3QKLS8vIHF1ZXJ5IEltYWdlTWFuYWdlci4gKE5vdGUgdGhhdCBJbWFnZU1hbmFnZXIgaW4gZmlyc3Qtc3RhZ2UgaW5pdCB3aWxsIGFsd2F5cwotLy8gdXNlIGRldmljZS1tYXBwZXIsIHNpbmNlIC9kYXRhIGlzIG5vdCBhdmFpbGFibGUgdG8gdXNlIGxvb3AgZGV2aWNlcy4pCi1zdGF0aWMgc3RkOjpzdHJpbmcgR2V0Qm9vdFNjcmF0Y2hEZXZpY2UoKSB7Ci0gICAgLy8gTm90ZTogZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkgYWx3YXlzIHJldHVybnMgZmFsc2UgaW4gcmVjb3Zlcnkgb3IgZmFzdGJvb3RkLgotICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgewotICAgICAgICByZXR1cm4gR2V0RHN1U2NyYXRjaERldmljZSgpOwotICAgIH0KLQotICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBzY3JhdGNoIHBhcnRpdGlvbiBhbGxvY2F0ZWQgaW4gL2RhdGEgb3Igb24gc3VwZXIsIHdlCi0gICAgLy8gYXV0b21hdGljYWxseSBwcmlvcml0aXplIHRoYXQgb3ZlciBzdXBlcl9vdGhlciBvciBzeXN0ZW1fb3RoZXIuCi0gICAgLy8gU29tZSBkZXZpY2VzLCBmb3IgZXhhbXBsZSwgaGF2ZSBhIHdyaXRlLXByb3RlY3RlZCBlTU1DIGFuZCB0aGUKLSAgICAvLyBzdXBlciBwYXJ0aXRpb24gY2Fubm90IGJlIHVzZWQgZXZlbiBpZiBpdCBleGlzdHMuCi0gICAgc3RkOjpzdHJpbmcgZGV2aWNlOwotICAgIGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrU2NyYXRjaE1vdW50UG9pbnQpOwotICAgIGlmIChkbS5HZXRTdGF0ZShwYXJ0aXRpb25fbmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJgotICAgICAgICBkbS5HZXREbURldmljZVBhdGhCeU5hbWUocGFydGl0aW9uX25hbWUsICZkZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBkZXZpY2U7Ci0gICAgfQotCi0gICAgcmV0dXJuICIiOwotfQotCi1ib29sIE1ha2VTY3JhdGNoRmlsZXN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyYgc2NyYXRjaF9kZXZpY2UpIHsKLSAgICAvLyBGb3JjZSBta2ZzIGJ5IGRlc2lnbiBmb3Igb3ZlcmxheSBzdXBwb3J0IG9mIGFkYiByZW1vdW50LCBzaW1wbGlmeSBhbmQKLSAgICAvLyB0aHVzIGRvIG5vdCByZWx5IG9uIGZzY2sgdG8gY29ycmVjdCBwcm9ibGVtcyB0aGF0IGNvdWxkIGNyZWVwIGluLgotICAgIGF1dG8gZnNfdHlwZSA9ICIiczsKLSAgICBhdXRvIGNvbW1hbmQgPSAiInM7Ci0gICAgaWYgKCFhY2Nlc3Moa01rRjJmcy5jX3N0cigpLCBYX09LKSAmJiBmc19tZ3JfZmlsZXN5c3RlbV9hdmFpbGFibGUoImYyZnMiKSkgewotICAgICAgICBmc190eXBlID0gImYyZnMiOwotICAgICAgICBjb21tYW5kID0ga01rRjJmcyArICIgLXcgNDA5NiAtZiAtZDEgLWwiICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKLSAgICB9IGVsc2UgaWYgKCFhY2Nlc3Moa01rRXh0NC5jX3N0cigpLCBYX09LKSAmJiBmc19tZ3JfZmlsZXN5c3RlbV9hdmFpbGFibGUoImV4dDQiKSkgewotICAgICAgICBmc190eXBlID0gImV4dDQiOwotICAgICAgICBjb21tYW5kID0ga01rRXh0NCArICIgLUYgLWIgNDA5NiAtdCBleHQ0IC1tIDAgLU8gaGFzX2pvdXJuYWwgLU0gIiArIGtTY3JhdGNoTW91bnRQb2ludDsKLSAgICB9IGVsc2UgewotICAgICAgICBMRVJST1IgPDwgIk5vIHN1cHBvcnRlZCBta2ZzIGNvbW1hbmQgb3IgZmlsZXN5c3RlbSBkcml2ZXIgYXZhaWxhYmxlLCBzdXBwb3J0ZWQgZmlsZXN5c3RlbXMgIgotICAgICAgICAgICAgICAgICAgImFyZTogZjJmcywgZXh0NCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY29tbWFuZCArPSAiICIgKyBzY3JhdGNoX2RldmljZSArICIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA8L2Rldi9udWxsIjsKLSAgICBmc19tZ3Jfc2V0X2Jsa19ybyhzY3JhdGNoX2RldmljZSwgZmFsc2UpOwotICAgIGF1dG8gcmV0ID0gc3lzdGVtKGNvbW1hbmQuY19zdHIoKSk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICBMRVJST1IgPDwgIm1ha2UgIiA8PCBmc190eXBlIDw8ICIgZmlsZXN5c3RlbSBvbiAiIDw8IHNjcmF0Y2hfZGV2aWNlIDw8ICIgcmV0dXJuPSIgPDwgcmV0OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBUcnVuY2F0ZVBhcnRpdGlvbnNXaXRoU3VmZml4KE1ldGFkYXRhQnVpbGRlciogYnVpbGRlciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCkgewotICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotCi0gICAgLy8gUmVtb3ZlIDxvdGhlcj4gcGFydGl0aW9ucwotICAgIGZvciAoY29uc3QgYXV0byYgZ3JvdXAgOiBidWlsZGVyLT5MaXN0R3JvdXBzKCkpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJ0IDogYnVpbGRlci0+TGlzdFBhcnRpdGlvbnNJbkdyb3VwKGdyb3VwKSkgewotICAgICAgICAgICAgY29uc3QgYXV0byYgbmFtZSA9IHBhcnQtPm5hbWUoKTsKLSAgICAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgobmFtZSwgc3VmZml4KSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRtLkdldFN0YXRlKG5hbWUpICE9IERtRGV2aWNlU3RhdGU6OklOVkFMSUQgJiYgIURlc3Ryb3lMb2dpY2FsUGFydGl0aW9uKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLT5SZXNpemVQYXJ0aXRpb24oYnVpbGRlci0+RmluZFBhcnRpdGlvbihuYW1lKSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIENyZWF0ZSBvciB1cGRhdGUgYSBzY3JhdGNoIHBhcnRpdGlvbiB3aXRoaW4gc3VwZXIuCi1zdGF0aWMgYm9vbCBDcmVhdGVEeW5hbWljU2NyYXRjaChzdGQ6OnN0cmluZyogc2NyYXRjaF9kZXZpY2UsIGJvb2wqIHBhcnRpdGlvbl9leGlzdHMpIHsKLSAgICBjb25zdCBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKLQotICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotICAgICpwYXJ0aXRpb25fZXhpc3RzID0gZG0uR2V0U3RhdGUocGFydGl0aW9uX25hbWUpICE9IERtRGV2aWNlU3RhdGU6OklOVkFMSUQ7Ci0KLSAgICBhdXRvIHBhcnRpdGlvbl9jcmVhdGUgPSAhKnBhcnRpdGlvbl9leGlzdHM7Ci0gICAgYXV0byBzbG90X251bWJlciA9IGZzX21ncl9vdmVybGF5ZnNfc2xvdF9udW1iZXIoKTsKLSAgICBhdXRvIHN1cGVyX2RldmljZSA9IGZzX21ncl9vdmVybGF5ZnNfc3VwZXJfZGV2aWNlKHNsb3RfbnVtYmVyKTsKLSAgICBhdXRvIGJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKLSAgICBpZiAoIWJ1aWxkZXIpIHsKLSAgICAgICAgTEVSUk9SIDw8ICJvcGVuICIgPDwgc3VwZXJfZGV2aWNlIDw8ICIgbWV0YWRhdGEiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGF1dG8gcGFydGl0aW9uID0gYnVpbGRlci0+RmluZFBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSk7Ci0gICAgKnBhcnRpdGlvbl9leGlzdHMgPSBwYXJ0aXRpb24gIT0gbnVsbHB0cjsKLSAgICBhdXRvIGNoYW5nZWQgPSBmYWxzZTsKLSAgICBpZiAoISpwYXJ0aXRpb25fZXhpc3RzKSB7Ci0gICAgICAgIHBhcnRpdGlvbiA9IGJ1aWxkZXItPkFkZFBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSwgTFBfUEFSVElUSU9OX0FUVFJfTk9ORSk7Ci0gICAgICAgIGlmICghcGFydGl0aW9uKSB7Ci0gICAgICAgICAgICBMRVJST1IgPDwgImNyZWF0ZSAiIDw8IHBhcnRpdGlvbl9uYW1lOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgIH0KLSAgICAvLyBUYWtlIGhhbGYgb2YgZnJlZSBzcGFjZSwgbWluaW11bSA1MTJNQiBvciBtYXhpbXVtIGZyZWUgLSBtYXJnaW4uCi0gICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIGtNaW5pbXVtU2l6ZSA9IHVpbnQ2NF90KDUxMiAqIDEwMjQgKiAxMDI0KTsKLSAgICBpZiAocGFydGl0aW9uLT5zaXplKCkgPCBrTWluaW11bVNpemUpIHsKLSAgICAgICAgYXV0byBwYXJ0aXRpb25fc2l6ZSA9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci0+QWxsb2NhdGFibGVTcGFjZSgpIC0gYnVpbGRlci0+VXNlZFNwYWNlKCkgKyBwYXJ0aXRpb24tPnNpemUoKTsKLSAgICAgICAgaWYgKChwYXJ0aXRpb25fc2l6ZSA+IGtNaW5pbXVtU2l6ZSkgfHwgIXBhcnRpdGlvbi0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBMZWF2ZSBzb21lIHNwYWNlIGZvciBmcmVlIHNwYWNlIGppdHRlciBvZiBhIGZldyBlcmFzZQotICAgICAgICAgICAgLy8gYmxvY2tzLCBpbiBjYXNlIHRoZXkgYXJlIG5lZWRlZCBmb3IgYW55IGluZGl2aWR1YWwgdXBkYXRlcwotICAgICAgICAgICAgLy8gdG8gYW55IG90aGVyIHBhcnRpdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZsYXNoZWQgd2hpbGUKLSAgICAgICAgICAgIC8vIG92ZXJsYXlmcyBpcyBpbiBmb3JjZS4gIE9mIGNvdXJzZSBpZiBtYXJnaW5fc2l6ZSBpcyBub3QKLSAgICAgICAgICAgIC8vIGVub3VnaCBjb3VsZCBub3JtYWxseSBnZXQgYSBmbGFzaCBmYWlsdXJlLCBzbwotICAgICAgICAgICAgLy8gUmVzaXplUGFydGl0aW9uKCkgd2lsbCBkZWxldGUgdGhlIHNjcmF0Y2ggcGFydGl0aW9uIGluCi0gICAgICAgICAgICAvLyBvcmRlciB0byBmdWxmaWxsLiAgRGVsZXRpbmcgc2NyYXRjaCB3aWxsIGRlc3Ryb3kgYWxsIG9mCi0gICAgICAgICAgICAvLyB0aGUgYWRiIHJlbW91bnQgb3ZlcnJpZGVzIDotKCAuCi0gICAgICAgICAgICBhdXRvIG1hcmdpbl9zaXplID0gdWludDY0X3QoMyAqIDI1NiAqIDEwMjQpOwotICAgICAgICAgICAgQmxvY2tEZXZpY2VJbmZvIGluZm87Ci0gICAgICAgICAgICBpZiAoYnVpbGRlci0+R2V0QmxvY2tEZXZpY2VJbmZvKGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoc2xvdF9udW1iZXIpLCAmaW5mbykpIHsKLSAgICAgICAgICAgICAgICBtYXJnaW5fc2l6ZSA9IDMgKiBpbmZvLmxvZ2ljYWxfYmxvY2tfc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplID0gc3RkOjptYXgoc3RkOjptaW4oa01pbmltdW1TaXplLCBwYXJ0aXRpb25fc2l6ZSAtIG1hcmdpbl9zaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUgLyAyKTsKLSAgICAgICAgICAgIGlmIChwYXJ0aXRpb25fc2l6ZSA+IHBhcnRpdGlvbi0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFidWlsZGVyLT5SZXNpemVQYXJ0aXRpb24ocGFydGl0aW9uLCBwYXJ0aXRpb25fc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZyZWUgdXAgc3BhY2UgYnkgZGVhbGxvY2F0aW5nIHBhcnRpdGlvbnMgaW4gdGhlIG90aGVyIHNsb3QuCi0gICAgICAgICAgICAgICAgICAgIFRydW5jYXRlUGFydGl0aW9uc1dpdGhTdWZmaXgoYnVpbGRlci5nZXQoKSwgZnNfbWdyX2dldF9vdGhlcl9zbG90X3N1ZmZpeCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci0+QWxsb2NhdGFibGVTcGFjZSgpIC0gYnVpbGRlci0+VXNlZFNwYWNlKCkgKyBwYXJ0aXRpb24tPnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUgPSBzdGQ6Om1heChzdGQ6Om1pbihrTWluaW11bVNpemUsIHBhcnRpdGlvbl9zaXplIC0gbWFyZ2luX3NpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplIC8gMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYnVpbGRlci0+UmVzaXplUGFydGl0aW9uKHBhcnRpdGlvbiwgcGFydGl0aW9uX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMRVJST1IgPDwgInJlc2l6ZSAiIDw8IHBhcnRpdGlvbl9uYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcGFydGl0aW9uX2NyZWF0ZSkgRGVzdHJveUxvZ2ljYWxQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpOwotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICpwYXJ0aXRpb25fZXhpc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gbGFuZCB0aGUgdXBkYXRlIGJhY2sgb24gdG8gdGhlIHBhcnRpdGlvbgotICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgIGF1dG8gbWV0YWRhdGEgPSBidWlsZGVyLT5FeHBvcnQoKTsKLSAgICAgICAgaWYgKCFtZXRhZGF0YSB8fCAhVXBkYXRlUGFydGl0aW9uVGFibGUoc3VwZXJfZGV2aWNlLCAqbWV0YWRhdGEuZ2V0KCksIHNsb3RfbnVtYmVyKSkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJhZGQgcGFydGl0aW9uICIgPDwgcGFydGl0aW9uX25hbWU7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2hhbmdlZCB8fCBwYXJ0aXRpb25fY3JlYXRlKSB7Ci0gICAgICAgIENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMgcGFyYW1zID0gewotICAgICAgICAgICAgICAgIC5ibG9ja19kZXZpY2UgPSBzdXBlcl9kZXZpY2UsCi0gICAgICAgICAgICAgICAgLm1ldGFkYXRhX3Nsb3QgPSBzbG90X251bWJlciwKLSAgICAgICAgICAgICAgICAucGFydGl0aW9uX25hbWUgPSBwYXJ0aXRpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAuZm9yY2Vfd3JpdGFibGUgPSB0cnVlLAotICAgICAgICAgICAgICAgIC50aW1lb3V0X21zID0gMTBzLAotICAgICAgICB9OwotICAgICAgICBpZiAoIUNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb24ocGFyYW1zLCBzY3JhdGNoX2RldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc2NyYXRjaF9kZXZpY2UtPmVtcHR5KCkpIHsKLSAgICAgICAgKnNjcmF0Y2hfZGV2aWNlID0gR2V0Qm9vdFNjcmF0Y2hEZXZpY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDY0X3QgR2V0SWRlYWxEYXRhU2NyYXRjaFNpemUoKSB7Ci0gICAgQmxvY2tEZXZpY2VJbmZvIHN1cGVyX2luZm87Ci0gICAgUGFydGl0aW9uT3BlbmVyIG9wZW5lcjsKLSAgICBpZiAoIW9wZW5lci5HZXRJbmZvKGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoKSwgJnN1cGVyX2luZm8pKSB7Ci0gICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IGdldCBibG9jayBkZXZpY2UgaW5mbyBmb3Igc3VwZXIiOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzdHJ1Y3Qgc3RhdHZmcyBzOwotICAgIGlmIChzdGF0dmZzKCIvZGF0YSIsICZzKSA8IDApIHsKLSAgICAgICAgUEVSUk9SIDw8ICJjb3VsZCBub3Qgc3RhdGZzIC9kYXRhIjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYXV0byBpZGVhbF9zaXplID0gc3RkOjptaW4oc3VwZXJfaW5mby5zaXplLCAodWludDY0X3Qocy5mX2Zyc2l6ZSkgKiBzLmZfYmZyZWUpIC8gMik7Ci0KLSAgICAvLyBBbGlnbiB1cCB0byB0aGUgZmlsZXN5c3RlbSBibG9jayBzaXplLgotICAgIGlmIChhdXRvIHJlbWFpbmRlciA9IGlkZWFsX3NpemUgJSBzLmZfYnNpemU7IHJlbWFpbmRlciA+IDApIHsKLSAgICAgICAgaWRlYWxfc2l6ZSArPSBzLmZfYnNpemUgLSByZW1haW5kZXI7Ci0gICAgfQotICAgIHJldHVybiBpZGVhbF9zaXplOwotfQotCi1zdGF0aWMgYm9vbCBDcmVhdGVTY3JhdGNoT25EYXRhKHN0ZDo6c3RyaW5nKiBzY3JhdGNoX2RldmljZSwgYm9vbCogcGFydGl0aW9uX2V4aXN0cykgewotICAgICpwYXJ0aXRpb25fZXhpc3RzID0gZmFsc2U7Ci0KLSAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOwotICAgIGlmICghaW1hZ2VzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKLSAgICBpZiAoaW1hZ2VzLT5HZXRNYXBwZWRJbWFnZURldmljZShwYXJ0aXRpb25fbmFtZSwgc2NyYXRjaF9kZXZpY2UpKSB7Ci0gICAgICAgICpwYXJ0aXRpb25fZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTm90ZTogY2FsbGluZyBSZW1vdmVEaXNhYmxlZEltYWdlcyBoZXJlIGVuc3VyZXMgdGhhdCB3ZSBkbyBub3QgcmFjZSB3aXRoCi0gICAgLy8gY2xlYW5fc2NyYXRjaF9maWxlcyBhbmQgYWNjaWRlbnRhbGx5IHRyeSB0byBtYXAgYW4gaW1hZ2UgdGhhdCB3aWxsIGJlCi0gICAgLy8gZGVsZXRlZC4KLSAgICBpZiAoIWltYWdlcy0+UmVtb3ZlRGlzYWJsZWRJbWFnZXMoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgIGF1dG8gc2l6ZSA9IGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1aW50NjRfdD4oa0RhdGFTY3JhdGNoU2l6ZU1iUHJvcCwgMCkgKiAxX01pQjsKLSAgICAgICAgaWYgKCFzaXplKSB7Ci0gICAgICAgICAgICBzaXplID0gR2V0SWRlYWxEYXRhU2NyYXRjaFNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgICAgIHNpemUgPSAyX0dpQjsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gZmxhZ3MgPSBJSW1hZ2VNYW5hZ2VyOjpDUkVBVEVfSU1BR0VfREVGQVVMVDsKLQotICAgICAgICBpZiAoIWltYWdlcy0+Q3JlYXRlQmFja2luZ0ltYWdlKHBhcnRpdGlvbl9uYW1lLCBzaXplLCBmbGFncykpIHsKLSAgICAgICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IGNyZWF0ZSBzY3JhdGNoIGltYWdlIG9mICIgPDwgc2l6ZSA8PCAiIGJ5dGVzIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWltYWdlcy0+TWFwSW1hZ2VEZXZpY2UocGFydGl0aW9uX25hbWUsIDEwcywgc2NyYXRjaF9kZXZpY2UpKSB7Ci0gICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IG1hcCBzY3JhdGNoIGltYWdlIjsKLSAgICAgICAgLy8gSWYgd2UgY2Fubm90IHVzZSB0aGlzIGltYWdlLCB0aGVuIHJlbW92ZSBpdC4KLSAgICAgICAgVGVhcmRvd25EYXRhU2NyYXRjaChpbWFnZXMuZ2V0KCksIHBhcnRpdGlvbl9uYW1lLCBmYWxzZSAvKiB3YXNfbW91bnRlZCAqLyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIENhblVzZVN1cGVyUGFydGl0aW9uKGNvbnN0IEZzdGFiJiBmc3RhYikgewotICAgIGF1dG8gc2xvdF9udW1iZXIgPSBmc19tZ3Jfb3ZlcmxheWZzX3Nsb3RfbnVtYmVyKCk7Ci0gICAgYXV0byBzdXBlcl9kZXZpY2UgPSBmc19tZ3Jfb3ZlcmxheWZzX3N1cGVyX2RldmljZShzbG90X251bWJlcik7Ci0gICAgaWYgKCFmc19tZ3JfcndfYWNjZXNzKHN1cGVyX2RldmljZSkgfHwgIWZzX21ncl9vdmVybGF5ZnNfaGFzX2xvZ2ljYWwoZnN0YWIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYXV0byBtZXRhZGF0YSA9IFJlYWRNZXRhZGF0YShzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKLSAgICBpZiAoIW1ldGFkYXRhKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19jcmVhdGVfc2NyYXRjaChjb25zdCBGc3RhYiYgZnN0YWIsIHN0ZDo6c3RyaW5nKiBzY3JhdGNoX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwYXJ0aXRpb25fZXhpc3RzKSB7Ci0gICAgLy8gVXNlIHRoZSBEU1Ugc2NyYXRjaCBkZXZpY2UgbWFuYWdlZCBieSBnc2lkIGlmIHdpdGhpbiBhIERTVSBzeXN0ZW0uCi0gICAgaWYgKGZzX21ncl9pc19kc3VfcnVubmluZygpKSB7Ci0gICAgICAgICpzY3JhdGNoX2RldmljZSA9IEdldERzdVNjcmF0Y2hEZXZpY2UoKTsKLSAgICAgICAgKnBhcnRpdGlvbl9leGlzdHMgPSAhc2NyYXRjaF9kZXZpY2UtPmVtcHR5KCk7Ci0gICAgICAgIHJldHVybiAqcGFydGl0aW9uX2V4aXN0czsKLSAgICB9Ci0KLSAgICAvLyBUcnkgSW1hZ2VNYW5hZ2VyIG9uIC9kYXRhIGZpcnN0LgotICAgIGJvb2wgY2FuX3VzZV9kYXRhID0gZmFsc2U7Ci0gICAgaWYgKEZpbGVzeXN0ZW1IYXNSZWxpYWJsZVBpbm5pbmcoIi9kYXRhIiwgJmNhbl91c2VfZGF0YSkgJiYgY2FuX3VzZV9kYXRhKSB7Ci0gICAgICAgIGlmIChDcmVhdGVTY3JhdGNoT25EYXRhKHNjcmF0Y2hfZGV2aWNlLCBwYXJ0aXRpb25fZXhpc3RzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgc2NyYXRjaCBvbiAvZGF0YSwgZmFsbGJhY2sgdG8gdXNlIGZyZWUgc3BhY2Ugb24gc3VwZXIiOwotICAgIH0KLSAgICAvLyBJZiB0aGF0IGZhaWxzLCBzZWUgaWYgd2UgY2FuIGxhbmQgb24gc3VwZXIuCi0gICAgaWYgKENhblVzZVN1cGVyUGFydGl0aW9uKGZzdGFiKSkgewotICAgICAgICByZXR1cm4gQ3JlYXRlRHluYW1pY1NjcmF0Y2goc2NyYXRjaF9kZXZpY2UsIHBhcnRpdGlvbl9leGlzdHMpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIENyZWF0ZSBhbmQgbW91bnQga1NjcmF0Y2hNb3VudFBvaW50IHN0b3JhZ2UgaWYgd2UgaGF2ZSBsb2dpY2FsIHBhcnRpdGlvbnMKLWJvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cF9zY3JhdGNoKGNvbnN0IEZzdGFiJiBmc3RhYikgewotICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChrU2NyYXRjaE1vdW50UG9pbnQsIGZhbHNlKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBzY3JhdGNoX2RldmljZTsKLSAgICBib29sIHBhcnRpdGlvbl9leGlzdHM7Ci0gICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX2NyZWF0ZV9zY3JhdGNoKGZzdGFiLCAmc2NyYXRjaF9kZXZpY2UsICZwYXJ0aXRpb25fZXhpc3RzKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHNjcmF0Y2ggcGFydGl0aW9uIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBwYXJ0aXRpb24gZXhpc3RzLCBhc3N1bWUgZmlyc3QgdGhhdCBpdCBjYW4gYmUgbW91bnRlZC4KLSAgICBpZiAocGFydGl0aW9uX2V4aXN0cykgewotICAgICAgICBpZiAoTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKSkgewotICAgICAgICAgICAgaWYgKGZzX21ncl9hY2Nlc3Moa1NjcmF0Y2hNb3VudFBvaW50ICsga092ZXJsYXlUb3BEaXIpIHx8Ci0gICAgICAgICAgICAgICAgZnNfbWdyX2ZpbGVzeXN0ZW1faGFzX3NwYWNlKGtTY3JhdGNoTW91bnRQb2ludCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGRlY2xhcmUgaXQgdXNlbGVzcywgbm8gb3ZlcnJpZGVzIGFuZCBubyBmcmVlIHNwYWNlCi0gICAgICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKSkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byB1bm1vdW50IHNjcmF0Y2ggcGFydGl0aW9uIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIU1ha2VTY3JhdGNoRmlsZXN5c3RlbShzY3JhdGNoX2RldmljZSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZvcm1hdCBzY3JhdGNoIHBhcnRpdGlvbiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKTsKLX0KLQotI2lmIEFMTE9XX0FEQkRfRElTQUJMRV9WRVJJVFkKLWNvbnN0ZXhwciBib29sIGtBbGxvd092ZXJsYXlmcyA9IHRydWU7Ci0jZWxzZQotY29uc3RleHByIGJvb2wga0FsbG93T3ZlcmxheWZzID0gZmFsc2U7Ci0jZW5kaWYKLQotLy8gTk9URTogT3ZlcmxheWZzU2V0dXBBbGxvd2VkKCkgbXVzdCBiZSAic3RyaWN0ZXIiIHRoYW4gT3ZlcmxheWZzVGVhcmRvd25BbGxvd2VkKCkuCi0vLyBTZXR1cCBpcyBhbGxvd2VkIG9ubHkgaWYgdGVhcmRvd24gaXMgYWxzbyBhbGxvd2VkLgotYm9vbCBPdmVybGF5ZnNTZXR1cEFsbG93ZWQoYm9vbCB2ZXJib3NlID0gZmFsc2UpIHsKLSAgICBpZiAoIWtBbGxvd092ZXJsYXlmcykgewotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiT3ZlcmxheWZzIHJlbW91bnRzIGNhbiBvbmx5IGJlIHVzZWQgaW4gZGVidWdnYWJsZSBidWlsZHMiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gQ2hlY2sgbWFuZGF0b3J5IGtlcm5lbCBwYXRjaGVzLgotICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX3ZhbGlkKCkgPT0gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtOb3RTdXBwb3J0ZWQpIHsKLSAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIktlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsYXlmcyI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBpbiByZWNvdmVyeSBvciBmYXN0Ym9vdGQsIG5vdCBhbGxvd2VkIQotICAgIGlmIChmc19tZ3JfaW5fcmVjb3ZlcnkoKSkgewotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgb3ZlcmxheWZzIHNldHVwIGZyb20gcmVjb3ZlcnkiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0ZXhwciBib29sIE92ZXJsYXlmc1RlYXJkb3duQWxsb3dlZCgpIHsKLSAgICAvLyBOZXZlciBhbGxvdyBvbiBub24tZGVidWdnYWJsZSBidWlsZC4KLSAgICByZXR1cm4ga0FsbG93T3ZlcmxheWZzOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotYm9vbCBmc19tZ3Jfd2FudHNfb3ZlcmxheWZzKEZzdGFiRW50cnkqIGVudHJ5KSB7Ci0gICAgLy8gRG9uJ3QgY2hlY2sgZW50cmllcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHZvbGQuCi0gICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3Mudm9sZF9tYW5hZ2VkIHx8IGVudHJ5LT5mc19tZ3JfZmxhZ3MucmVjb3Zlcnlfb25seSkgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gKl9vdGhlciBkb2Vzbid0IHdhbnQgb3ZlcmxheWZzLgotICAgIGlmIChlbnRyeS0+ZnNfbWdyX2ZsYWdzLnNsb3Rfc2VsZWN0X290aGVyKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBPbmx5IGNvbmNlcm5lZCB3aXRoIHJlYWRvbmx5IHBhcnRpdGlvbnMuCi0gICAgaWYgKCEoZW50cnktPmZsYWdzICYgTVNfUkRPTkxZKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gSWYgdW5iaW5kYWJsZSwgZG8gbm90IGFsbG93IG92ZXJsYXlmcyBhcyB0aGlzIGNvdWxkIGV4cG9zZSB1cyB0bwotICAgIC8vIHNlY3VyaXR5IGlzc3Vlcy4gIE9uIEFuZHJvaWQsIHRoaXMgY291bGQgYWxzbyBiZSB1c2VkIHRvIHR1cm4gb2ZmCi0gICAgLy8gdGhlIGFiaWxpdHkgdG8gb3ZlcmxheSBhbiBvdGhlcndpc2UgYWNjZXB0YWJsZSBmaWxlc3lzdGVtIHNpbmNlCi0gICAgLy8gL3N5c3RlbSBhbmQgL3ZlbmRvciBhcmUgbmV2ZXIgYm91bmQoc2ljKSB0by4KLSAgICBpZiAoZW50cnktPmZsYWdzICYgTVNfVU5CSU5EQUJMRSkgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX2VuYWJsZWQoZW50cnkpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotRnN0YWIgZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdChjb25zdCBGc3RhYiYgZnN0YWIpIHsKLSAgICBhbmRyb2lkOjpmc19tZ3I6OkZzdGFiIG1vdW50czsKLSAgICBpZiAoIWFuZHJvaWQ6OmZzX21ncjo6UmVhZEZzdGFiRnJvbUZpbGUoIi9wcm9jL21vdW50cyIsICZtb3VudHMpKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCAvcHJvYy9tb3VudHMiOwotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotCi0gICAgRnN0YWIgY2FuZGlkYXRlczsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWIpIHsKLSAgICAgICAgLy8gRmlsdGVyIG91dCBwYXJ0aXRpb25zIHdob3NlIHR5cGUgZG9lc24ndCBtYXRjaCB3aGF0J3MgbW91bnRlZC4KLSAgICAgICAgLy8gVGhpcyBhdm9pZHMgc3BhbW15IGJlaGF2aW9yIG9uIGRldmljZXMgd2hpY2ggY2FuIG1vdW50IGRpZmZlcmVudAotICAgICAgICAvLyBmaWxlc3lzdGVtcyBmb3IgZWFjaCBwYXJ0aXRpb24uCi0gICAgICAgIGF1dG8gcHJvY19tb3VudF9wb2ludCA9IChlbnRyeS5tb3VudF9wb2ludCA9PSAiL3N5c3RlbSIpID8gIi8iIDogZW50cnkubW91bnRfcG9pbnQ7Ci0gICAgICAgIGF1dG8gbW91bnRlZCA9IEdldEVudHJ5Rm9yTW91bnRQb2ludCgmbW91bnRzLCBwcm9jX21vdW50X3BvaW50KTsKLSAgICAgICAgaWYgKCFtb3VudGVkIHx8IG1vdW50ZWQtPmZzX3R5cGUgIT0gZW50cnkuZnNfdHlwZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBGc3RhYkVudHJ5IG5ld19lbnRyeSA9IGVudHJ5OwotICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGVudHJ5Lm1vdW50X3BvaW50KSAmJgotICAgICAgICAgICAgIWZzX21ncl93YW50c19vdmVybGF5ZnMoJm5ld19lbnRyeSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGF1dG8gbmV3X21vdW50X3BvaW50ID0gZnNfbWdyX21vdW50X3BvaW50KGVudHJ5Lm1vdW50X3BvaW50KTsKLSAgICAgICAgYXV0byBkdXBsaWNhdGVfb3JfbW9yZV9zcGVjaWZpYyA9IGZhbHNlOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBjYW5kaWRhdGVzLmJlZ2luKCk7IGl0ICE9IGNhbmRpZGF0ZXMuZW5kKCk7KSB7Ci0gICAgICAgICAgICBhdXRvIGl0X21vdW50X3BvaW50ID0gZnNfbWdyX21vdW50X3BvaW50KGl0LT5tb3VudF9wb2ludCk7Ci0gICAgICAgICAgICBpZiAoKGl0X21vdW50X3BvaW50ID09IG5ld19tb3VudF9wb2ludCkgfHwKLSAgICAgICAgICAgICAgICAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChuZXdfbW91bnRfcG9pbnQsIGl0X21vdW50X3BvaW50ICsgIi8iKSkpIHsKLSAgICAgICAgICAgICAgICBkdXBsaWNhdGVfb3JfbW9yZV9zcGVjaWZpYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChpdF9tb3VudF9wb2ludCwgbmV3X21vdW50X3BvaW50ICsgIi8iKSkgewotICAgICAgICAgICAgICAgIGl0ID0gY2FuZGlkYXRlcy5lcmFzZShpdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkdXBsaWNhdGVfb3JfbW9yZV9zcGVjaWZpYykgY2FuZGlkYXRlcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG5ld19lbnRyeSkpOwotICAgIH0KLSAgICByZXR1cm4gY2FuZGlkYXRlczsKLX0KLQotc3RhdGljIHZvaWQgVHJ5TW91bnRTY3JhdGNoKCkgewotICAgIC8vIE5vdGUgd2UgZ2V0IHRoZSBib290IHNjcmF0Y2ggZGV2aWNlIGhlcmUsIHdoaWNoIG1lYW5zIGlmIHNjcmF0Y2ggd2FzCi0gICAgLy8ganVzdCBjcmVhdGVkIHRocm91Z2ggSW1hZ2VNYW5hZ2VyLCB0aGlzIGNvdWxkIGZhaWwuIEluIHByYWN0aWNlIHRoaXMKLSAgICAvLyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlICJyZW1vdW50IiBkZXRlY3RzIHRoaXMgc2NlbmFyaW8gKGJ5IGNoZWNraW5nCi0gICAgLy8gaWYgdmVyaXR5IGlzIHN0aWxsIGRpc2FibGVkLCBpLmUuIG5vIHJlYm9vdCBvY2N1cnJlZCksIGFuZCBza2lwcyBjYWxsaW5nCi0gICAgLy8gZnNfbWdyX292ZXJsYXlmc19tb3VudF9hbGwoKS4KLSAgICBhdXRvIHNjcmF0Y2hfZGV2aWNlID0gR2V0Qm9vdFNjcmF0Y2hEZXZpY2UoKTsKLSAgICBpZiAoIWZzX21ncl9yd19hY2Nlc3Moc2NyYXRjaF9kZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFXYWl0Rm9yRmlsZShzY3JhdGNoX2RldmljZSwgMTBzKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlLCB0cnVlIC8qIHJlYWRvbmx5ICovKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gaGFzX292ZXJsYXlmc19kaXIgPSBmc19tZ3JfYWNjZXNzKGtTY3JhdGNoTW91bnRQb2ludCArIGtPdmVybGF5VG9wRGlyKTsKLSAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7Ci0gICAgaWYgKGhhc19vdmVybGF5ZnNfZGlyKSB7Ci0gICAgICAgIE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSk7Ci0gICAgfQotfQotCi1ib29sIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfYWxsKEZzdGFiKiBmc3RhYikgewotICAgIGlmICghT3ZlcmxheWZzU2V0dXBBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhdXRvIHJldCA9IHRydWU7Ci0gICAgYXV0byBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkID0gdHJ1ZTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdCgqZnN0YWIpKSB7Ci0gICAgICAgIGlmIChmc19tZ3JfaXNfdmVyaXR5X2VuYWJsZWQoZW50cnkpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChlbnRyeS5tb3VudF9wb2ludCk7Ci0gICAgICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChtb3VudF9wb2ludCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzY3JhdGNoX2Nhbl9iZV9tb3VudGVkKSB7Ci0gICAgICAgICAgICBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBUcnlNb3VudFNjcmF0Y2goKTsKLSAgICAgICAgfQotICAgICAgICByZXQgJj0gZnNfbWdyX292ZXJsYXlmc19tb3VudChlbnRyeSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cChjb25zdCBGc3RhYiYgZnN0YWIsIGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LCBib29sKiB3YW50X3JlYm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGp1c3RfZGlzYWJsZWRfdmVyaXR5KSB7Ci0gICAgaWYgKCFPdmVybGF5ZnNTZXR1cEFsbG93ZWQoLyp2ZXJib3NlPSovdHJ1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghZnNfbWdyX2Jvb3RfY29tcGxldGVkKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHNldHVwIG92ZXJsYXlmcyBiZWZvcmUgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSByZWFkeSI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBhdXRvIGNhbmRpZGF0ZXMgPSBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KGZzdGFiKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBjYW5kaWRhdGVzLmJlZ2luKCk7IGl0ICE9IGNhbmRpZGF0ZXMuZW5kKCk7KSB7Ci0gICAgICAgIGlmIChtb3VudF9wb2ludCAmJgotICAgICAgICAgICAgKGZzX21ncl9tb3VudF9wb2ludChpdC0+bW91bnRfcG9pbnQpICE9IGZzX21ncl9tb3VudF9wb2ludChtb3VudF9wb2ludCkpKSB7Ci0gICAgICAgICAgICBpdCA9IGNhbmRpZGF0ZXMuZXJhc2UoaXQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIHZlcml0eV9lbmFibGVkID0gIWp1c3RfZGlzYWJsZWRfdmVyaXR5ICYmIGZzX21ncl9pc192ZXJpdHlfZW5hYmxlZCgqaXQpOwotICAgICAgICBpZiAodmVyaXR5X2VuYWJsZWQpIHsKLSAgICAgICAgICAgIGl0ID0gY2FuZGlkYXRlcy5lcmFzZShpdCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICArK2l0OwotICAgIH0KLQotICAgIGlmIChjYW5kaWRhdGVzLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKG1vdW50X3BvaW50KSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBvdmVybGF5ZnMgY2FuZGlkYXRlIHdhcyBmb3VuZCBmb3IgIiA8PCBtb3VudF9wb2ludDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBkaXI7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBvdmVybGF5X21vdW50X3BvaW50IDogT3ZlcmxheU1vdW50UG9pbnRzKCkpIHsKLSAgICAgICAgaWYgKG92ZXJsYXlfbW91bnRfcG9pbnQgPT0ga1NjcmF0Y2hNb3VudFBvaW50KSB7Ci0gICAgICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfc2V0dXBfc2NyYXRjaChmc3RhYikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChHZXRFbnRyeUZvck1vdW50UG9pbnQoJmZzdGFiLCBvdmVybGF5X21vdW50X3BvaW50KSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGlyID0gb3ZlcmxheV9tb3VudF9wb2ludDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChkaXIuZW1wdHkoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgYWxsb2NhdGUgYmFja2luZyBzdG9yYWdlIGZvciBvdmVybGF5cyI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvIG92ZXJsYXkgPSBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwX2RpcihkaXIpOwotICAgIGlmIChvdmVybGF5LmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgb2sgPSB0cnVlOwotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBjYW5kaWRhdGVzKSB7Ci0gICAgICAgIGF1dG8gZnN0YWJfbW91bnRfcG9pbnQgPSBmc19tZ3JfbW91bnRfcG9pbnQoZW50cnkubW91bnRfcG9pbnQpOwotICAgICAgICBvayAmPSBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwX29uZShvdmVybGF5LCBmc3RhYl9tb3VudF9wb2ludCwgd2FudF9yZWJvb3QpOwotICAgIH0KLSAgICByZXR1cm4gb2s7Ci19Ci0KLXN0cnVjdCBNYXBJbmZvIHsKLSAgICAvLyBJZiBzZXQsIHBhcnRpdGlvbiBpcyBvd25lZCBieSBJbWFnZU1hbmFnZXIuCi0gICAgc3RkOjp1bmlxdWVfcHRyPElJbWFnZU1hbmFnZXI+IGltYWdlczsKLSAgICAvLyBJZiBzZXQsIGFuZCBpbWFnZXMgaXMgbnVsbCwgdGhpcyBpcyBhIERBUCBwYXJ0aXRpb24uCi0gICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAvLyBJZiBzZXQsIGFuZCBpbWFnZXMgYW5kIG5hbWUgYXJlIGVtcHR5LCB0aGlzIGlzIGEgbm9uLWR5bmFtaWMgcGFydGl0aW9uLgotICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLQotICAgIE1hcEluZm8oKSA9IGRlZmF1bHQ7Ci0gICAgTWFwSW5mbyhNYXBJbmZvJiYpID0gZGVmYXVsdDsKLSAgICB+TWFwSW5mbygpIHsKLSAgICAgICAgaWYgKGltYWdlcykgewotICAgICAgICAgICAgaW1hZ2VzLT5Vbm1hcEltYWdlRGV2aWNlKG5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKCFuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIERlc3Ryb3lMb2dpY2FsUGFydGl0aW9uKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfTsKLQotLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zIHRoZSBEU1Ugc2NyYXRjaCBkZXZpY2UgaW4gcmVjb3Zlcnkgb3IgZmFzdGJvb3RkLAotLy8gYmVjYXVzZSB0aGUgRFNVIHNjcmF0Y2ggaXMgY3JlYXRlZCBpbiB0aGUgZmlyc3Qtc3RhZ2UtbW91bnQsIHdoaWNoIGlzIG5vdCBydW4gaW4gcmVjb3ZlcnkuCi1zdGF0aWMgc3RkOjpvcHRpb25hbDxNYXBJbmZvPiBFbnN1cmVTY3JhdGNoTWFwcGVkKCkgewotICAgIE1hcEluZm8gaW5mbzsKLSAgICBpbmZvLmRldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7Ci0gICAgaWYgKCFpbmZvLmRldmljZS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB7c3RkOjptb3ZlKGluZm8pfTsKLSAgICB9Ci0gICAgaWYgKCFmc19tZ3JfaW5fcmVjb3ZlcnkoKSkgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotCi0gICAgYXV0byBwYXJ0aXRpb25fbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtTY3JhdGNoTW91bnRQb2ludCk7Ci0KLSAgICAvLyBDaGVjayBmb3Igc2NyYXRjaCBvbiAvZGF0YSBmaXJzdCwgYmVmb3JlIGxvb2tpbmcgZm9yIGEgbW9kaWZpZWQgc3VwZXIKLSAgICAvLyBwYXJ0aXRpb24uIFdlIHNob3VsZCBvbmx5IHJlYWNoIHRoaXMgY29kZSBpbiByZWNvdmVyeSwgYmVjYXVzZSBzY3JhdGNoCi0gICAgLy8gd291bGQgb3RoZXJ3aXNlIGFsd2F5cyBiZSBtYXBwZWQuCi0gICAgYXV0byBpbWFnZXMgPSBJSW1hZ2VNYW5hZ2VyOjpPcGVuKCJyZW1vdW50IiwgMTBzKTsKLSAgICBpZiAoaW1hZ2VzICYmIGltYWdlcy0+QmFja2luZ0ltYWdlRXhpc3RzKHBhcnRpdGlvbl9uYW1lKSkgewotICAgICAgICBpZiAoaW1hZ2VzLT5Jc0ltYWdlRGlzYWJsZWQocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4ge307Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpbWFnZXMtPk1hcEltYWdlRGV2aWNlKHBhcnRpdGlvbl9uYW1lLCAxMHMsICZpbmZvLmRldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgfQotICAgICAgICBpbmZvLm5hbWUgPSBwYXJ0aXRpb25fbmFtZTsKLSAgICAgICAgaW5mby5pbWFnZXMgPSBzdGQ6Om1vdmUoaW1hZ2VzKTsKLSAgICAgICAgcmV0dXJuIHtzdGQ6Om1vdmUoaW5mbyl9OwotICAgIH0KLQotICAgIC8vIEF2b2lkIHVhcnQgc3BhbSBieSBmaXJzdCBjaGVja2luZyBmb3IgYSBzY3JhdGNoIHBhcnRpdGlvbi4KLSAgICBhdXRvIG1ldGFkYXRhX3Nsb3QgPSBmc19tZ3Jfb3ZlcmxheWZzX3Nsb3RfbnVtYmVyKCk7Ci0gICAgYXV0byBzdXBlcl9kZXZpY2UgPSBmc19tZ3Jfb3ZlcmxheWZzX3N1cGVyX2RldmljZShtZXRhZGF0YV9zbG90KTsKLSAgICBhdXRvIG1ldGFkYXRhID0gUmVhZEN1cnJlbnRNZXRhZGF0YShzdXBlcl9kZXZpY2UpOwotICAgIGlmICghbWV0YWRhdGEpIHsKLSAgICAgICAgcmV0dXJuIHt9OwotICAgIH0KLQotICAgIGF1dG8gcGFydGl0aW9uID0gRmluZFBhcnRpdGlvbigqbWV0YWRhdGEuZ2V0KCksIHBhcnRpdGlvbl9uYW1lKTsKLSAgICBpZiAoIXBhcnRpdGlvbikgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotCi0gICAgQ3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyBwYXJhbXMgPSB7Ci0gICAgICAgICAgICAuYmxvY2tfZGV2aWNlID0gc3VwZXJfZGV2aWNlLAotICAgICAgICAgICAgLm1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KCksCi0gICAgICAgICAgICAucGFydGl0aW9uID0gcGFydGl0aW9uLAotICAgICAgICAgICAgLmZvcmNlX3dyaXRhYmxlID0gdHJ1ZSwKLSAgICAgICAgICAgIC50aW1lb3V0X21zID0gMTBzLAotICAgIH07Ci0gICAgaWYgKCFDcmVhdGVMb2dpY2FsUGFydGl0aW9uKHBhcmFtcywgJmluZm8uZGV2aWNlKSkgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotICAgIGluZm8ubmFtZSA9IHBhcnRpdGlvbl9uYW1lOwotICAgIHJldHVybiB7c3RkOjptb3ZlKGluZm8pfTsKLX0KLQotLy8gVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGFibGUgaW4gcmVjb3ZlcnksIHdoZXJlIERTVSBzY3JhdGNoIGlzIG5vdAotLy8gYXV0b21hdGljYWxseSBtYXBwZWQuCi1zdGF0aWMgYm9vbCBNYXBEc3VTY3JhdGNoRGV2aWNlKHN0ZDo6c3RyaW5nKiBkZXZpY2UpIHsKLSAgICBzdGQ6OnN0cmluZyBkc3Vfc2xvdDsKLSAgICBpZiAoIWFuZHJvaWQ6OmdzaTo6SXNHc2lJbnN0YWxsZWQoKSB8fCAhYW5kcm9pZDo6Z3NpOjpHZXRBY3RpdmVEc3UoJmRzdV9zbG90KSB8fAotICAgICAgICBkc3Vfc2xvdC5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgbm8gRFNVIGluc3RhbGxhdGlvbiBwcmVzZW50LgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYXV0byBpbWFnZXMgPSBJSW1hZ2VNYW5hZ2VyOjpPcGVuKCJkc3UvIiArIGRzdV9zbG90LCAxMHMpOwotICAgIGlmICghaW1hZ2VzIHx8ICFpbWFnZXMtPkJhY2tpbmdJbWFnZUV4aXN0cyhhbmRyb2lkOjpnc2k6OmtEc3VTY3JhdGNoKSkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIERTVSBzY3JhdGNoIGRldmljZSBkb2Vzbid0IGV4aXN0LgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW1hZ2VzLT5Vbm1hcEltYWdlRGV2aWNlKGFuZHJvaWQ6OmdzaTo6a0RzdVNjcmF0Y2gpOwotICAgIGlmICghaW1hZ2VzLT5NYXBJbWFnZURldmljZShhbmRyb2lkOjpnc2k6OmtEc3VTY3JhdGNoLCAxMHMsIGRldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0IFRlYXJkb3duTW91bnRzQW5kU2NyYXRjaChjb25zdCBjaGFyKiBtb3VudF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QpIHsKLSAgICBib29sIHNob3VsZF9kZXN0cm95X3NjcmF0Y2ggPSBmYWxzZTsKLSAgICBhdXRvIHJ2ID0gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOwotICAgIGZvciAoY29uc3QgYXV0byYgb3ZlcmxheV9tb3VudF9wb2ludCA6IE92ZXJsYXlNb3VudFBvaW50cygpKSB7Ci0gICAgICAgIGF1dG8gb2sgPSBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX29uZSgKLSAgICAgICAgICAgICAgICBvdmVybGF5X21vdW50X3BvaW50LCBtb3VudF9wb2ludCA/IGZzX21ncl9tb3VudF9wb2ludChtb3VudF9wb2ludCkgOiAiIiwKLSAgICAgICAgICAgICAgICB3YW50X3JlYm9vdCwKLSAgICAgICAgICAgICAgICBvdmVybGF5X21vdW50X3BvaW50ID09IGtTY3JhdGNoTW91bnRQb2ludCA/ICZzaG91bGRfZGVzdHJveV9zY3JhdGNoIDogbnVsbHB0cik7Ci0gICAgICAgIGlmICghb2spIHsKLSAgICAgICAgICAgIHJ2ID0gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gZGVzdHJveSBEU1Ugc2NyYXRjaCBpZiB3aXRoaW4gYSBEU1Ugc3lzdGVtLAotICAgIC8vIGJlY2F1c2UgRFNVIHNjcmF0Y2ggcGFydGl0aW9uIGlzIG1hbmFnZWQgYnkgZ3NpZC4KLSAgICBpZiAoc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCAmJiAhZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkpIHsKLSAgICAgICAgYXV0byBydiA9IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fc2NyYXRjaChrU2NyYXRjaE1vdW50UG9pbnQsIHdhbnRfcmVib290KTsKLSAgICAgICAgaWYgKHJ2ICE9IE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPaykgewotICAgICAgICAgICAgcmV0dXJuIHJ2OwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIEFuZCBub3cgdGhhdCB3ZSBkaWQgd2hhdCB3ZSBjb3VsZCwgbGV0cyBpbmZvcm0KLSAgICAvLyBjYWxsZXIgdGhhdCB0aGVyZSBtYXkgc3RpbGwgYmUgbW9yZSB0byBkby4KLSAgICBpZiAoIWZzX21ncl9ib290X2NvbXBsZXRlZCgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCB0ZWFyZG93biBvdmVybGF5ZnMgYmVmb3JlIHBlcnNpc3RlbnQgcHJvcGVydGllcyBhcmUgcmVhZHkiOwotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLS8vIFJldHVybnMgZmFsc2UgaWYgdGVhcmRvd24gbm90IHBlcm1pdHRlZC4gSWYgc29tZXRoaW5nIGlzIGFsdGVyZWQsIHNldCAqd2FudF9yZWJvb3QuCi1PdmVybGF5ZnNUZWFyZG93blJlc3VsdCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LCBib29sKiB3YW50X3JlYm9vdCkgewotICAgIGlmICghT3ZlcmxheWZzVGVhcmRvd25BbGxvd2VkKCkpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byB0ZWFyZG93bi4KLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKLSAgICB9Ci0gICAgLy8gSWYgc2NyYXRjaCBleGlzdHMsIGJ1dCBpcyBub3QgbW91bnRlZCwgbGV0cyBnYWluIGFjY2VzcyB0byBjbGVhbgotICAgIC8vIHNwZWNpZmljIG92ZXJyaWRlIGVudHJpZXMuCi0gICAgYXV0byBtb3VudF9zY3JhdGNoID0gZmFsc2U7Ci0gICAgaWYgKChtb3VudF9wb2ludCAhPSBudWxscHRyKSAmJiAhZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoa1NjcmF0Y2hNb3VudFBvaW50LCBmYWxzZSkpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgc2NyYXRjaF9kZXZpY2UgPSBHZXRCb290U2NyYXRjaERldmljZSgpOwotICAgICAgICBpZiAoIXNjcmF0Y2hfZGV2aWNlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIG1vdW50X3NjcmF0Y2ggPSBNb3VudFNjcmF0Y2goc2NyYXRjaF9kZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXV0byBydiA9IFRlYXJkb3duTW91bnRzQW5kU2NyYXRjaChtb3VudF9wb2ludCwgd2FudF9yZWJvb3QpOwotCi0gICAgaWYgKG1vdW50X3NjcmF0Y2gpIHsKLSAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6QnVzeTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19pc19zZXR1cCgpIHsKLSAgICBpZiAoIU92ZXJsYXlmc1NldHVwQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGtTY3JhdGNoTW91bnRQb2ludCwgZmFsc2UpKSByZXR1cm4gdHJ1ZTsKLSAgICBGc3RhYiBmc3RhYjsKLSAgICBpZiAoIVJlYWREZWZhdWx0RnN0YWIoJmZzdGFiKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KGZzdGFiKSkgewotICAgICAgICBpZiAoZnNfbWdyX2lzX3Zlcml0eV9lbmFibGVkKGVudHJ5KSkgY29udGludWU7Ci0gICAgICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChmc19tZ3JfbW91bnRfcG9pbnQoZW50cnkubW91bnRfcG9pbnQpKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGZzX21nciB7Ci0KLXZvaWQgTWFwU2NyYXRjaFBhcnRpdGlvbklmTmVlZGVkKEZzdGFiKiBmc3RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mKT4mIGluaXQpIHsKLSAgICBpZiAoIU92ZXJsYXlmc1NldHVwQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKEdldEVudHJ5Rm9yTW91bnRQb2ludChmc3RhYiwga1NjcmF0Y2hNb3VudFBvaW50KSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIHdhbnRfc2NyYXRjaCA9IGZhbHNlOwotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KCpmc3RhYikpIHsKLSAgICAgICAgaWYgKGZzX21ncl9pc192ZXJpdHlfZW5hYmxlZChlbnRyeSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChmc19tZ3JfbW91bnRfcG9pbnQoZW50cnkubW91bnRfcG9pbnQpKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgd2FudF9zY3JhdGNoID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmICghd2FudF9zY3JhdGNoKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoU2NyYXRjaElzT25EYXRhKCkpIHsKLSAgICAgICAgaWYgKGF1dG8gaW1hZ2VzID0gSUltYWdlTWFuYWdlcjo6T3BlbigicmVtb3VudCIsIDBtcykpIHsKLSAgICAgICAgICAgIGltYWdlcy0+TWFwQWxsSW1hZ2VzKGluaXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUGh5c2ljYWwgb3IgbG9naWNhbCBwYXJ0aXRpb25zIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gbWFwcGVkIGhlcmUsCi0gICAgLy8gc28ganVzdCBlbnN1cmUgL2Rldi9ibG9jayBzeW1saW5rcyBleGlzdC4KLSAgICBhdXRvIGRldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7Ci0gICAgaWYgKCFkZXZpY2UuZW1wdHkoKSkgewotICAgICAgICBpbml0KHthbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShkZXZpY2UpfSk7Ci0gICAgfQotfQotCi12b2lkIENsZWFudXBPbGRTY3JhdGNoRmlsZXMoKSB7Ci0gICAgaWYgKCFPdmVybGF5ZnNUZWFyZG93bkFsbG93ZWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghU2NyYXRjaElzT25EYXRhKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYXV0byBpbWFnZXMgPSBJSW1hZ2VNYW5hZ2VyOjpPcGVuKCJyZW1vdW50IiwgMG1zKSkgewotICAgICAgICBpbWFnZXMtPlJlbW92ZURpc2FibGVkSW1hZ2VzKCk7Ci0gICAgfQotfQotCi12b2lkIFRlYXJkb3duQWxsT3ZlcmxheUZvck1vdW50UG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7Ci0gICAgaWYgKCFPdmVybGF5ZnNUZWFyZG93bkFsbG93ZWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghZnNfbWdyX2luX3JlY292ZXJ5KCkpIHsKLSAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IG11c3QgYmUgY2FsbGVkIHdpdGhpbiByZWNvdmVyeS4iOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRW1wdHkgc3RyaW5nIG1lYW5zIHRlYXJkb3duIGV2ZXJ5dGhpbmcuCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgdGVhcmRvd25fZGlyID0gbW91bnRfcG9pbnQuZW1wdHkoKSA/ICIiIDogZnNfbWdyX21vdW50X3BvaW50KG1vdW50X3BvaW50KTsKLSAgICBjb25zdGV4cHIgYm9vbCogaWdub3JlX2NoYW5nZSA9IG51bGxwdHI7Ci0KLSAgICAvLyBUZWFyZG93biBsZWdhY3kgb3ZlcmxheSBtb3VudCBwb2ludHMgdGhhdCdzIG5vdCBiYWNrZWQgYnkgYSBzY3JhdGNoIGRldmljZS4KLSAgICBmb3IgKGNvbnN0IGF1dG8mIG92ZXJsYXlfbW91bnRfcG9pbnQgOiBPdmVybGF5TW91bnRQb2ludHMoKSkgewotICAgICAgICBpZiAob3ZlcmxheV9tb3VudF9wb2ludCA9PSBrU2NyYXRjaE1vdW50UG9pbnQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fb25lKG92ZXJsYXlfbW91bnRfcG9pbnQsIHRlYXJkb3duX2RpciwgaWdub3JlX2NoYW5nZSk7Ci0gICAgfQotCi0gICAgaWYgKG1vdW50X3BvaW50LmVtcHR5KCkpIHsKLSAgICAgICAgLy8gVGhyb3cgYXdheSB0aGUgZW50aXJlIHBhcnRpdGlvbi4KLSAgICAgICAgYXV0byBwYXJ0aXRpb25fbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtTY3JhdGNoTW91bnRQb2ludCk7Ci0gICAgICAgIGF1dG8gaW1hZ2VzID0gSUltYWdlTWFuYWdlcjo6T3BlbigicmVtb3VudCIsIDEwcyk7Ci0gICAgICAgIGlmIChpbWFnZXMgJiYgaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoaW1hZ2VzLT5EaXNhYmxlSW1hZ2UocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJEaXNhYmxlZCBzY3JhdGNoIHBhcnRpdGlvbiBmb3I6ICIgPDwga1NjcmF0Y2hNb3VudFBvaW50OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZGlzYWJsZSBzY3JhdGNoIHBhcnRpdGlvbiBmb3IgIiA8PCBrU2NyYXRjaE1vdW50UG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3RlIGlmIHdlIGp1c3QgZGlzYWJsZWQgc2NyYXRjaCwgdGhpcyBtb3VudCB3aWxsIGZhaWwuCi0gICAgaWYgKGF1dG8gaW5mbyA9IEVuc3VyZVNjcmF0Y2hNYXBwZWQoKTsgaW5mby5oYXNfdmFsdWUoKSkgewotICAgICAgICAvLyBNYXAgc2NyYXRjaCBkZXZpY2UsIG1vdW50IGtTY3JhdGNoTW91bnRQb2ludCBhbmQgdGVhcmRvd24ga1NjcmF0Y2hNb3VudFBvaW50LgotICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7Ci0gICAgICAgIGlmIChNb3VudFNjcmF0Y2goaW5mby0+ZGV2aWNlKSkgewotICAgICAgICAgICAgYm9vbCBzaG91bGRfZGVzdHJveV9zY3JhdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX29uZShrU2NyYXRjaE1vdW50UG9pbnQsIHRlYXJkb3duX2RpciwgaWdub3JlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaG91bGRfZGVzdHJveV9zY3JhdGNoKTsKLSAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRfZGVzdHJveV9zY3JhdGNoKSB7Ci0gICAgICAgICAgICAgICAgZnNfbWdyX292ZXJsYXlmc190ZWFyZG93bl9zY3JhdGNoKGtTY3JhdGNoTW91bnRQb2ludCwgbnVsbHB0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUZWFyZG93biBEU1Ugb3ZlcmxheSBpZiBwcmVzZW50LgotICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2hfZGV2aWNlOwotICAgIGlmIChNYXBEc3VTY3JhdGNoRGV2aWNlKCZzY3JhdGNoX2RldmljZSkpIHsKLSAgICAgICAgZnNfbWdyX292ZXJsYXlmc191bW91bnRfc2NyYXRjaCgpOwotICAgICAgICBpZiAoTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKSkgewotICAgICAgICAgICAgZnNfbWdyX292ZXJsYXlmc190ZWFyZG93bl9vbmUoa1NjcmF0Y2hNb3VudFBvaW50LCB0ZWFyZG93bl9kaXIsIGlnbm9yZV9jaGFuZ2UpOwotICAgICAgICAgICAgZnNfbWdyX292ZXJsYXlmc191bW91bnRfc2NyYXRjaCgpOwotICAgICAgICB9Ci0gICAgICAgIERlc3Ryb3lMb2dpY2FsUGFydGl0aW9uKGFuZHJvaWQ6OmdzaTo6a0RzdVNjcmF0Y2gpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZzX21ncgotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsIGJvb2wgb3ZlcmxheV9vbmx5KSB7Ci0gICAgRnN0YWIgZnN0YWI7Ci0gICAgaWYgKCFSZWFkRnN0YWJGcm9tRmlsZSgiL3Byb2MvbW91bnRzIiwgJmZzdGFiKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNvbnN0IGF1dG8gbG93ZXJkaXIgPSBrTG93ZXJkaXJPcHRpb24gKyBtb3VudF9wb2ludDsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWIpIHsKLSAgICAgICAgaWYgKG92ZXJsYXlfb25seSAmJiAib3ZlcmxheSIgIT0gZW50cnkuZnNfdHlwZSAmJiAib3ZlcmxheWZzIiAhPSBlbnRyeS5mc190eXBlKSBjb250aW51ZTsKLSAgICAgICAgaWYgKG1vdW50X3BvaW50ICE9IGVudHJ5Lm1vdW50X3BvaW50KSBjb250aW51ZTsKLSAgICAgICAgaWYgKCFvdmVybGF5X29ubHkpIHJldHVybiB0cnVlOwotICAgICAgICBjb25zdCBhdXRvIG9wdGlvbnMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChlbnRyeS5mc19vcHRpb25zLCAiLCIpOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG9wdCA6IG9wdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChvcHQgPT0gbG93ZXJkaXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmNwcCBiL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzX2NvbnRyb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YWQ4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmNwcApAQCAtMCwwICsxLDEwMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8ZnNfbWdyLmg+CisjaW5jbHVkZSA8ZnNfbWdyX2RtX2xpbmVhci5oPgorI2luY2x1ZGUgPGZzX21ncl9vdmVybGF5ZnMuaD4KKyNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgorI2luY2x1ZGUgPGxpYmRtL2RtLmg+CisjaW5jbHVkZSA8bGliZmllbWFwL2ltYWdlX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxsaWJnc2kvbGliZ3NpLmg+CisjaW5jbHVkZSA8bGlibHAvYnVpbGRlci5oPgorI2luY2x1ZGUgPGxpYmxwL2xpYmxwLmg+CisjaW5jbHVkZSA8c3RvcmFnZV9saXRlcmFscy9zdG9yYWdlX2xpdGVyYWxzLmg+CisKKyNpbmNsdWRlICJmc19tZ3Jfb3ZlcmxheWZzX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJmc19tZ3Jfb3ZlcmxheWZzX21vdW50LmgiCisjaW5jbHVkZSAiZnNfbWdyX3ByaXYuaCIKKyNpbmNsdWRlICJsaWJmaWVtYXAvdXRpbGl0eS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpsaXRlcmFsczsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpkbTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpmc19tZ3I7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKK3VzaW5nIGFuZHJvaWQ6OmZpZW1hcDo6RmlsZXN5c3RlbUhhc1JlbGlhYmxlUGlubmluZzsKK3VzaW5nIGFuZHJvaWQ6OmZpZW1hcDo6SUltYWdlTWFuYWdlcjsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIga0RhdGFTY3JhdGNoU2l6ZU1iUHJvcFtdID0gImZzX21nci5vdmVybGF5ZnMuZGF0YV9zY3JhdGNoX3NpemVfbWIiOworCitjb25zdGV4cHIgY2hhciBrUGh5c2ljYWxEZXZpY2VbXSA9ICIvZGV2L2Jsb2NrL2J5LW5hbWUvIjsKK2NvbnN0ZXhwciBjaGFyIGtTY3JhdGNoSW1hZ2VNZXRhZGF0YVtdID0gIi9tZXRhZGF0YS9nc2kvcmVtb3VudC9scF9tZXRhZGF0YSI7CisKK2NvbnN0ZXhwciBjaGFyIGtNa0YyZnNbXSA9ICIvc3lzdGVtL2Jpbi9tYWtlX2YyZnMiOworY29uc3RleHByIGNoYXIga01rRXh0NFtdID0gIi9zeXN0ZW0vYmluL21rZTJmcyI7CisKKy8vIFJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgaXMgbW91bnRlZCwgYnV0IGJlZm9yZSBhZGIgaXMgc3RhcnRlZC4gIFJpZ2h0CisvLyBhZnRlciAndHJpZ2dlciBsb2FkX3BlcnNpc3RfcHJvcHNfYWN0aW9uJyBpcyBkb25lLgorc3RhdGljIGJvb2wgZnNfbWdyX2Jvb3RfY29tcGxldGVkKCkgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnBlcnNpc3RlbnRfcHJvcGVydGllcy5yZWFkeSIsIGZhbHNlKTsKK30KKworLy8gTm90ZTogdGhpcyBpcyBtZWFudCBvbmx5IGZvciByZWNvdmVyeS9maXJzdC1zdGFnZSBpbml0Lgorc3RhdGljIGJvb2wgU2NyYXRjaElzT25EYXRhKCkgeworICAgIC8vIFRoZSBzY3JhdGNoIHBhcnRpdGlvbiBvZiBEU1UgaXMgbWFuYWdlZCBieSBnc2lkLgorICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBhY2Nlc3Moa1NjcmF0Y2hJbWFnZU1ldGFkYXRhLCBGX09LKSA9PSAwOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3Jfcm1fYWxsKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sKiBjaGFuZ2UgPSBudWxscHRyLCBpbnQgbGV2ZWwgPSAwKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgZGVjbHR5cGUoJmNsb3NlZGlyKT4gZGlyKG9wZW5kaXIocGF0aC5jX3N0cigpKSwgY2xvc2VkaXIpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIFBFUlJPUiA8PCAib3BlbmRpciAiIDw8IHBhdGggPDwgIiBkZXB0aD0iIDw8IGxldmVsOworICAgICAgICBpZiAoKGVycm5vID09IEVQRVJNKSAmJiAobGV2ZWwgIT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlyZW50KiBlbnRyeTsKKyAgICBhdXRvIHJldCA9IHRydWU7CisgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyLmdldCgpKSkpIHsKKyAgICAgICAgaWYgKCgiLiJzID09IGVudHJ5LT5kX25hbWUpIHx8ICgiLi4icyA9PSBlbnRyeS0+ZF9uYW1lKSkgY29udGludWU7CisgICAgICAgIGF1dG8gZmlsZSA9IHBhdGggKyAiLyIgKyBlbnRyeS0+ZF9uYW1lOworICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9VTktOT1dOKSB7CisgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAgICAgICAgIGlmICghbHN0YXQoZmlsZS5jX3N0cigpLCAmc3QpICYmIChzdC5zdF9tb2RlICYgU19JRkRJUikpIGVudHJ5LT5kX3R5cGUgPSBEVF9ESVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudHJ5LT5kX3R5cGUgPT0gRFRfRElSKSB7CisgICAgICAgICAgICByZXQgJj0gZnNfbWdyX3JtX2FsbChmaWxlLCBjaGFuZ2UsIGxldmVsICsgMSk7CisgICAgICAgICAgICBpZiAoIXJtZGlyKGZpbGUuY19zdHIoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlKSAqY2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgUEVSUk9SIDw8ICJybWRpciAiIDw8IGZpbGUgPDwgIiBkZXB0aD0iIDw8IGxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF1bmxpbmsoZmlsZS5jX3N0cigpKSkgeworICAgICAgICAgICAgaWYgKGNoYW5nZSkgKmNoYW5nZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKSByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIFBFUlJPUiA8PCAicm0gIiA8PCBmaWxlIDw8ICIgZGVwdGg9IiA8PCBsZXZlbDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwX2Rpcihjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSB7CisgICAgYXV0byB0b3AgPSBkaXIgKyAiLyIgKyBrT3ZlcmxheVRvcERpcjsKKworICAgIEF1dG9TZXRGc0NyZWF0ZUNvbiBjcmVhdGVjb24oa092ZXJsYXlmc0ZpbGVDb250ZXh0KTsKKyAgICBpZiAoIWNyZWF0ZWNvbi5PaygpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgaWYgKG1rZGlyKHRvcC5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICBQRVJST1IgPDwgIm1rZGlyICIgPDwgdG9wOworICAgICAgICByZXR1cm4ge307CisgICAgfQorICAgIGlmICghY3JlYXRlY29uLlJlc3RvcmUoKSkgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorICAgIHJldHVybiB0b3A7Cit9CisKK2Jvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cF9vbmUoY29uc3Qgc3RkOjpzdHJpbmcmIG92ZXJsYXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QpIHsKKyAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQobW91bnRfcG9pbnQpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjb25zdCBhdXRvIGJhc2UgPSBHZXRFbmNvZGVkQmFzZURpckZvck1vdW50UG9pbnQobW91bnRfcG9pbnQpOworICAgIGF1dG8gZnNyZWNfbW91bnRfcG9pbnQgPSBvdmVybGF5ICsgIi8iICsgYmFzZSArICIvIjsKKworICAgIEF1dG9TZXRGc0NyZWF0ZUNvbiBjcmVhdGVjb24oa092ZXJsYXlmc0ZpbGVDb250ZXh0KTsKKyAgICBpZiAoIWNyZWF0ZWNvbi5PaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1rZGlyKGZzcmVjX21vdW50X3BvaW50LmNfc3RyKCksIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgIFBFUlJPUiA8PCAibWtkaXIgIiA8PCBmc3JlY19tb3VudF9wb2ludDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWtkaXIoKGZzcmVjX21vdW50X3BvaW50ICsga1dvcmtOYW1lKS5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICBQRVJST1IgPDwgIm1rZGlyICIgPDwgZnNyZWNfbW91bnRfcG9pbnQgPDwga1dvcmtOYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghY3JlYXRlY29uLlJlc3RvcmUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY3JlYXRlY29uID0ge307CisKKyAgICBhdXRvIG5ld19jb250ZXh0ID0gZnNfbWdyX2dldF9jb250ZXh0KG1vdW50X3BvaW50KTsKKyAgICBpZiAobmV3X2NvbnRleHQuZW1wdHkoKSB8fCAhY3JlYXRlY29uLlNldChuZXdfY29udGV4dCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8gdXBwZXIgPSBmc3JlY19tb3VudF9wb2ludCArIGtVcHBlck5hbWU7CisgICAgaWYgKG1rZGlyKHVwcGVyLmNfc3RyKCksIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgIFBFUlJPUiA8PCAibWtkaXIgIiA8PCB1cHBlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh3YW50X3JlYm9vdCkgKndhbnRfcmVib290ID0gdHJ1ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgZnNfbWdyX292ZXJsYXlmc19zbG90X251bWJlcigpIHsKKyAgICByZXR1cm4gU2xvdE51bWJlckZvclNsb3RTdWZmaXgoZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpKTsKK30KKworc3RhdGljIGJvb2wgZnNfbWdyX292ZXJsYXlmc19oYXNfbG9naWNhbChjb25zdCBGc3RhYiYgZnN0YWIpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWIpIHsKKyAgICAgICAgaWYgKGVudHJ5LmZzX21ncl9mbGFncy5sb2dpY2FsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK092ZXJsYXlmc1RlYXJkb3duUmVzdWx0IFRlYXJkb3duRGF0YVNjcmF0Y2goSUltYWdlTWFuYWdlciogaW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGJvb2wgd2FzX21vdW50ZWQpIHsKKyAgICBpZiAoIWltYWdlcykgeworICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOworICAgIH0KKyAgICBpZiAoIWltYWdlcy0+RGlzYWJsZUltYWdlKHBhcnRpdGlvbl9uYW1lKSkgeworICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOworICAgIH0KKyAgICBpZiAod2FzX21vdW50ZWQpIHsKKyAgICAgICAgLy8gSWYgb3ZlcmxheWZzIHdhcyBtb3VudGVkLCBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIHVubWFwIHNpbmNlCisgICAgICAgIC8vIGl0J2xsIGZhaWwgYW5kIGNyZWF0ZSBlcnJvciBzcGFtLgorICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkJ1c3k7CisgICAgfQorICAgIGlmICghaW1hZ2VzLT5Vbm1hcEltYWdlSWZFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6QnVzeTsKKyAgICB9CisgICAgaWYgKCFpbWFnZXMtPkRlbGV0ZUJhY2tpbmdJbWFnZShwYXJ0aXRpb25fbmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpCdXN5OworICAgIH0KKyAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOworfQorCitib29sIEdldE92ZXJsYXlzQWN0aXZlRmxhZygpIHsKKyAgICBhdXRvIHNsb3RfbnVtYmVyID0gZnNfbWdyX292ZXJsYXlmc19zbG90X251bWJlcigpOworICAgIGNvbnN0IGF1dG8gc3VwZXJfZGV2aWNlID0ga1BoeXNpY2FsRGV2aWNlICsgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZSgpOworCisgICAgYXV0byBtZXRhZGF0YSA9IFJlYWRNZXRhZGF0YShzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKKyAgICBpZiAoIW1ldGFkYXRhKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICEhKG1ldGFkYXRhLT5oZWFkZXIuZmxhZ3MgJiBMUF9IRUFERVJfRkxBR19PVkVSTEFZU19BQ1RJVkUpOworfQorCitib29sIFNldE92ZXJsYXlzQWN0aXZlRmxhZyhib29sIGZsYWcpIHsKKyAgICAvLyBNYXJrIG92ZXJsYXlzIGFzIGFjdGl2ZSBpbiB0aGUgcGFydGl0aW9uIHRhYmxlLCB0byBkZXRlY3QgcmUtZmxhc2guCisgICAgYXV0byBzbG90X251bWJlciA9IGZzX21ncl9vdmVybGF5ZnNfc2xvdF9udW1iZXIoKTsKKyAgICBjb25zdCBhdXRvIHN1cGVyX2RldmljZSA9IGtQaHlzaWNhbERldmljZSArIGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoKTsKKyAgICBhdXRvIGJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKKyAgICBpZiAoIWJ1aWxkZXIpIHsKKyAgICAgICAgTEVSUk9SIDw8ICJvcGVuICIgPDwgc3VwZXJfZGV2aWNlIDw8ICIgbWV0YWRhdGEiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJ1aWxkZXItPlNldE92ZXJsYXlzQWN0aXZlRmxhZyhmbGFnKTsKKyAgICBhdXRvIG1ldGFkYXRhID0gYnVpbGRlci0+RXhwb3J0KCk7CisgICAgaWYgKCFtZXRhZGF0YSB8fCAhVXBkYXRlUGFydGl0aW9uVGFibGUoc3VwZXJfZGV2aWNlLCAqbWV0YWRhdGEuZ2V0KCksIHNsb3RfbnVtYmVyKSkgeworICAgICAgICBMRVJST1IgPDwgInVwZGF0ZSBzdXBlciBtZXRhZGF0YSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK092ZXJsYXlmc1RlYXJkb3duUmVzdWx0IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fc2NyYXRjaChjb25zdCBzdGQ6OnN0cmluZyYgb3ZlcmxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBjaGFuZ2UpIHsKKyAgICAvLyB1bW91bnQgYW5kIGRlbGV0ZSBrU2NyYXRjaE1vdW50UG9pbnQgc3RvcmFnZSBpZiB3ZSBoYXZlIGxvZ2ljYWwgcGFydGl0aW9ucworICAgIGlmIChvdmVybGF5ICE9IGtTY3JhdGNoTW91bnRQb2ludCkgeworICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOworICAgIH0KKworICAgIC8vIFZhbGlkYXRpb24gY2hlY2suCisgICAgaWYgKGZzX21ncl9pc19kc3VfcnVubmluZygpKSB7CisgICAgICAgIExFUlJPUiA8PCAiRGVzdHJveWluZyBEU1Ugc2NyYXRjaCBpcyBub3QgYWxsb3dlZC4iOworICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOworICAgIH0KKworICAgIC8vIE5vdGU6IHdlIGRvbid0IGNhcmUgaWYgU2V0T3ZlcmxheXNBY3RpdmVGbGFnIGZhaWxzLCBzaW5jZQorICAgIC8vIHRoZSBvdmVybGF5cyBhcmUgcmVtb3ZlZCBubyBtYXR0ZXIgd2hhdC4KKyAgICBTZXRPdmVybGF5c0FjdGl2ZUZsYWcoZmFsc2UpOworCisgICAgYm9vbCB3YXNfbW91bnRlZCA9IGZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGtTY3JhdGNoTW91bnRQb2ludCwgZmFsc2UpOworICAgIGlmICh3YXNfbW91bnRlZCkgeworICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7CisgICAgfQorCisgICAgY29uc3QgYXV0byBwYXJ0aXRpb25fbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtTY3JhdGNoTW91bnRQb2ludCk7CisKKyAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOworICAgIGlmIChpbWFnZXMgJiYgaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgc3VwZXIgcGFydGl0aW9uLCBpZiB3ZSBrbmV3IHdlIGhhZCBhIHNjcmF0Y2ggZGV2aWNlCisgICAgICAgIC8vIGluIC9kYXRhLgorICAgICAgICByZXR1cm4gVGVhcmRvd25EYXRhU2NyYXRjaChpbWFnZXMuZ2V0KCksIHBhcnRpdGlvbl9uYW1lLCB3YXNfbW91bnRlZCk7CisgICAgfQorCisgICAgYXV0byBzbG90X251bWJlciA9IGZzX21ncl9vdmVybGF5ZnNfc2xvdF9udW1iZXIoKTsKKyAgICBjb25zdCBhdXRvIHN1cGVyX2RldmljZSA9IGtQaHlzaWNhbERldmljZSArIGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoKTsKKyAgICBpZiAoYWNjZXNzKHN1cGVyX2RldmljZS5jX3N0cigpLCBSX09LIHwgV19PSykpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKKyAgICB9CisKKyAgICBhdXRvIGJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKKyAgICBpZiAoIWJ1aWxkZXIpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKKyAgICB9CisgICAgaWYgKGJ1aWxkZXItPkZpbmRQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKKyAgICB9CisgICAgYnVpbGRlci0+UmVtb3ZlUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKTsKKyAgICBhdXRvIG1ldGFkYXRhID0gYnVpbGRlci0+RXhwb3J0KCk7CisgICAgaWYgKG1ldGFkYXRhICYmIFVwZGF0ZVBhcnRpdGlvblRhYmxlKHN1cGVyX2RldmljZSwgKm1ldGFkYXRhLmdldCgpLCBzbG90X251bWJlcikpIHsKKyAgICAgICAgaWYgKGNoYW5nZSkgKmNoYW5nZSA9IHRydWU7CisgICAgICAgIGlmICghRGVzdHJveUxvZ2ljYWxQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTEVSUk9SIDw8ICJkZWxldGUgcGFydGl0aW9uICIgPDwgb3ZlcmxheTsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpFcnJvcjsKKyAgICB9CisKKyAgICBpZiAod2FzX21vdW50ZWQpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpCdXN5OworICAgIH0KKyAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOworfQorCitib29sIGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fb25lKGNvbnN0IHN0ZDo6c3RyaW5nJiBvdmVybGF5LCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGNoYW5nZSwgYm9vbCogc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCA9IG51bGxwdHIpIHsKKyAgICBjb25zdCBhdXRvIHRvcCA9IG92ZXJsYXkgKyAiLyIgKyBrT3ZlcmxheVRvcERpcjsKKworICAgIGlmIChhY2Nlc3ModG9wLmNfc3RyKCksIEZfT0spKSB7CisgICAgICAgIGlmIChzaG91bGRfZGVzdHJveV9zY3JhdGNoKSAqc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGF1dG8gY2xlYW51cF9hbGwgPSBtb3VudF9wb2ludC5lbXB0eSgpOworICAgIGNvbnN0IGF1dG8gYmFzZSA9IEdldEVuY29kZWRCYXNlRGlyRm9yTW91bnRQb2ludChtb3VudF9wb2ludCk7CisgICAgY29uc3QgYXV0byBvbGRwYXRoID0gdG9wICsgKGNsZWFudXBfYWxsID8gIiIgOiAoIi8iICsgYmFzZSkpOworICAgIGNvbnN0IGF1dG8gbmV3cGF0aCA9IGNsZWFudXBfYWxsID8gb3ZlcmxheSArICIvLiIgKyBrT3ZlcmxheVRvcERpciArICIudGVhcmRvd24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0b3AgKyAiLy4iICsgYmFzZSArICIudGVhcmRvd24iOworICAgIGF1dG8gcmV0ID0gZnNfbWdyX3JtX2FsbChuZXdwYXRoKTsKKyAgICBpZiAoIXJlbmFtZShvbGRwYXRoLmNfc3RyKCksIG5ld3BhdGguY19zdHIoKSkpIHsKKyAgICAgICAgaWYgKGNoYW5nZSkgKmNoYW5nZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChlcnJubyAhPSBFTk9FTlQpIHsKKyAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIFBFUlJPUiA8PCAibXYgIiA8PCBvbGRwYXRoIDw8ICIgIiA8PCBuZXdwYXRoOworICAgIH0KKyAgICByZXQgJj0gZnNfbWdyX3JtX2FsbChuZXdwYXRoLCBjaGFuZ2UpOworICAgIGlmICghcm1kaXIobmV3cGF0aC5jX3N0cigpKSkgeworICAgICAgICBpZiAoY2hhbmdlKSAqY2hhbmdlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGVycm5vICE9IEVOT0VOVCkgeworICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgUEVSUk9SIDw8ICJybWRpciAiIDw8IG5ld3BhdGg7CisgICAgfQorICAgIGlmICghY2xlYW51cF9hbGwpIHsKKyAgICAgICAgaWYgKCFybWRpcih0b3AuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UpICpjaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgY2xlYW51cF9hbGwgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGVycm5vID09IEVOT1RFTVBUWSkgeworICAgICAgICAgICAgY2xlYW51cF9hbGwgPSB0cnVlOworICAgICAgICAgICAgLy8gY2xlYW51cCBhbGwgaWYgdGhlIGNvbnRlbnQgaXMgYWxsIGhpZGRlbiAobGVhZGluZyAuKQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgZGVjbHR5cGUoJmNsb3NlZGlyKT4gZGlyKG9wZW5kaXIodG9wLmNfc3RyKCkpLCBjbG9zZWRpcik7CisgICAgICAgICAgICBpZiAoIWRpcikgeworICAgICAgICAgICAgICAgIFBFUlJPUiA8PCAib3BlbmRpciAiIDw8IHRvcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlyZW50KiBlbnRyeTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIuZ2V0KCkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnktPmRfbmFtZVswXSAhPSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfYWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgICAgIGNsZWFudXBfYWxsID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgUEVSUk9SIDw8ICJybWRpciAiIDw8IHRvcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCkgKnNob3VsZF9kZXN0cm95X3NjcmF0Y2ggPSBjbGVhbnVwX2FsbDsKKyAgICByZXR1cm4gcmV0OworfQorCisvLyBOb3RlOiBUaGUgc2NyYXRjaCBwYXJ0aXRpb24gb2YgRFNVIGlzIG1hbmFnZWQgYnkgZ3NpZCwgYW5kIHNob3VsZCBiZSBpbml0aWFsaXplZCBkdXJpbmcKKy8vIGZpcnN0LXN0YWdlLW1vdW50LiBKdXN0IGNoZWNrIGlmIHRoZSBETSBkZXZpY2UgZm9yIERTVSBzY3JhdGNoIHBhcnRpdGlvbiBpcyBjcmVhdGVkIG9yIG5vdC4KK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXREc3VTY3JhdGNoRGV2aWNlKCkgeworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKKyAgICBpZiAoZG0uR2V0U3RhdGUoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJgorICAgICAgICBkbS5HZXREbURldmljZVBhdGhCeU5hbWUoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCwgJmRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitib29sIE1ha2VTY3JhdGNoRmlsZXN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyYgc2NyYXRjaF9kZXZpY2UpIHsKKyAgICAvLyBGb3JjZSBta2ZzIGJ5IGRlc2lnbiBmb3Igb3ZlcmxheSBzdXBwb3J0IG9mIGFkYiByZW1vdW50LCBzaW1wbGlmeSBhbmQKKyAgICAvLyB0aHVzIGRvIG5vdCByZWx5IG9uIGZzY2sgdG8gY29ycmVjdCBwcm9ibGVtcyB0aGF0IGNvdWxkIGNyZWVwIGluLgorICAgIGF1dG8gZnNfdHlwZSA9ICIiczsKKyAgICBhdXRvIGNvbW1hbmQgPSAiInM7CisgICAgaWYgKCFhY2Nlc3Moa01rRjJmcywgWF9PSykgJiYgZnNfbWdyX2ZpbGVzeXN0ZW1fYXZhaWxhYmxlKCJmMmZzIikpIHsKKyAgICAgICAgZnNfdHlwZSA9ICJmMmZzIjsKKyAgICAgICAgY29tbWFuZCA9IGtNa0YyZnMgKyAiIC13ICJzOworICAgICAgICBjb21tYW5kICs9IHN0ZDo6dG9fc3RyaW5nKGdldHBhZ2VzaXplKCkpOworICAgICAgICBjb21tYW5kID0ga01rRjJmcyArICIgLWIgInM7CisgICAgICAgIGNvbW1hbmQgKz0gc3RkOjp0b19zdHJpbmcoZ2V0cGFnZXNpemUoKSk7CisgICAgICAgIGNvbW1hbmQgKz0gIiAtZiAtZDEgLWwiICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKKyAgICB9IGVsc2UgaWYgKCFhY2Nlc3Moa01rRXh0NCwgWF9PSykgJiYgZnNfbWdyX2ZpbGVzeXN0ZW1fYXZhaWxhYmxlKCJleHQ0IikpIHsKKyAgICAgICAgZnNfdHlwZSA9ICJleHQ0IjsKKyAgICAgICAgY29tbWFuZCA9IGtNa0V4dDQgKyAiIC1GIC1iIDQwOTYgLXQgZXh0NCAtbSAwIC1PIGhhc19qb3VybmFsIC1NICJzICsga1NjcmF0Y2hNb3VudFBvaW50OworICAgIH0gZWxzZSB7CisgICAgICAgIExFUlJPUiA8PCAiTm8gc3VwcG9ydGVkIG1rZnMgY29tbWFuZCBvciBmaWxlc3lzdGVtIGRyaXZlciBhdmFpbGFibGUsIHN1cHBvcnRlZCBmaWxlc3lzdGVtcyAiCisgICAgICAgICAgICAgICAgICAiYXJlOiBmMmZzLCBleHQ0IjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb21tYW5kICs9ICIgIiArIHNjcmF0Y2hfZGV2aWNlICsgIiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDwvZGV2L251bGwiOworICAgIGZzX21ncl9zZXRfYmxrX3JvKHNjcmF0Y2hfZGV2aWNlLCBmYWxzZSk7CisgICAgYXV0byByZXQgPSBzeXN0ZW0oY29tbWFuZC5jX3N0cigpKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIExFUlJPUiA8PCAibWFrZSAiIDw8IGZzX3R5cGUgPDwgIiBmaWxlc3lzdGVtIG9uICIgPDwgc2NyYXRjaF9kZXZpY2UgPDwgIiByZXR1cm49IiA8PCByZXQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIFRydW5jYXRlUGFydGl0aW9uc1dpdGhTdWZmaXgoTWV0YWRhdGFCdWlsZGVyKiBidWlsZGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KSB7CisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisKKyAgICAvLyBSZW1vdmUgPG90aGVyPiBwYXJ0aXRpb25zCisgICAgZm9yIChjb25zdCBhdXRvJiBncm91cCA6IGJ1aWxkZXItPkxpc3RHcm91cHMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcnQgOiBidWlsZGVyLT5MaXN0UGFydGl0aW9uc0luR3JvdXAoZ3JvdXApKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiBuYW1lID0gcGFydC0+bmFtZSgpOworICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChuYW1lLCBzdWZmaXgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG0uR2V0U3RhdGUobmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJiAhRGVzdHJveUxvZ2ljYWxQYXJ0aXRpb24obmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXItPlJlc2l6ZVBhcnRpdGlvbihidWlsZGVyLT5GaW5kUGFydGl0aW9uKG5hbWUpLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gQ3JlYXRlIG9yIHVwZGF0ZSBhIHNjcmF0Y2ggcGFydGl0aW9uIHdpdGhpbiBzdXBlci4KK3N0YXRpYyBib29sIENyZWF0ZUR5bmFtaWNTY3JhdGNoKHN0ZDo6c3RyaW5nKiBzY3JhdGNoX2RldmljZSwgYm9vbCogcGFydGl0aW9uX2V4aXN0cykgeworICAgIGNvbnN0IGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrU2NyYXRjaE1vdW50UG9pbnQpOworCisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisgICAgKnBhcnRpdGlvbl9leGlzdHMgPSBkbS5HZXRTdGF0ZShwYXJ0aXRpb25fbmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRDsKKworICAgIGF1dG8gcGFydGl0aW9uX2NyZWF0ZSA9ICEqcGFydGl0aW9uX2V4aXN0czsKKyAgICBhdXRvIHNsb3RfbnVtYmVyID0gZnNfbWdyX292ZXJsYXlmc19zbG90X251bWJlcigpOworICAgIGNvbnN0IGF1dG8gc3VwZXJfZGV2aWNlID0ga1BoeXNpY2FsRGV2aWNlICsgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZSgpOworICAgIGF1dG8gYnVpbGRlciA9IE1ldGFkYXRhQnVpbGRlcjo6TmV3KHN1cGVyX2RldmljZSwgc2xvdF9udW1iZXIpOworICAgIGlmICghYnVpbGRlcikgeworICAgICAgICBMRVJST1IgPDwgIm9wZW4gIiA8PCBzdXBlcl9kZXZpY2UgPDwgIiBtZXRhZGF0YSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBwYXJ0aXRpb24gPSBidWlsZGVyLT5GaW5kUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKTsKKyAgICAqcGFydGl0aW9uX2V4aXN0cyA9IHBhcnRpdGlvbiAhPSBudWxscHRyOworICAgIGF1dG8gY2hhbmdlZCA9IGZhbHNlOworICAgIGlmICghKnBhcnRpdGlvbl9leGlzdHMpIHsKKyAgICAgICAgcGFydGl0aW9uID0gYnVpbGRlci0+QWRkUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lLCBMUF9QQVJUSVRJT05fQVRUUl9OT05FKTsKKyAgICAgICAgaWYgKCFwYXJ0aXRpb24pIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiY3JlYXRlICIgPDwgcGFydGl0aW9uX25hbWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgfQorICAgIC8vIFRha2UgaGFsZiBvZiBmcmVlIHNwYWNlLCBtaW5pbXVtIDUxMk1CIG9yIG1heGltdW0gZnJlZSAtIG1hcmdpbi4KKyAgICBzdGF0aWMgY29uc3RleHByIGF1dG8ga01pbmltdW1TaXplID0gdWludDY0X3QoNTEyICogMTAyNCAqIDEwMjQpOworICAgIGlmIChwYXJ0aXRpb24tPnNpemUoKSA8IGtNaW5pbXVtU2l6ZSkgeworICAgICAgICBhdXRvIHBhcnRpdGlvbl9zaXplID0KKyAgICAgICAgICAgICAgICBidWlsZGVyLT5BbGxvY2F0YWJsZVNwYWNlKCkgLSBidWlsZGVyLT5Vc2VkU3BhY2UoKSArIHBhcnRpdGlvbi0+c2l6ZSgpOworICAgICAgICBpZiAoKHBhcnRpdGlvbl9zaXplID4ga01pbmltdW1TaXplKSB8fCAhcGFydGl0aW9uLT5zaXplKCkpIHsKKyAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplID0gc3RkOjptYXgoc3RkOjptaW4oa01pbmltdW1TaXplLCBwYXJ0aXRpb25fc2l6ZSksIHBhcnRpdGlvbl9zaXplIC8gMik7CisgICAgICAgICAgICBpZiAocGFydGl0aW9uX3NpemUgPiBwYXJ0aXRpb24tPnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlmICghYnVpbGRlci0+UmVzaXplUGFydGl0aW9uKHBhcnRpdGlvbiwgcGFydGl0aW9uX3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBmcmVlIHVwIHNwYWNlIGJ5IGRlYWxsb2NhdGluZyBwYXJ0aXRpb25zIGluIHRoZSBvdGhlciBzbG90LgorICAgICAgICAgICAgICAgICAgICBUcnVuY2F0ZVBhcnRpdGlvbnNXaXRoU3VmZml4KGJ1aWxkZXIuZ2V0KCksIGZzX21ncl9nZXRfb3RoZXJfc2xvdF9zdWZmaXgoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXItPkFsbG9jYXRhYmxlU3BhY2UoKSAtIGJ1aWxkZXItPlVzZWRTcGFjZSgpICsgcGFydGl0aW9uLT5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChzdGQ6Om1pbihrTWluaW11bVNpemUsIHBhcnRpdGlvbl9zaXplKSwgcGFydGl0aW9uX3NpemUgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWlsZGVyLT5SZXNpemVQYXJ0aXRpb24ocGFydGl0aW9uLCBwYXJ0aXRpb25fc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExFUlJPUiA8PCAicmVzaXplICIgPDwgcGFydGl0aW9uX25hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFwYXJ0aXRpb25fY3JlYXRlKSBEZXN0cm95TG9naWNhbFBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSk7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgKnBhcnRpdGlvbl9leGlzdHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGxhbmQgdGhlIHVwZGF0ZSBiYWNrIG9uIHRvIHRoZSBwYXJ0aXRpb24KKyAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICBhdXRvIG1ldGFkYXRhID0gYnVpbGRlci0+RXhwb3J0KCk7CisgICAgICAgIGlmICghbWV0YWRhdGEgfHwgIVVwZGF0ZVBhcnRpdGlvblRhYmxlKHN1cGVyX2RldmljZSwgKm1ldGFkYXRhLmdldCgpLCBzbG90X251bWJlcikpIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiYWRkIHBhcnRpdGlvbiAiIDw8IHBhcnRpdGlvbl9uYW1lOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNoYW5nZWQgfHwgcGFydGl0aW9uX2NyZWF0ZSkgeworICAgICAgICBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgICAgICAgICAgICAuYmxvY2tfZGV2aWNlID0gc3VwZXJfZGV2aWNlLAorICAgICAgICAgICAgICAgIC5tZXRhZGF0YV9zbG90ID0gc2xvdF9udW1iZXIsCisgICAgICAgICAgICAgICAgLnBhcnRpdGlvbl9uYW1lID0gcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgLmZvcmNlX3dyaXRhYmxlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAudGltZW91dF9tcyA9IDEwcywKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCFDcmVhdGVMb2dpY2FsUGFydGl0aW9uKHBhcmFtcywgc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNjcmF0Y2hfZGV2aWNlLT5lbXB0eSgpKSB7CisgICAgICAgICpzY3JhdGNoX2RldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IEdldElkZWFsRGF0YVNjcmF0Y2hTaXplKCkgeworICAgIEJsb2NrRGV2aWNlSW5mbyBzdXBlcl9pbmZvOworICAgIFBhcnRpdGlvbk9wZW5lciBvcGVuZXI7CisgICAgaWYgKCFvcGVuZXIuR2V0SW5mbyhmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKCksICZzdXBlcl9pbmZvKSkgeworICAgICAgICBMRVJST1IgPDwgImNvdWxkIG5vdCBnZXQgYmxvY2sgZGV2aWNlIGluZm8gZm9yIHN1cGVyIjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RydWN0IHN0YXR2ZnMgczsKKyAgICBpZiAoc3RhdHZmcygiL2RhdGEiLCAmcykgPCAwKSB7CisgICAgICAgIFBFUlJPUiA8PCAiY291bGQgbm90IHN0YXRmcyAvZGF0YSI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF1dG8gaWRlYWxfc2l6ZSA9IHN0ZDo6bWluKHN1cGVyX2luZm8uc2l6ZSwgdWludDY0X3QodWludDY0X3Qocy5mX2Zyc2l6ZSkgKiBzLmZfYmZyZWUgKiAwLjg1KSk7CisKKyAgICAvLyBBbGlnbiB1cCB0byB0aGUgZmlsZXN5c3RlbSBibG9jayBzaXplLgorICAgIGlmIChhdXRvIHJlbWFpbmRlciA9IGlkZWFsX3NpemUgJSBzLmZfYnNpemU7IHJlbWFpbmRlciA+IDApIHsKKyAgICAgICAgaWRlYWxfc2l6ZSArPSBzLmZfYnNpemUgLSByZW1haW5kZXI7CisgICAgfQorICAgIHJldHVybiBpZGVhbF9zaXplOworfQorCitzdGF0aWMgYm9vbCBDcmVhdGVTY3JhdGNoT25EYXRhKHN0ZDo6c3RyaW5nKiBzY3JhdGNoX2RldmljZSwgYm9vbCogcGFydGl0aW9uX2V4aXN0cykgeworICAgICpwYXJ0aXRpb25fZXhpc3RzID0gZmFsc2U7CisKKyAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOworICAgIGlmICghaW1hZ2VzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKKyAgICBpZiAoaW1hZ2VzLT5HZXRNYXBwZWRJbWFnZURldmljZShwYXJ0aXRpb25fbmFtZSwgc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgICpwYXJ0aXRpb25fZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gTm90ZTogY2FsbGluZyBSZW1vdmVEaXNhYmxlZEltYWdlcyBoZXJlIGVuc3VyZXMgdGhhdCB3ZSBkbyBub3QgcmFjZSB3aXRoCisgICAgLy8gY2xlYW5fc2NyYXRjaF9maWxlcyBhbmQgYWNjaWRlbnRhbGx5IHRyeSB0byBtYXAgYW4gaW1hZ2UgdGhhdCB3aWxsIGJlCisgICAgLy8gZGVsZXRlZC4KKyAgICBpZiAoIWltYWdlcy0+UmVtb3ZlRGlzYWJsZWRJbWFnZXMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIGF1dG8gc2l6ZSA9IGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1aW50NjRfdD4oa0RhdGFTY3JhdGNoU2l6ZU1iUHJvcCwgMCkgKiAxX01pQjsKKyAgICAgICAgaWYgKCFzaXplKSB7CisgICAgICAgICAgICBzaXplID0gR2V0SWRlYWxEYXRhU2NyYXRjaFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNpemUpIHsKKyAgICAgICAgICAgIHNpemUgPSAyX0dpQjsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gZmxhZ3MgPSBJSW1hZ2VNYW5hZ2VyOjpDUkVBVEVfSU1BR0VfREVGQVVMVDsKKworICAgICAgICBpZiAoIWltYWdlcy0+Q3JlYXRlQmFja2luZ0ltYWdlKHBhcnRpdGlvbl9uYW1lLCBzaXplLCBmbGFncykpIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IGNyZWF0ZSBzY3JhdGNoIGltYWdlIG9mICIgPDwgc2l6ZSA8PCAiIGJ5dGVzIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWltYWdlcy0+TWFwSW1hZ2VEZXZpY2UocGFydGl0aW9uX25hbWUsIDEwcywgc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IG1hcCBzY3JhdGNoIGltYWdlIjsKKyAgICAgICAgLy8gSWYgd2UgY2Fubm90IHVzZSB0aGlzIGltYWdlLCB0aGVuIHJlbW92ZSBpdC4KKyAgICAgICAgVGVhcmRvd25EYXRhU2NyYXRjaChpbWFnZXMuZ2V0KCksIHBhcnRpdGlvbl9uYW1lLCBmYWxzZSAvKiB3YXNfbW91bnRlZCAqLyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIENhblVzZVN1cGVyUGFydGl0aW9uKGNvbnN0IEZzdGFiJiBmc3RhYikgeworICAgIGF1dG8gc2xvdF9udW1iZXIgPSBmc19tZ3Jfb3ZlcmxheWZzX3Nsb3RfbnVtYmVyKCk7CisgICAgY29uc3QgYXV0byBzdXBlcl9kZXZpY2UgPSBrUGh5c2ljYWxEZXZpY2UgKyBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKCk7CisgICAgaWYgKGFjY2VzcyhzdXBlcl9kZXZpY2UuY19zdHIoKSwgUl9PSyB8IFdfT0spIHx8ICFmc19tZ3Jfb3ZlcmxheWZzX2hhc19sb2dpY2FsKGZzdGFiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gbWV0YWRhdGEgPSBSZWFkTWV0YWRhdGEoc3VwZXJfZGV2aWNlLCBzbG90X251bWJlcik7CisgICAgaWYgKCFtZXRhZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGZzX21ncl9vdmVybGF5ZnNfY3JlYXRlX3NjcmF0Y2goY29uc3QgRnN0YWImIGZzdGFiLCBzdGQ6OnN0cmluZyogc2NyYXRjaF9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcGFydGl0aW9uX2V4aXN0cykgeworICAgIC8vIFVzZSB0aGUgRFNVIHNjcmF0Y2ggZGV2aWNlIG1hbmFnZWQgYnkgZ3NpZCBpZiB3aXRoaW4gYSBEU1Ugc3lzdGVtLgorICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICAqc2NyYXRjaF9kZXZpY2UgPSBHZXREc3VTY3JhdGNoRGV2aWNlKCk7CisgICAgICAgICpwYXJ0aXRpb25fZXhpc3RzID0gIXNjcmF0Y2hfZGV2aWNlLT5lbXB0eSgpOworICAgICAgICByZXR1cm4gKnBhcnRpdGlvbl9leGlzdHM7CisgICAgfQorCisgICAgLy8gVHJ5IEltYWdlTWFuYWdlciBvbiAvZGF0YSBmaXJzdC4KKyAgICBib29sIGNhbl91c2VfZGF0YSA9IGZhbHNlOworICAgIGlmIChGaWxlc3lzdGVtSGFzUmVsaWFibGVQaW5uaW5nKCIvZGF0YSIsICZjYW5fdXNlX2RhdGEpICYmIGNhbl91c2VfZGF0YSkgeworICAgICAgICBpZiAoQ3JlYXRlU2NyYXRjaE9uRGF0YShzY3JhdGNoX2RldmljZSwgcGFydGl0aW9uX2V4aXN0cykpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNjcmF0Y2ggb24gL2RhdGEsIGZhbGxiYWNrIHRvIHVzZSBmcmVlIHNwYWNlIG9uIHN1cGVyIjsKKyAgICB9CisgICAgLy8gSWYgdGhhdCBmYWlscywgc2VlIGlmIHdlIGNhbiBsYW5kIG9uIHN1cGVyLgorICAgIGlmIChDYW5Vc2VTdXBlclBhcnRpdGlvbihmc3RhYikpIHsKKyAgICAgICAgcmV0dXJuIENyZWF0ZUR5bmFtaWNTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlLCBwYXJ0aXRpb25fZXhpc3RzKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBDcmVhdGUgYW5kIG1vdW50IGtTY3JhdGNoTW91bnRQb2ludCBzdG9yYWdlIGlmIHdlIGhhdmUgbG9naWNhbCBwYXJ0aXRpb25zCitib29sIGZzX21ncl9vdmVybGF5ZnNfc2V0dXBfc2NyYXRjaChjb25zdCBGc3RhYiYgZnN0YWIpIHsKKyAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoa1NjcmF0Y2hNb3VudFBvaW50LCBmYWxzZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2NyYXRjaF9kZXZpY2U7CisgICAgYm9vbCBwYXJ0aXRpb25fZXhpc3RzOworICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19jcmVhdGVfc2NyYXRjaChmc3RhYiwgJnNjcmF0Y2hfZGV2aWNlLCAmcGFydGl0aW9uX2V4aXN0cykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBzY3JhdGNoIHBhcnRpdGlvbiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVNldE92ZXJsYXlzQWN0aXZlRmxhZyh0cnVlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdXBkYXRlIGR5bmFtaWMgcGFydGl0aW9uIGRhdGEiOworICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX3NjcmF0Y2goa1NjcmF0Y2hNb3VudFBvaW50LCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIElmIHRoZSBwYXJ0aXRpb24gZXhpc3RzLCBhc3N1bWUgZmlyc3QgdGhhdCBpdCBjYW4gYmUgbW91bnRlZC4KKyAgICBpZiAocGFydGl0aW9uX2V4aXN0cykgeworICAgICAgICBpZiAoTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKSkgeworICAgICAgICAgICAgY29uc3QgYXV0byB0b3AgPSBrU2NyYXRjaE1vdW50UG9pbnQgKyAiLyJzICsga092ZXJsYXlUb3BEaXI7CisgICAgICAgICAgICBpZiAoYWNjZXNzKHRvcC5jX3N0cigpLCBGX09LKSA9PSAwIHx8IGZzX21ncl9maWxlc3lzdGVtX2hhc19zcGFjZShrU2NyYXRjaE1vdW50UG9pbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkZWNsYXJlIGl0IHVzZWxlc3MsIG5vIG92ZXJyaWRlcyBhbmQgbm8gZnJlZSBzcGFjZQorICAgICAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gdW5tb3VudCBzY3JhdGNoIHBhcnRpdGlvbiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFNYWtlU2NyYXRjaEZpbGVzeXN0ZW0oc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmb3JtYXQgc2NyYXRjaCBwYXJ0aXRpb24iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSk7Cit9CisKK2NvbnN0ZXhwciBib29sIE92ZXJsYXlmc1RlYXJkb3duQWxsb3dlZCgpIHsKKyAgICAvLyBOZXZlciBhbGxvdyBvbiBub24tZGVidWdnYWJsZSBidWlsZC4KKyAgICByZXR1cm4ga0FsbG93T3ZlcmxheWZzOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwKGNvbnN0IEZzdGFiJiBmc3RhYiwgY29uc3QgY2hhciogbW91bnRfcG9pbnQsIGJvb2wqIHdhbnRfcmVib290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wganVzdF9kaXNhYmxlZF92ZXJpdHkpIHsKKyAgICBpZiAoIU92ZXJsYXlmc1NldHVwQWxsb3dlZCgvKnZlcmJvc2U9Ki90cnVlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFmc19tZ3JfYm9vdF9jb21wbGV0ZWQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3Qgc2V0dXAgb3ZlcmxheWZzIGJlZm9yZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIHJlYWR5IjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8gY2FuZGlkYXRlcyA9IGZzX21ncl9vdmVybGF5ZnNfY2FuZGlkYXRlX2xpc3QoZnN0YWIpOworICAgIGZvciAoYXV0byBpdCA9IGNhbmRpZGF0ZXMuYmVnaW4oKTsgaXQgIT0gY2FuZGlkYXRlcy5lbmQoKTspIHsKKyAgICAgICAgaWYgKG1vdW50X3BvaW50ICYmCisgICAgICAgICAgICAoZnNfbWdyX21vdW50X3BvaW50KGl0LT5tb3VudF9wb2ludCkgIT0gZnNfbWdyX21vdW50X3BvaW50KG1vdW50X3BvaW50KSkpIHsKKyAgICAgICAgICAgIGl0ID0gY2FuZGlkYXRlcy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gdmVyaXR5X2VuYWJsZWQgPSAhanVzdF9kaXNhYmxlZF92ZXJpdHkgJiYgZnNfbWdyX2lzX3Zlcml0eV9lbmFibGVkKCppdCk7CisgICAgICAgIGlmICh2ZXJpdHlfZW5hYmxlZCkgeworICAgICAgICAgICAgaXQgPSBjYW5kaWRhdGVzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgaWYgKGNhbmRpZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICBpZiAobW91bnRfcG9pbnQpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG92ZXJsYXlmcyBjYW5kaWRhdGUgd2FzIGZvdW5kIGZvciAiIDw8IG1vdW50X3BvaW50OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRpcjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG92ZXJsYXlfbW91bnRfcG9pbnQgOiBPdmVybGF5TW91bnRQb2ludHMoKSkgeworICAgICAgICBpZiAob3ZlcmxheV9tb3VudF9wb2ludCA9PSBrU2NyYXRjaE1vdW50UG9pbnQpIHsKKyAgICAgICAgICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19zZXR1cF9zY3JhdGNoKGZzdGFiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChvdmVybGF5X21vdW50X3BvaW50LCBmYWxzZSAvKiBvdmVybGF5ICovKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRpciA9IG92ZXJsYXlfbW91bnRfcG9pbnQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZGlyLmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGFsbG9jYXRlIGJhY2tpbmcgc3RvcmFnZSBmb3Igb3ZlcmxheXMiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgYXV0byBvdmVybGF5ID0gZnNfbWdyX292ZXJsYXlmc19zZXR1cF9kaXIoZGlyKTsKKyAgICBpZiAob3ZlcmxheS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG9rID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogY2FuZGlkYXRlcykgeworICAgICAgICBhdXRvIGZzdGFiX21vdW50X3BvaW50ID0gZnNfbWdyX21vdW50X3BvaW50KGVudHJ5Lm1vdW50X3BvaW50KTsKKyAgICAgICAgb2sgJj0gZnNfbWdyX292ZXJsYXlmc19zZXR1cF9vbmUob3ZlcmxheSwgZnN0YWJfbW91bnRfcG9pbnQsIHdhbnRfcmVib290KTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworfQorCitzdHJ1Y3QgTWFwSW5mbyB7CisgICAgLy8gSWYgc2V0LCBwYXJ0aXRpb24gaXMgb3duZWQgYnkgSW1hZ2VNYW5hZ2VyLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxJSW1hZ2VNYW5hZ2VyPiBpbWFnZXM7CisgICAgLy8gSWYgc2V0LCBhbmQgaW1hZ2VzIGlzIG51bGwsIHRoaXMgaXMgYSBEQVAgcGFydGl0aW9uLgorICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgLy8gSWYgc2V0LCBhbmQgaW1hZ2VzIGFuZCBuYW1lIGFyZSBlbXB0eSwgdGhpcyBpcyBhIG5vbi1keW5hbWljIHBhcnRpdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBkZXZpY2U7CisKKyAgICBNYXBJbmZvKCkgPSBkZWZhdWx0OworICAgIE1hcEluZm8oTWFwSW5mbyYmKSA9IGRlZmF1bHQ7CisgICAgfk1hcEluZm8oKSB7CisgICAgICAgIGlmIChpbWFnZXMpIHsKKyAgICAgICAgICAgIGltYWdlcy0+VW5tYXBJbWFnZURldmljZShuYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICghbmFtZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBEZXN0cm95TG9naWNhbFBhcnRpdGlvbihuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gbmV2ZXIgcmV0dXJucyB0aGUgRFNVIHNjcmF0Y2ggZGV2aWNlIGluIHJlY292ZXJ5IG9yIGZhc3Rib290ZCwKKy8vIGJlY2F1c2UgdGhlIERTVSBzY3JhdGNoIGlzIGNyZWF0ZWQgaW4gdGhlIGZpcnN0LXN0YWdlLW1vdW50LCB3aGljaCBpcyBub3QgcnVuIGluIHJlY292ZXJ5Lgorc3RhdGljIHN0ZDo6b3B0aW9uYWw8TWFwSW5mbz4gRW5zdXJlU2NyYXRjaE1hcHBlZCgpIHsKKyAgICBNYXBJbmZvIGluZm87CisgICAgaW5mby5kZXZpY2UgPSBHZXRCb290U2NyYXRjaERldmljZSgpOworICAgIGlmICghaW5mby5kZXZpY2UuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4ge3N0ZDo6bW92ZShpbmZvKX07CisgICAgfQorICAgIGlmICghSW5SZWNvdmVyeSgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKKworICAgIC8vIENoZWNrIGZvciBzY3JhdGNoIG9uIC9kYXRhIGZpcnN0LCBiZWZvcmUgbG9va2luZyBmb3IgYSBtb2RpZmllZCBzdXBlcgorICAgIC8vIHBhcnRpdGlvbi4gV2Ugc2hvdWxkIG9ubHkgcmVhY2ggdGhpcyBjb2RlIGluIHJlY292ZXJ5LCBiZWNhdXNlIHNjcmF0Y2gKKyAgICAvLyB3b3VsZCBvdGhlcndpc2UgYWx3YXlzIGJlIG1hcHBlZC4KKyAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOworICAgIGlmIChpbWFnZXMgJiYgaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIGlmIChpbWFnZXMtPklzSW1hZ2VEaXNhYmxlZChwYXJ0aXRpb25fbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWltYWdlcy0+TWFwSW1hZ2VEZXZpY2UocGFydGl0aW9uX25hbWUsIDEwcywgJmluZm8uZGV2aWNlKSkgeworICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgICAgIGluZm8ubmFtZSA9IHBhcnRpdGlvbl9uYW1lOworICAgICAgICBpbmZvLmltYWdlcyA9IHN0ZDo6bW92ZShpbWFnZXMpOworICAgICAgICByZXR1cm4ge3N0ZDo6bW92ZShpbmZvKX07CisgICAgfQorCisgICAgLy8gQXZvaWQgdWFydCBzcGFtIGJ5IGZpcnN0IGNoZWNraW5nIGZvciBhIHNjcmF0Y2ggcGFydGl0aW9uLgorICAgIGNvbnN0IGF1dG8gc3VwZXJfZGV2aWNlID0ga1BoeXNpY2FsRGV2aWNlICsgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZSgpOworICAgIGF1dG8gbWV0YWRhdGEgPSBSZWFkQ3VycmVudE1ldGFkYXRhKHN1cGVyX2RldmljZSk7CisgICAgaWYgKCFtZXRhZGF0YSkgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgYXV0byBwYXJ0aXRpb24gPSBGaW5kUGFydGl0aW9uKCptZXRhZGF0YS5nZXQoKSwgcGFydGl0aW9uX25hbWUpOworICAgIGlmICghcGFydGl0aW9uKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgICAgICAgIC5ibG9ja19kZXZpY2UgPSBzdXBlcl9kZXZpY2UsCisgICAgICAgICAgICAubWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoKSwKKyAgICAgICAgICAgIC5wYXJ0aXRpb24gPSBwYXJ0aXRpb24sCisgICAgICAgICAgICAuZm9yY2Vfd3JpdGFibGUgPSB0cnVlLAorICAgICAgICAgICAgLnRpbWVvdXRfbXMgPSAxMHMsCisgICAgfTsKKyAgICBpZiAoIUNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb24ocGFyYW1zLCAmaW5mby5kZXZpY2UpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgaW5mby5uYW1lID0gcGFydGl0aW9uX25hbWU7CisgICAgcmV0dXJuIHtzdGQ6Om1vdmUoaW5mbyl9OworfQorCisvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpbiByZWNvdmVyeSwgd2hlcmUgRFNVIHNjcmF0Y2ggaXMgbm90CisvLyBhdXRvbWF0aWNhbGx5IG1hcHBlZC4KK3N0YXRpYyBib29sIE1hcERzdVNjcmF0Y2hEZXZpY2Uoc3RkOjpzdHJpbmcqIGRldmljZSkgeworICAgIHN0ZDo6c3RyaW5nIGRzdV9zbG90OworICAgIGlmICghYW5kcm9pZDo6Z3NpOjpJc0dzaUluc3RhbGxlZCgpIHx8ICFhbmRyb2lkOjpnc2k6OkdldEFjdGl2ZURzdSgmZHN1X3Nsb3QpIHx8CisgICAgICAgIGRzdV9zbG90LmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbyBpZiBubyBEU1UgaW5zdGFsbGF0aW9uIHByZXNlbnQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oImRzdS8iICsgZHN1X3Nsb3QsIDEwcyk7CisgICAgaWYgKCFpbWFnZXMgfHwgIWltYWdlcy0+QmFja2luZ0ltYWdlRXhpc3RzKGFuZHJvaWQ6OmdzaTo6a0RzdVNjcmF0Y2gpKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgRFNVIHNjcmF0Y2ggZGV2aWNlIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbWFnZXMtPlVubWFwSW1hZ2VEZXZpY2UoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCk7CisgICAgaWYgKCFpbWFnZXMtPk1hcEltYWdlRGV2aWNlKGFuZHJvaWQ6OmdzaTo6a0RzdVNjcmF0Y2gsIDEwcywgZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQgVGVhcmRvd25Nb3VudHNBbmRTY3JhdGNoKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB3YW50X3JlYm9vdCkgeworICAgIGJvb2wgc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCA9IGZhbHNlOworICAgIGF1dG8gcnYgPSBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6T2s7CisgICAgZm9yIChjb25zdCBhdXRvJiBvdmVybGF5X21vdW50X3BvaW50IDogT3ZlcmxheU1vdW50UG9pbnRzKCkpIHsKKyAgICAgICAgYXV0byBvayA9IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fb25lKAorICAgICAgICAgICAgICAgIG92ZXJsYXlfbW91bnRfcG9pbnQsIG1vdW50X3BvaW50ID8gZnNfbWdyX21vdW50X3BvaW50KG1vdW50X3BvaW50KSA6ICIiLAorICAgICAgICAgICAgICAgIHdhbnRfcmVib290LAorICAgICAgICAgICAgICAgIG92ZXJsYXlfbW91bnRfcG9pbnQgPT0ga1NjcmF0Y2hNb3VudFBvaW50ID8gJnNob3VsZF9kZXN0cm95X3NjcmF0Y2ggOiBudWxscHRyKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgcnYgPSBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6RXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEbyBub3QgYXR0ZW1wdCB0byBkZXN0cm95IERTVSBzY3JhdGNoIGlmIHdpdGhpbiBhIERTVSBzeXN0ZW0sCisgICAgLy8gYmVjYXVzZSBEU1Ugc2NyYXRjaCBwYXJ0aXRpb24gaXMgbWFuYWdlZCBieSBnc2lkLgorICAgIGlmIChzaG91bGRfZGVzdHJveV9zY3JhdGNoICYmICFmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICBhdXRvIHJ2ID0gZnNfbWdyX292ZXJsYXlmc190ZWFyZG93bl9zY3JhdGNoKGtTY3JhdGNoTW91bnRQb2ludCwgd2FudF9yZWJvb3QpOworICAgICAgICBpZiAocnYgIT0gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rKSB7CisgICAgICAgICAgICByZXR1cm4gcnY7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQW5kIG5vdyB0aGF0IHdlIGRpZCB3aGF0IHdlIGNvdWxkLCBsZXRzIGluZm9ybQorICAgIC8vIGNhbGxlciB0aGF0IHRoZXJlIG1heSBzdGlsbCBiZSBtb3JlIHRvIGRvLgorICAgIGlmICghZnNfbWdyX2Jvb3RfY29tcGxldGVkKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHRlYXJkb3duIG92ZXJsYXlmcyBiZWZvcmUgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSByZWFkeSI7CisgICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6RXJyb3I7CisgICAgfQorICAgIHJldHVybiBydjsKK30KKworLy8gUmV0dXJucyBmYWxzZSBpZiB0ZWFyZG93biBub3QgcGVybWl0dGVkLiBJZiBzb21ldGhpbmcgaXMgYWx0ZXJlZCwgc2V0ICp3YW50X3JlYm9vdC4KK092ZXJsYXlmc1RlYXJkb3duUmVzdWx0IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd24oY29uc3QgY2hhciogbW91bnRfcG9pbnQsIGJvb2wqIHdhbnRfcmVib290KSB7CisgICAgaWYgKCFPdmVybGF5ZnNUZWFyZG93bkFsbG93ZWQoKSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIHRlYXJkb3duLgorICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOworICAgIH0KKyAgICAvLyBJZiBzY3JhdGNoIGV4aXN0cywgYnV0IGlzIG5vdCBtb3VudGVkLCBsZXRzIGdhaW4gYWNjZXNzIHRvIGNsZWFuCisgICAgLy8gc3BlY2lmaWMgb3ZlcnJpZGUgZW50cmllcy4KKyAgICBhdXRvIG1vdW50X3NjcmF0Y2ggPSBmYWxzZTsKKyAgICBpZiAoKG1vdW50X3BvaW50ICE9IG51bGxwdHIpICYmICFmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChrU2NyYXRjaE1vdW50UG9pbnQsIGZhbHNlKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzY3JhdGNoX2RldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7CisgICAgICAgIGlmICghc2NyYXRjaF9kZXZpY2UuZW1wdHkoKSkgeworICAgICAgICAgICAgbW91bnRfc2NyYXRjaCA9IE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHJ2ID0gVGVhcmRvd25Nb3VudHNBbmRTY3JhdGNoKG1vdW50X3BvaW50LCB3YW50X3JlYm9vdCk7CisKKyAgICBpZiAobW91bnRfc2NyYXRjaCkgeworICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKSkgeworICAgICAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpCdXN5OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK3ZvaWQgTWFwU2NyYXRjaFBhcnRpdGlvbklmTmVlZGVkKEZzdGFiKiBmc3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mKT4mIGluaXQpIHsKKyAgICBpZiAoIU92ZXJsYXlmc1NldHVwQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKEdldEVudHJ5Rm9yTW91bnRQb2ludChmc3RhYiwga1NjcmF0Y2hNb3VudFBvaW50KSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUdldE92ZXJsYXlzQWN0aXZlRmxhZygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKFNjcmF0Y2hJc09uRGF0YSgpKSB7CisgICAgICAgIGlmIChhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAwbXMpKSB7CisgICAgICAgICAgICBpbWFnZXMtPk1hcEFsbEltYWdlcyhpbml0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBoeXNpY2FsIG9yIGxvZ2ljYWwgcGFydGl0aW9ucyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIG1hcHBlZCBoZXJlLAorICAgIC8vIHNvIGp1c3QgZW5zdXJlIC9kZXYvYmxvY2sgc3ltbGlua3MgZXhpc3QuCisgICAgYXV0byBkZXZpY2UgPSBHZXRCb290U2NyYXRjaERldmljZSgpOworICAgIGlmICghZGV2aWNlLmVtcHR5KCkpIHsKKyAgICAgICAgaW5pdCh7YW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoZGV2aWNlKX0pOworICAgIH0KK30KKwordm9pZCBDbGVhbnVwT2xkU2NyYXRjaEZpbGVzKCkgeworICAgIGlmICghT3ZlcmxheWZzVGVhcmRvd25BbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIVNjcmF0Y2hJc09uRGF0YSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGF1dG8gaW1hZ2VzID0gSUltYWdlTWFuYWdlcjo6T3BlbigicmVtb3VudCIsIDBtcykpIHsKKyAgICAgICAgaW1hZ2VzLT5SZW1vdmVEaXNhYmxlZEltYWdlcygpOworICAgICAgICBpZiAoIUdldE92ZXJsYXlzQWN0aXZlRmxhZygpKSB7CisgICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX3NjcmF0Y2goa1NjcmF0Y2hNb3VudFBvaW50LCBudWxscHRyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gVGhpcyByZXR1cm5zIHRoZSBzY3JhdGNoIGRldmljZSB0aGF0IHdhcyBkZXRlY3RlZCBkdXJpbmcgZWFybHkgYm9vdCAoZmlyc3QtCisvLyBzdGFnZSBpbml0KS4gSWYgdGhlIGRldmljZSB3YXMgY3JlYXRlZCBsYXRlciwgZm9yIGV4YW1wbGUgZHVyaW5nIHNldHVwIGZvcgorLy8gdGhlIGFkYiByZW1vdW50IGNvbW1hbmQsIGl0IGNhbiByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIHNpbmNlIGl0IGRvZXMgbm90CisvLyBxdWVyeSBJbWFnZU1hbmFnZXIuIChOb3RlIHRoYXQgSW1hZ2VNYW5hZ2VyIGluIGZpcnN0LXN0YWdlIGluaXQgd2lsbCBhbHdheXMKKy8vIHVzZSBkZXZpY2UtbWFwcGVyLCBzaW5jZSAvZGF0YSBpcyBub3QgYXZhaWxhYmxlIHRvIHVzZSBsb29wIGRldmljZXMuKQorc3RkOjpzdHJpbmcgR2V0Qm9vdFNjcmF0Y2hEZXZpY2UoKSB7CisgICAgLy8gTm90ZTogZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkgYWx3YXlzIHJldHVybnMgZmFsc2UgaW4gcmVjb3Zlcnkgb3IgZmFzdGJvb3RkLgorICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICByZXR1cm4gR2V0RHN1U2NyYXRjaERldmljZSgpOworICAgIH0KKworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworCisgICAgLy8gSWYgdGhlcmUgaXMgYSBzY3JhdGNoIHBhcnRpdGlvbiBhbGxvY2F0ZWQgaW4gL2RhdGEgb3Igb24gc3VwZXIsIHdlCisgICAgLy8gYXV0b21hdGljYWxseSBwcmlvcml0aXplIHRoYXQgb3ZlciBzdXBlcl9vdGhlciBvciBzeXN0ZW1fb3RoZXIuCisgICAgLy8gU29tZSBkZXZpY2VzLCBmb3IgZXhhbXBsZSwgaGF2ZSBhIHdyaXRlLXByb3RlY3RlZCBlTU1DIGFuZCB0aGUKKyAgICAvLyBzdXBlciBwYXJ0aXRpb24gY2Fubm90IGJlIHVzZWQgZXZlbiBpZiBpdCBleGlzdHMuCisgICAgc3RkOjpzdHJpbmcgZGV2aWNlOworICAgIGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrU2NyYXRjaE1vdW50UG9pbnQpOworICAgIGlmIChkbS5HZXRTdGF0ZShwYXJ0aXRpb25fbmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJgorICAgICAgICBkbS5HZXREbURldmljZVBhdGhCeU5hbWUocGFydGl0aW9uX25hbWUsICZkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgcmV0dXJuICIiOworfQorCit2b2lkIFRlYXJkb3duQWxsT3ZlcmxheUZvck1vdW50UG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7CisgICAgaWYgKCFPdmVybGF5ZnNUZWFyZG93bkFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSW5SZWNvdmVyeSgpKSB7CisgICAgICAgIExFUlJPUiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBtdXN0IGJlIGNhbGxlZCB3aXRoaW4gcmVjb3ZlcnkuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEVtcHR5IHN0cmluZyBtZWFucyB0ZWFyZG93biBldmVyeXRoaW5nLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRlYXJkb3duX2RpciA9IG1vdW50X3BvaW50LmVtcHR5KCkgPyAiIiA6IGZzX21ncl9tb3VudF9wb2ludChtb3VudF9wb2ludCk7CisgICAgY29uc3RleHByIGJvb2wqIGlnbm9yZV9jaGFuZ2UgPSBudWxscHRyOworCisgICAgLy8gVGVhcmRvd24gbGVnYWN5IG92ZXJsYXkgbW91bnQgcG9pbnRzIHRoYXQncyBub3QgYmFja2VkIGJ5IGEgc2NyYXRjaCBkZXZpY2UuCisgICAgZm9yIChjb25zdCBhdXRvJiBvdmVybGF5X21vdW50X3BvaW50IDogT3ZlcmxheU1vdW50UG9pbnRzKCkpIHsKKyAgICAgICAgaWYgKG92ZXJsYXlfbW91bnRfcG9pbnQgPT0ga1NjcmF0Y2hNb3VudFBvaW50KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX29uZShvdmVybGF5X21vdW50X3BvaW50LCB0ZWFyZG93bl9kaXIsIGlnbm9yZV9jaGFuZ2UpOworICAgIH0KKworICAgIGlmIChtb3VudF9wb2ludC5lbXB0eSgpKSB7CisgICAgICAgIC8vIFRocm93IGF3YXkgdGhlIGVudGlyZSBwYXJ0aXRpb24uCisgICAgICAgIGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrU2NyYXRjaE1vdW50UG9pbnQpOworICAgICAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOworICAgICAgICBpZiAoaW1hZ2VzICYmIGltYWdlcy0+QmFja2luZ0ltYWdlRXhpc3RzKHBhcnRpdGlvbl9uYW1lKSkgeworICAgICAgICAgICAgaWYgKGltYWdlcy0+RGlzYWJsZUltYWdlKHBhcnRpdGlvbl9uYW1lKSkgeworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRGlzYWJsZWQgc2NyYXRjaCBwYXJ0aXRpb24gZm9yOiAiIDw8IGtTY3JhdGNoTW91bnRQb2ludDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGRpc2FibGUgc2NyYXRjaCBwYXJ0aXRpb24gZm9yICIgPDwga1NjcmF0Y2hNb3VudFBvaW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSBpZiB3ZSBqdXN0IGRpc2FibGVkIHNjcmF0Y2gsIHRoaXMgbW91bnQgd2lsbCBmYWlsLgorICAgIGlmIChhdXRvIGluZm8gPSBFbnN1cmVTY3JhdGNoTWFwcGVkKCk7IGluZm8uaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgLy8gTWFwIHNjcmF0Y2ggZGV2aWNlLCBtb3VudCBrU2NyYXRjaE1vdW50UG9pbnQgYW5kIHRlYXJkb3duIGtTY3JhdGNoTW91bnRQb2ludC4KKyAgICAgICAgZnNfbWdyX292ZXJsYXlmc191bW91bnRfc2NyYXRjaCgpOworICAgICAgICBpZiAoTW91bnRTY3JhdGNoKGluZm8tPmRldmljZSkpIHsKKyAgICAgICAgICAgIGJvb2wgc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgZnNfbWdyX292ZXJsYXlmc190ZWFyZG93bl9vbmUoa1NjcmF0Y2hNb3VudFBvaW50LCB0ZWFyZG93bl9kaXIsIGlnbm9yZV9jaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCk7CisgICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7CisgICAgICAgICAgICBpZiAoc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCkgeworICAgICAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fc2NyYXRjaChrU2NyYXRjaE1vdW50UG9pbnQsIG51bGxwdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGVhcmRvd24gRFNVIG92ZXJsYXkgaWYgcHJlc2VudC4KKyAgICBzdGQ6OnN0cmluZyBzY3JhdGNoX2RldmljZTsKKyAgICBpZiAoTWFwRHN1U2NyYXRjaERldmljZSgmc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKTsKKyAgICAgICAgaWYgKE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSkpIHsKKyAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fb25lKGtTY3JhdGNoTW91bnRQb2ludCwgdGVhcmRvd25fZGlyLCBpZ25vcmVfY2hhbmdlKTsKKyAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKTsKKyAgICAgICAgfQorICAgICAgICBEZXN0cm95TG9naWNhbFBhcnRpdGlvbihhbmRyb2lkOjpnc2k6OmtEc3VTY3JhdGNoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmc19tZ3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmggYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNmM0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzX2NvbnRyb2wuaApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgorCisvLyBJZiAibW91bnRfcG9pbnQiIGlzIG5vbi1udWxsLCBzZXQgdXAgZXhhY3RseSBvbmUgb3ZlcmxheS4KKy8vCisvLyBJZiAibW91bnRfcG9pbnQiIGlzIG51bGwsIHNldHVwIGFueSBvdmVybGF5cy4KKy8vCisvLyBJZiB8d2FudF9yZWJvb3R8IGlzIG5vbi1udWxsLCBhbmQgYSByZWJvb3QgaXMgbmVlZGVkIHRvIGFwcGx5IG92ZXJsYXlzLCB0aGVuCisvLyBpdCB3aWxsIGJlIHRydWUgb24gcmV0dXJuLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgaXQuCitib29sIGZzX21ncl9vdmVybGF5ZnNfc2V0dXAoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiYgZnN0YWIsIGNvbnN0IGNoYXIqIG1vdW50X3BvaW50ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB3YW50X3JlYm9vdCA9IG51bGxwdHIsIGJvb2wganVzdF9kaXNhYmxlZF92ZXJpdHkgPSB0cnVlKTsKKworZW51bSBjbGFzcyBPdmVybGF5ZnNUZWFyZG93blJlc3VsdCB7CisgICAgT2ssCisgICAgQnVzeSwgIC8vIEluZGljYXRlcyB0aGF0IG92ZXJsYXlzIGFyZSBzdGlsbCBpbiB1c2UuCisgICAgRXJyb3IKK307CitPdmVybGF5ZnNUZWFyZG93blJlc3VsdCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK3ZvaWQgQ2xlYW51cE9sZFNjcmF0Y2hGaWxlcygpOworCitzdGQ6OnN0cmluZyBHZXRCb290U2NyYXRjaERldmljZSgpOworCit9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnNfbW91bnQuY3BwIGIvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnNfbW91bnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZWM2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19tb3VudC5jcHAKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Njb3BlZ3VhcmQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxleHQ0X3V0aWxzL2V4dDRfdXRpbHMuaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNpbmNsdWRlIDxmc19tZ3IvZmlsZV93YWl0Lmg+CisjaW5jbHVkZSA8ZnNfbWdyX292ZXJsYXlmcy5oPgorI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CisjaW5jbHVkZSA8bGliZ3NpL2xpYmdzaS5oPgorI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgorCisjaW5jbHVkZSAiZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmgiCisjaW5jbHVkZSAiZnNfbWdyX292ZXJsYXlmc19tb3VudC5oIgorI2luY2x1ZGUgImZzX21ncl9wcml2LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmxpdGVyYWxzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOworCitjb25zdGV4cHIgY2hhciBrUHJlZmVyQ2FjaGVCYWNraW5nU3RvcmFnZVByb3BbXSA9ICJmc19tZ3Iub3ZlcmxheWZzLnByZWZlcl9jYWNoZV9iYWNraW5nX3N0b3JhZ2UiOworCitjb25zdGV4cHIgY2hhciBrQ2FjaGVNb3VudFBvaW50W10gPSAiL2NhY2hlIjsKK2NvbnN0ZXhwciBjaGFyIGtQaHlzaWNhbERldmljZVtdID0gIi9kZXYvYmxvY2svYnktbmFtZS8iOworCisvLyBNb3VudCB0cmVlIHRvIHRlbXBvcmFyaWx5IGhvbGQgcmVmZXJlbmNlcyB0byBzdWJtb3VudHMuCitjb25zdGV4cHIgY2hhciBrTW92ZU1vdW50VGVtcERpcltdID0gIi9kZXYvcmVtb3VudCI7CisKK2NvbnN0ZXhwciBjaGFyIGtMb3dlcmRpck9wdGlvbltdID0gImxvd2VyZGlyPSI7Citjb25zdGV4cHIgY2hhciBrVXBwZXJkaXJPcHRpb25bXSA9ICJ1cHBlcmRpcj0iOworY29uc3RleHByIGNoYXIga1dvcmtkaXJPcHRpb25bXSA9ICJ3b3JrZGlyPSI7CisKK2Jvb2wgZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkgeworICAgIC8vIFNpbmNlIGFuZHJvaWQ6OmdzaTo6Q2FuQm9vdEludG9Hc2koKSBvciBhbmRyb2lkOjpnc2k6Ok1hcmtTeXN0ZW1Bc0dzaSgpIGlzCisgICAgLy8gbmV2ZXIgY2FsbGVkIGluIHJlY292ZXJ5LCB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuZHJvaWQ6OmdzaTo6SXNHc2lSdW5uaW5nKCkKKyAgICAvLyBpcyBub3Qgd2VsbC1kZWZpbmVkLiBJbiB0aGlzIGNhc2UsIGp1c3QgcmV0dXJuIGZhbHNlIGFzIGJlaW5nIGluIHJlY292ZXJ5CisgICAgLy8gaW1wbGllcyBub3QgcnVubmluZyBhIERTVSBzeXN0ZW0uCisgICAgaWYgKEluUmVjb3ZlcnkoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhbmRyb2lkOjpnc2k6OklzR3NpUnVubmluZygpOworfQorCitzdGQ6OnZlY3Rvcjxjb25zdCBzdGQ6OnN0cmluZz4gT3ZlcmxheU1vdW50UG9pbnRzKCkgeworICAgIC8vIE5ldmVyIGZhbGxiYWNrIHRvIGxlZ2FjeSBjYWNoZSBtb3VudCBwb2ludCBpZiB3aXRoaW4gYSBEU1Ugc3lzdGVtLAorICAgIC8vIGJlY2F1c2UgcnVubmluZyBhIERTVSBzeXN0ZW0gaW1wbGllcyB0aGUgZGV2aWNlIHN1cHBvcnRzIGR5bmFtaWMKKyAgICAvLyBwYXJ0aXRpb25zLCB3aGljaCBtZWFucyBsZWdhY3kgY2FjaGUgbXVzdG4ndCBiZSB1c2VkLgorICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICByZXR1cm4ge2tTY3JhdGNoTW91bnRQb2ludH07CisgICAgfQorCisgICAgLy8gRm9yIG5vbi1BL0IgZGV2aWNlcyBwcmVmZXIgY2FjaGUgYmFja2luZyBzdG9yYWdlIGlmCisgICAgLy8ga1ByZWZlckNhY2hlQmFja2luZ1N0b3JhZ2VQcm9wIHByb3BlcnR5IHNldC4KKyAgICBpZiAoZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpLmVtcHR5KCkgJiYKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KGtQcmVmZXJDYWNoZUJhY2tpbmdTdG9yYWdlUHJvcCwgZmFsc2UpICYmCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJyby52ZW5kb3IuYXBpX2xldmVsIiwgLTEpIDwgX19BTkRST0lEX0FQSV9UX18pIHsKKyAgICAgICAgcmV0dXJuIHtrQ2FjaGVNb3VudFBvaW50LCBrU2NyYXRjaE1vdW50UG9pbnR9OworICAgIH0KKworICAgIHJldHVybiB7a1NjcmF0Y2hNb3VudFBvaW50LCBrQ2FjaGVNb3VudFBvaW50fTsKK30KKworc3RkOjpzdHJpbmcgR2V0RW5jb2RlZEJhc2VEaXJGb3JNb3VudFBvaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCkgeworICAgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZWRfcGF0aDsKKyAgICBpZiAobW91bnRfcG9pbnQuZW1wdHkoKSB8fCAhYW5kcm9pZDo6YmFzZTo6UmVhbHBhdGgobW91bnRfcG9pbnQsICZub3JtYWxpemVkX3BhdGgpKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmdfdmlldyBzdihub3JtYWxpemVkX3BhdGgpOworICAgIGlmIChzdiAhPSAiLyIpIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6Q29uc3VtZVByZWZpeCgmc3YsICIvIik7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkNvbnN1bWVTdWZmaXgoJnN2LCAiLyIpOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUmVwbGFjZShzdiwgIi8iLCAiQCIsIHRydWUpOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3JfaXNfZGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgcmV0dXJuICFzdGF0KHBhdGguY19zdHIoKSwgJnN0KSAmJiBTX0lTRElSKHN0LnN0X21vZGUpOworfQorCisvLyBBdCBsZXNzIHRoYW4gMSUgb3IgOE1CIG9mIGZyZWUgc3BhY2UgcmV0dXJuIHZhbHVlIG9mIGZhbHNlLAorLy8gbWVhbnMgd2Ugd2lsbCB0cnkgdG8gd3JhcCB3aXRoIG92ZXJsYXlmcy4KK2Jvb2wgZnNfbWdyX2ZpbGVzeXN0ZW1faGFzX3NwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCkgeworICAgIC8vIElmIHdlIGhhdmUgYWNjZXNzIGlzc3VlcyB0byBmaW5kIG91dCBzcGFjZSByZW1haW5pbmcsIHJldHVybiB0cnVlCisgICAgLy8gdG8gcHJldmVudCB1cyB0cnlpbmcgdG8gb3ZlcnJpZGUgd2l0aCBvdmVybGF5ZnMuCisgICAgc3RydWN0IHN0YXR2ZnMgdnN0OworICAgIGlmIChzdGF0dmZzKG1vdW50X3BvaW50LmNfc3RyKCksICZ2c3QpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJzdGF0dmZzICIgPDwgbW91bnRfcG9pbnQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtQZXJjZW50VGhyZXNob2xkID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDElCisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIGtTaXplVGhyZXNob2xkID0gOCAqIDEwMjQgKiAxMDI0OyAgLy8gOE1CCisKKyAgICByZXR1cm4gKHZzdC5mX2JmcmVlID49ICh2c3QuZl9ibG9ja3MgKiBrUGVyY2VudFRocmVzaG9sZCAvIDEwMCkpICYmCisgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4odnN0LmZfYmZyZWUpICogdnN0LmZfZnJzaXplKSA+PSBrU2l6ZVRocmVzaG9sZDsKK30KKworc3RhdGljIGJvb2wgZnNfbWdyX3VwZGF0ZV9ibGtfZGV2aWNlKEZzdGFiRW50cnkqIGVudHJ5KSB7CisgICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MubG9naWNhbCkgeworICAgICAgICBmc19tZ3JfdXBkYXRlX2xvZ2ljYWxfcGFydGl0aW9uKGVudHJ5KTsKKyAgICB9CisgICAgaWYgKGFjY2VzcyhlbnRyeS0+YmxrX2RldmljZS5jX3N0cigpLCBGX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZW50cnktPmJsa19kZXZpY2UgIT0gIi9kZXYvcm9vdCIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igc3lzdGVtLWFzLXJvb3QgKHRhaW1lbiBhbmQgb3RoZXJzKQorICAgIGF1dG8gYmxrX2RldmljZSA9IGtQaHlzaWNhbERldmljZSArICJzeXN0ZW0iczsKKyAgICBpZiAoYWNjZXNzKGJsa19kZXZpY2UuY19zdHIoKSwgRl9PSykpIHsKKyAgICAgICAgYmxrX2RldmljZSArPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgICAgIGlmIChhY2Nlc3MoYmxrX2RldmljZS5jX3N0cigpLCBGX09LKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVudHJ5LT5ibGtfZGV2aWNlID0gYmxrX2RldmljZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZnNfbWdyX2hhc19zaGFyZWRfYmxvY2tzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldikgeworICAgIHN0cnVjdCBzdGF0ZnMgZnM7CisgICAgaWYgKChzdGF0ZnMoKG1vdW50X3BvaW50ICsgIi9sb3N0K2ZvdW5kIikuY19zdHIoKSwgJmZzKSA9PSAtMSkgfHwKKyAgICAgICAgKGZzLmZfdHlwZSAhPSBFWFQ0X1NVUEVSX01BR0lDKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKG9wZW4oZGV2LmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgaWYgKGZkIDwgMCkgcmV0dXJuIGZhbHNlOworCisgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgc2I7CisgICAgaWYgKChURU1QX0ZBSUxVUkVfUkVUUlkobHNlZWs2NChmZCwgMTAyNCwgU0VFS19TRVQpKSA8IDApIHx8CisgICAgICAgIChURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgJnNiLCBzaXplb2Yoc2IpKSkgPCAwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RydWN0IGZzX2luZm8gaW5mbzsKKyAgICBpZiAoZXh0NF9wYXJzZV9zYigmc2IsICZpbmZvKSA8IDApIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiAoaW5mby5mZWF0X3JvX2NvbXBhdCAmIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfU0hBUkVEX0JMT0NLUykgIT0gMDsKK30KKworI2RlZmluZSBGMkZTX1NVUEVSX09GRlNFVCAxMDI0CisjZGVmaW5lIEYyRlNfRkVBVFVSRV9PRkZTRVQgMjE4MAorI2RlZmluZSBGMkZTX0ZFQVRVUkVfUk8gMHg0MDAwCitzdGF0aWMgYm9vbCBmc19tZ3JfaXNfcmVhZF9vbmx5X2YyZnMoY29uc3Qgc3RkOjpzdHJpbmcmIGRldikgeworICAgIGlmICghZnNfbWdyX2lzX2YyZnMoZGV2KSkgcmV0dXJuIGZhbHNlOworCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKG9wZW4oZGV2LmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgaWYgKGZkIDwgMCkgcmV0dXJuIGZhbHNlOworCisgICAgX19sZTMyIGZlYXQ7CisgICAgaWYgKChURU1QX0ZBSUxVUkVfUkVUUlkobHNlZWs2NChmZCwgRjJGU19TVVBFUl9PRkZTRVQgKyBGMkZTX0ZFQVRVUkVfT0ZGU0VULCBTRUVLX1NFVCkpIDwgMCkgfHwKKyAgICAgICAgKFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCAmZmVhdCwgc2l6ZW9mKGZlYXQpKSkgPCAwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIChmZWF0ICYgY3B1X3RvX2xlMzIoRjJGU19GRUFUVVJFX1JPKSkgIT0gMDsKK30KKworc3RhdGljIGJvb2wgZnNfbWdyX292ZXJsYXlmc19lbmFibGVkKEZzdGFiRW50cnkqIGVudHJ5KSB7CisgICAgLy8gcmVhZG9ubHkgZmlsZXN5c3RlbSwgY2FuIG5vdCBiZSBtb3VudCAtbyByZW1vdW50LHJ3CisgICAgLy8gZm9yIHNxdWFzaGZzLCBlcm9mcyBvciBpZiBmcmVlIHNwYWNlIGlzIChuZWFyKSB6ZXJvIG1ha2luZyBzdWNoIGEgcmVtb3VudAorICAgIC8vIHZpcnR1YWxseSB1c2VsZXNzLCBvciBpZiB0aGVyZSBhcmUgc2hhcmVkIGJsb2NrcyB0aGF0IHByZXZlbnQgcmVtb3VudCxydworICAgIGlmICghZnNfbWdyX2ZpbGVzeXN0ZW1faGFzX3NwYWNlKGVudHJ5LT5tb3VudF9wb2ludCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gYmxrX2RldmljZSBuZWVkcyB0byBiZSBzZXR1cCBzbyB3ZSBjYW4gY2hlY2sgc3VwZXJibG9jay4KKyAgICAvLyBJZiB3ZSBmYWlsIGhlcmUsIGJlY2F1c2UgZHVyaW5nIGluaXQgZmlyc3Qgc3RhZ2UgYW5kIGhhdmUgZG91YnRzLgorICAgIGlmICghZnNfbWdyX3VwZGF0ZV9ibGtfZGV2aWNlKGVudHJ5KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBmMmZzIHJlYWQtb25seSBtb2RlIGRvZXNuJ3Qgc3VwcG9ydCByZW1vdW50LHJ3CisgICAgaWYgKGZzX21ncl9pc19yZWFkX29ubHlfZjJmcyhlbnRyeS0+YmxrX2RldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgaWYgZXh0NCBkZS1kdXBlCisgICAgYXV0byBoYXNfc2hhcmVkX2Jsb2NrcyA9IGZzX21ncl9oYXNfc2hhcmVkX2Jsb2NrcyhlbnRyeS0+bW91bnRfcG9pbnQsIGVudHJ5LT5ibGtfZGV2aWNlKTsKKyAgICBpZiAoIWhhc19zaGFyZWRfYmxvY2tzICYmIChlbnRyeS0+bW91bnRfcG9pbnQgPT0gIi9zeXN0ZW0iKSkgeworICAgICAgICBoYXNfc2hhcmVkX2Jsb2NrcyA9IGZzX21ncl9oYXNfc2hhcmVkX2Jsb2NrcygiLyIsIGVudHJ5LT5ibGtfZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIGhhc19zaGFyZWRfYmxvY2tzOworfQorCitjb25zdCBzdGQ6OnN0cmluZyBmc19tZ3JfbW91bnRfcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7CisgICAgaWYgKCIvInMgIT0gbW91bnRfcG9pbnQpIHJldHVybiBtb3VudF9wb2ludDsKKyAgICByZXR1cm4gIi9zeXN0ZW0iOworfQorCisvLyBkZWZhdWx0IG9wdGlvbnMgZm9yIG1vdW50X3BvaW50LCByZXR1cm5zIGVtcHR5IHN0cmluZyBmb3Igbm9uZSBhdmFpbGFibGUuCitzdGF0aWMgc3RkOjpzdHJpbmcgZnNfbWdyX2dldF9vdmVybGF5ZnNfb3B0aW9ucyhjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgeworICAgIGNvbnN0IGF1dG8gbW91bnRfcG9pbnQgPSBmc19tZ3JfbW91bnRfcG9pbnQoZW50cnkubW91bnRfcG9pbnQpOworICAgIGlmICghZnNfbWdyX2lzX2Rpcihtb3VudF9wb2ludCkpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBjb25zdCBhdXRvIGJhc2UgPSBHZXRFbmNvZGVkQmFzZURpckZvck1vdW50UG9pbnQobW91bnRfcG9pbnQpOworICAgIGlmIChiYXNlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG92ZXJsYXlfbW91bnRfcG9pbnQgOiBPdmVybGF5TW91bnRQb2ludHMoKSkgeworICAgICAgICBjb25zdCBhdXRvIGRpciA9IG92ZXJsYXlfbW91bnRfcG9pbnQgKyAiLyIgKyBrT3ZlcmxheVRvcERpciArICIvIiArIGJhc2UgKyAiLyI7CisgICAgICAgIGNvbnN0IGF1dG8gdXBwZXIgPSBkaXIgKyBrVXBwZXJOYW1lOworICAgICAgICBjb25zdCBhdXRvIHdvcmsgPSBkaXIgKyBrV29ya05hbWU7CisgICAgICAgIGlmICghZnNfbWdyX2lzX2Rpcih1cHBlcikgfHwgIWZzX21ncl9pc19kaXIod29yaykgfHwgYWNjZXNzKHdvcmsuY19zdHIoKSwgUl9PSyB8IFdfT0spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIHJldCA9IGtMb3dlcmRpck9wdGlvbiArIG1vdW50X3BvaW50ICsgIiwiICsga1VwcGVyZGlyT3B0aW9uICsgdXBwZXIgKyAiLCIgKworICAgICAgICAgICAgICAgICAgIGtXb3JrZGlyT3B0aW9uICsgd29yayArIGFuZHJvaWQ6OmZzX21ncjo6Q2hlY2tPdmVybGF5ZnMoKS5tb3VudF9mbGFnczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBmbGFnIDogYW5kcm9pZDo6YmFzZTo6U3BsaXQoZW50cnkuZnNfb3B0aW9ucywgIiwiKSkgeworICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZmxhZywgImNvbnRleHQ9IikpIHsKKyAgICAgICAgICAgICAgICByZXQgKz0gIiwiICsgZmxhZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKK2Jvb2wgQXV0b1NldEZzQ3JlYXRlQ29uOjpTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRleHQpIHsKKyAgICBpZiAoc2V0ZnNjcmVhdGVjb24oY29udGV4dC5jX3N0cigpKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAic2V0ZnNjcmVhdGVjb24gIiA8PCBjb250ZXh0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG9rXyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQXV0b1NldEZzQ3JlYXRlQ29uOjpSZXN0b3JlKCkgeworICAgIGlmIChyZXN0b3JlZF8gfHwgIW9rXykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHNldGZzY3JlYXRlY29uKG51bGxwdHIpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiBudWxsIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXN0b3JlZF8gPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgaW1tZWRpYXRlIHVubW91bnQgc3VjY2VlZGVkIGFuZCB0aGUgc2NyYXRjaCBtb3VudCBwb2ludCB3YXMKKy8vIHJlbW92ZWQuCitib29sIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKSB7CisgICAgaWYgKHVtb3VudChrU2NyYXRjaE1vdW50UG9pbnQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocm1kaXIoa1NjcmF0Y2hNb3VudFBvaW50KSAhPSAwICYmIGVycm5vICE9IEVOT0VOVCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAicm1kaXIgIiA8PCBrU2NyYXRjaE1vdW50UG9pbnQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBib29sIHNoYXJlZF9mbGFnKSB7CisgICAgYXV0byByZXQgPSBtb3VudChudWxscHRyLCBtb3VudF9wb2ludC5jX3N0cigpLCBudWxscHRyLCBzaGFyZWRfZmxhZyA/IE1TX1NIQVJFRCA6IE1TX1BSSVZBVEUsCisgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIFBFUlJPUiA8PCAiX19tb3VudCh0YXJnZXQ9IiA8PCBtb3VudF9wb2ludAorICAgICAgICAgICAgICAgPDwgIixmbGFnPSIgPDwgKHNoYXJlZF9mbGFnID8gIk1TX1NIQVJFRCIgOiAiTVNfUFJJVkFURSIpIDw8ICIpPSIgPDwgcmV0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX21vdmVfbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCkgeworICAgIGF1dG8gcmV0ID0gbW91bnQoc291cmNlLmNfc3RyKCksIHRhcmdldC5jX3N0cigpLCBudWxscHRyLCBNU19NT1ZFLCBudWxscHRyKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIFBFUlJPUiA8PCAiX19tb3VudChzb3VyY2U9IiA8PCBzb3VyY2UgPDwgIix0YXJnZXQ9IiA8PCB0YXJnZXQgPDwgIixmbGFnPU1TX01PVkUpPSIgPDwgcmV0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX21vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpIHsKKyAgICBhdXRvIHJlcG9ydCA9ICJfX21vdW50KHNvdXJjZT1vdmVybGF5LHRhcmdldD0icyArIG1vdW50X3BvaW50ICsgIix0eXBlPW92ZXJsYXkiOworICAgIGZvciAoY29uc3QgYXV0byYgb3B0IDogYW5kcm9pZDo6YmFzZTo6U3BsaXQob3B0aW9ucywgIiwiKSkgeworICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChvcHQsIGtVcHBlcmRpck9wdGlvbikpIHsKKyAgICAgICAgICAgIHJlcG9ydCA9IHJlcG9ydCArICIsIiArIG9wdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJlcG9ydCA9IHJlcG9ydCArICIpPSI7CisgICAgYXV0byByZXQgPSBtb3VudCgib3ZlcmxheSIsIG1vdW50X3BvaW50LmNfc3RyKCksICJvdmVybGF5IiwgTVNfUkRPTkxZIHwgTVNfTk9BVElNRSwKKyAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY19zdHIoKSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBQRVJST1IgPDwgcmVwb3J0IDw8IHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBMSU5GTyA8PCByZXBvcnQgPDwgcmV0OworICAgIH0KKyAgICByZXR1cm4gIXJldDsKK30KKworc3RydWN0IG1vdW50X2luZm8geworICAgIHN0ZDo6c3RyaW5nIG1vdW50X3BvaW50OworICAgIGJvb2wgc2hhcmVkX2ZsYWc7Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8bW91bnRfaW5mbz4gUmVhZE1vdW50aW5mb0Zyb21GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc3RkOjp2ZWN0b3I8bW91bnRfaW5mbz4gaW5mbzsKKworICAgIGF1dG8gZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT57Zm9wZW4ocGF0aC5jX3N0cigpLCAicmUiKSwgZmNsb3NlfTsKKyAgICBpZiAoIWZpbGUpIHsKKyAgICAgICAgUEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IGNhbm5vdCBvcGVuIGZpbGU6ICciIDw8IHBhdGggPDwgIiciOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICBzc2l6ZV90IGxlbjsKKyAgICBzaXplX3QgYWxsb2NfbGVuID0gMDsKKyAgICBjaGFyKiBsaW5lID0gbnVsbHB0cjsKKyAgICB3aGlsZSAoKGxlbiA9IGdldGxpbmUoJmxpbmUsICZhbGxvY19sZW4sIGZpbGUuZ2V0KCkpKSAhPSAtMSkgeworICAgICAgICAvKiBpZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBuZXdsaW5lLCBzaG9ydGVuIHRoZSBzdHJpbmcgYnkgMSBieXRlICovCisgICAgICAgIGlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGxpbmVbbGVuIC0gMV0gPSAnXDAnOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGRlbGltW10gPSAiIFx0IjsKKyAgICAgICAgY2hhciogc2F2ZV9wdHI7CisgICAgICAgIGlmICghc3RydG9rX3IobGluZSwgZGVsaW0sICZzYXZlX3B0cikpIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiRXJyb3IgcGFyc2luZyBtb3VudCBJRCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cnRva19yKG51bGxwdHIsIGRlbGltLCAmc2F2ZV9wdHIpKSB7CisgICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgcGFyZW50IElEIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiRXJyb3IgcGFyc2luZyBtb3VudCBzb3VyY2UiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJ0b2tfcihudWxscHRyLCBkZWxpbSwgJnNhdmVfcHRyKSkgeworICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIHJvb3QiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjaGFyKiBwOworICAgICAgICBpZiAoIShwID0gc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpKSB7CisgICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgbW91bnRfcG9pbnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbW91bnRfaW5mbyBlbnRyeSA9IHtwLCBmYWxzZX07CisKKyAgICAgICAgaWYgKCFzdHJ0b2tfcihudWxscHRyLCBkZWxpbSwgJnNhdmVfcHRyKSkgeworICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIG1vdW50X2ZsYWdzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKChwID0gc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpKSB7CisgICAgICAgICAgICBpZiAoKHBbMF0gPT0gJy0nKSAmJiAocFsxXSA9PSAnXDAnKSkgYnJlYWs7CisgICAgICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChwLCAic2hhcmVkOiIpKSBlbnRyeS5zaGFyZWRfZmxhZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgZmllbGRzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGluZm8uZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShlbnRyeSkpOworICAgIH0KKworICAgIGZyZWUobGluZSk7CisgICAgaWYgKGluZm8uZW1wdHkoKSkgeworICAgICAgICBMRVJST1IgPDwgX19GVU5DVElPTl9fIDw8ICIoKTogZmFpbGVkIHRvIGxvYWQgbW91bnRpbmZvIGZyb20gOiAnIiA8PCBwYXRoIDw8ICInIjsKKyAgICB9CisgICAgcmV0dXJuIGluZm87Cit9CisKK3N0YXRpYyBib29sIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfb25lKGNvbnN0IEZzdGFiRW50cnkmIGZzdGFiX2VudHJ5KSB7CisgICAgY29uc3QgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChmc3RhYl9lbnRyeS5tb3VudF9wb2ludCk7CisgICAgY29uc3QgYXV0byBvcHRpb25zID0gZnNfbWdyX2dldF9vdmVybGF5ZnNfb3B0aW9ucyhmc3RhYl9lbnRyeSk7CisgICAgaWYgKG9wdGlvbnMuZW1wdHkoKSkgcmV0dXJuIGZhbHNlOworCisgICAgc3RydWN0IE1vdmVFbnRyeSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1vdW50X3BvaW50OworICAgICAgICBzdGQ6OnN0cmluZyBkaXI7CisgICAgICAgIGJvb2wgc2hhcmVkX2ZsYWc7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxNb3ZlRW50cnk+IG1vdmVkX21vdW50czsKKworICAgIGJvb2wgcmV0dmFsID0gdHJ1ZTsKKyAgICBib29sIG1vdmVfZGlyX3NoYXJlZCA9IHRydWU7CisgICAgYm9vbCBwYXJlbnRfc2hhcmVkID0gdHJ1ZTsKKyAgICBib29sIHJvb3Rfc2hhcmVkID0gdHJ1ZTsKKyAgICBib29sIHJvb3RfbWFkZV9wcml2YXRlID0gZmFsc2U7CisKKyAgICAvLyBUaGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBtb3VudCBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbW91bnRwb2ludC4KKyAgICAvLyBHcm91cCB0aGVzZSBlbnRyaWVzIHRvZ2V0aGVyIHdpdGggc3RhYmxlX3NvcnQsIGFuZCBrZWVwIG9ubHkgdGhlIGxhc3QgZW50cnkgb2YgYSBncm91cC4KKyAgICAvLyBPbmx5IG1vdmUgbW91bnQgdGhlIGxhc3QgZW50cnkgaW4gYW4gb3ZlciBtb3VudCBncm91cCwgYmVjYXVzZSB0aGUgb3RoZXIgZW50cmllcyBhcmUKKyAgICAvLyBvdmVyc2hhZG93ZWQgYW5kIG9ubHkgdGhlIGZpbGVzeXN0ZW0gbW91bnRlZCB3aXRoIHRoZSBsYXN0IGVudHJ5IHBhcnRpY2lwYXRlcyBpbiBmaWxlCisgICAgLy8gcGF0aG5hbWUgcmVzb2x1dGlvbi4KKyAgICBhdXRvIG1vdW50aW5mbyA9IFJlYWRNb3VudGluZm9Gcm9tRmlsZSgiL3Byb2Mvc2VsZi9tb3VudGluZm8iKTsKKyAgICBzdGQ6OnN0YWJsZV9zb3J0KG1vdW50aW5mby5iZWdpbigpLCBtb3VudGluZm8uZW5kKCksIFtdKGNvbnN0IGF1dG8mIGxocywgY29uc3QgYXV0byYgcmhzKSB7CisgICAgICAgIHJldHVybiBsaHMubW91bnRfcG9pbnQgPCByaHMubW91bnRfcG9pbnQ7CisgICAgfSk7CisgICAgc3RkOjpyZXZlcnNlKG1vdW50aW5mby5iZWdpbigpLCBtb3VudGluZm8uZW5kKCkpOworICAgIGF1dG8gZXJhc2VfZnJvbSA9IHN0ZDo6dW5pcXVlKAorICAgICAgICAgICAgbW91bnRpbmZvLmJlZ2luKCksIG1vdW50aW5mby5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8mIGxocywgY29uc3QgYXV0byYgcmhzKSB7IHJldHVybiBsaHMubW91bnRfcG9pbnQgPT0gcmhzLm1vdW50X3BvaW50OyB9KTsKKyAgICBtb3VudGluZm8uZXJhc2UoZXJhc2VfZnJvbSwgbW91bnRpbmZvLmVuZCgpKTsKKyAgICBzdGQ6OnJldmVyc2UobW91bnRpbmZvLmJlZ2luKCksIG1vdW50aW5mby5lbmQoKSk7CisgICAgLy8gbW91bnRpbmZvIGlzIHJldmVyc2VkIHR3aWNlLCBzbyBzdGlsbCBpcyBpbiBsZXhpY2FsIHNvcnRlZCBvcmRlci4KKworICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBtb3VudGluZm8pIHsKKyAgICAgICAgaWYgKGVudHJ5Lm1vdW50X3BvaW50ID09IGtNb3ZlTW91bnRUZW1wRGlyKSB7CisgICAgICAgICAgICBtb3ZlX2Rpcl9zaGFyZWQgPSBlbnRyeS5zaGFyZWRfZmxhZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50cnkubW91bnRfcG9pbnQgPT0gbW91bnRfcG9pbnQgfHwKKyAgICAgICAgICAgIChtb3VudF9wb2ludCA9PSAiL3N5c3RlbSIgJiYgZW50cnkubW91bnRfcG9pbnQgPT0gIi8iKSkgeworICAgICAgICAgICAgcGFyZW50X3NoYXJlZCA9IGVudHJ5LnNoYXJlZF9mbGFnOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRyeS5tb3VudF9wb2ludCA9PSAiLyIpIHsKKyAgICAgICAgICAgIHJvb3Rfc2hhcmVkID0gZW50cnkuc2hhcmVkX2ZsYWc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcmVjb25kaXRpb24gaXMgdGhhdCBrTW92ZU1vdW50VGVtcERpciBpcyBNU19QUklWQVRFLCBvdGhlcndpc2UgZG9uJ3QgdHJ5IHRvIG1vdmUgYW55CisgICAgLy8gc3VibW91bnQgaW4gdG8gb3Igb3V0IG9mIGl0LgorICAgIGlmIChtb3ZlX2Rpcl9zaGFyZWQpIHsKKyAgICAgICAgbW91bnRpbmZvLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gTmVlZCB0byBtYWtlIHRoZSBvcmlnaW5hbCBtb3VudHBvaW50IE1TX1BSSVZBVEUsIHNvIHRoYXQgdGhlIG92ZXJsYXlmcyBjYW4gYmUgTVNfTU9WRS4KKyAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBpZiBpdHMgcGFyZW50IG1vdW50IGlzIHJlbW91bnRlZCBsYXRlci4KKyAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChtb3VudF9wb2ludCwgZmFsc2UpKSB7CisgICAgICAgIC8vIElmIGZhaWxlZCB0byBzZXQgIi9zeXN0ZW0iIG1vdW50IHR5cGUsIGl0IG1pZ2h0IGJlIGR1ZSB0byAiL3N5c3RlbSIgbm90IGJlaW5nIGEgdmFsaWQKKyAgICAgICAgLy8gbW91bnRwb2ludCBhZnRlciBzd2l0Y2ggcm9vdC4gUmV0cnkgd2l0aCAiLyIgaW4gdGhpcyBjYXNlLgorICAgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMICYmIG1vdW50X3BvaW50ID09ICIvc3lzdGVtIikgeworICAgICAgICAgICAgcm9vdF9tYWRlX3ByaXZhdGUgPSBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi8iLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogbW91bnRpbmZvKSB7CisgICAgICAgIC8vIEZpbmQgYWxsIGltbWVkaWF0ZSBzdWJtb3VudHMuCisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChlbnRyeS5tb3VudF9wb2ludCwgbW91bnRfcG9pbnQgKyAiLyIpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBFeGNsdWRlIGR1cGxpY2F0ZWQgb3IgbW9yZSBzcGVjaWZpYyBlbnRyaWVzLgorICAgICAgICBpZiAoc3RkOjpmaW5kX2lmKG1vdmVkX21vdW50cy5iZWdpbigpLCBtb3ZlZF9tb3VudHMuZW5kKCksIFsmZW50cnldKGNvbnN0IGF1dG8mIGl0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0Lm1vdW50X3BvaW50ID09IGVudHJ5Lm1vdW50X3BvaW50IHx8CisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZW50cnkubW91bnRfcG9pbnQsIGl0Lm1vdW50X3BvaW50ICsgIi8iKTsKKyAgICAgICAgICAgIH0pICE9IG1vdmVkX21vdW50cy5lbmQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gbW91bnRpbmZvIGlzIGluIGxleGljYWwgb3JkZXIsIHNvIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgfGVudHJ5fCBiZWluZyBhIHBhcmVudCBtb3VudCBvZgorICAgICAgICAvLyBlbnRyaWVzIG9mIHxtb3ZlZF9tb3VudHN8LgorCisgICAgICAgIE1vdmVFbnRyeSBuZXdfZW50cnl7ZW50cnkubW91bnRfcG9pbnQsIGtNb3ZlTW91bnRUZW1wRGlyICsgIi9UZW1wb3JhcnlEaXItWFhYWFhYInMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc2hhcmVkX2ZsYWd9OworICAgICAgICB7CisgICAgICAgICAgICBBdXRvU2V0RnNDcmVhdGVDb24gY3JlYXRlY29uOworICAgICAgICAgICAgYXV0byBuZXdfY29udGV4dCA9IGZzX21ncl9nZXRfY29udGV4dChlbnRyeS5tb3VudF9wb2ludCk7CisgICAgICAgICAgICBpZiAobmV3X2NvbnRleHQuZW1wdHkoKSB8fCAhY3JlYXRlY29uLlNldChuZXdfY29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGF1dG8gdGFyZ2V0ID0gbWtkdGVtcChuZXdfZW50cnkuZGlyLmRhdGEoKSk7CisgICAgICAgICAgICBpZiAoIXRhcmdldCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOworICAgICAgICAgICAgICAgIFBFUlJPUiA8PCAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgTVNfTU9WRSI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBybWRpcihuZXdfZW50cnkuZGlyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld19lbnRyeS5zaGFyZWRfZmxhZykgeworICAgICAgICAgICAgbmV3X2VudHJ5LnNoYXJlZF9mbGFnID0gZnNfbWdyX292ZXJsYXlmc19zZXRfc2hhcmVkX21vdW50KG5ld19lbnRyeS5tb3VudF9wb2ludCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19tb3ZlX21vdW50KG5ld19lbnRyeS5tb3VudF9wb2ludCwgbmV3X2VudHJ5LmRpcikpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG5ld19lbnRyeS5zaGFyZWRfZmxhZykgeworICAgICAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChuZXdfZW50cnkubW91bnRfcG9pbnQsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm1kaXIobmV3X2VudHJ5LmRpci5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1vdmVkX21vdW50cy5wdXNoX2JhY2soc3RkOjptb3ZlKG5ld19lbnRyeSkpOworICAgIH0KKworICAgIHJldHZhbCAmPSBmc19tZ3Jfb3ZlcmxheWZzX21vdW50KG1vdW50X3BvaW50LCBvcHRpb25zKTsKKworICAgIC8vIE1vdmUgc3VibW91bnRzIGJhY2suCisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IG1vdmVkX21vdW50cykgeworICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfbW92ZV9tb3VudChlbnRyeS5kaXIsIGVudHJ5Lm1vdW50X3BvaW50KSkgeworICAgICAgICAgICAgcmV0dmFsID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuc2hhcmVkX2ZsYWcgJiYKKyAgICAgICAgICAgICAgICAgICAhZnNfbWdyX292ZXJsYXlmc19zZXRfc2hhcmVkX21vdW50KGVudHJ5Lm1vdW50X3BvaW50LCB0cnVlKSkgeworICAgICAgICAgICAgcmV0dmFsID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcm1kaXIoZW50cnkuZGlyLmNfc3RyKCkpOworICAgIH0KKyAgICAvLyBJZiB0aGUgb3JpZ2luYWwgKG92ZXJyaWRkZW4pIG1vdW50IHdhcyBNU19TSEFSRUQsIHRoZW4gc2V0IHRoZSBvdmVybGF5ZnMgbW91bnQgdG8gTVNfU0hBUkVELgorICAgIGlmIChwYXJlbnRfc2hhcmVkKSB7CisgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChtb3VudF9wb2ludCwgdHJ1ZSk7CisgICAgfQorICAgIGlmIChyb290X3NoYXJlZCAmJiByb290X21hZGVfcHJpdmF0ZSkgeworICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi8iLCB0cnVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLyBNb3VudCBrU2NyYXRjaE1vdW50UG9pbnQKK2Jvb2wgTW91bnRTY3JhdGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfcGF0aCwgYm9vbCByZWFkb25seSkgeworICAgIGlmIChyZWFkb25seSkgeworICAgICAgICBpZiAoYWNjZXNzKGRldmljZV9wYXRoLmNfc3RyKCksIEZfT0spKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJQYXRoIGRvZXMgbm90IGV4aXN0OiAiIDw8IGRldmljZV9wYXRoOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhY2Nlc3MoZGV2aWNlX3BhdGguY19zdHIoKSwgUl9PSyB8IFdfT0spKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlBhdGggZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWR3cml0ZTogIiA8PCBkZXZpY2VfcGF0aDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBmaWxlc3lzdGVtX2NhbmRpZGF0ZXM7CisgICAgaWYgKGZzX21ncl9pc19mMmZzKGRldmljZV9wYXRoKSkgeworICAgICAgICBmaWxlc3lzdGVtX2NhbmRpZGF0ZXMgPSB7ImYyZnMiLCAiZXh0NCJ9OworICAgIH0gZWxzZSBpZiAoZnNfbWdyX2lzX2V4dDQoZGV2aWNlX3BhdGgpKSB7CisgICAgICAgIGZpbGVzeXN0ZW1fY2FuZGlkYXRlcyA9IHsiZXh0NCIsICJmMmZzIn07CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2NyYXRjaCBwYXJ0aXRpb24gaXMgbm90IGYyZnMgb3IgZXh0NCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBdXRvU2V0RnNDcmVhdGVDb24gY3JlYXRlY29uKGtPdmVybGF5ZnNGaWxlQ29udGV4dCk7CisgICAgaWYgKCFjcmVhdGVjb24uT2soKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChta2RpcihrU2NyYXRjaE1vdW50UG9pbnQsIDA3NTUpICYmIChlcnJubyAhPSBFRVhJU1QpKSB7CisgICAgICAgIFBFUlJPUiA8PCAiY3JlYXRlICIgPDwga1NjcmF0Y2hNb3VudFBvaW50OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRnN0YWJFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5ibGtfZGV2aWNlID0gZGV2aWNlX3BhdGg7CisgICAgZW50cnkubW91bnRfcG9pbnQgPSBrU2NyYXRjaE1vdW50UG9pbnQ7CisgICAgZW50cnkuZmxhZ3MgPSBNU19OT0FUSU1FIHwgTVNfUkRPTkxZOworICAgIGlmICghcmVhZG9ubHkpIHsKKyAgICAgICAgZW50cnkuZmxhZ3MgJj0gfk1TX1JET05MWTsKKyAgICAgICAgZW50cnkuZmxhZ3MgfD0gTVNfU1lOQ0hST05PVVM7CisgICAgICAgIGVudHJ5LmZzX29wdGlvbnMgPSAibm9kaXNjYXJkIjsKKyAgICAgICAgZnNfbWdyX3NldF9ibGtfcm8oZGV2aWNlX3BhdGgsIGZhbHNlKTsKKyAgICB9CisgICAgLy8gY2hlY2tfZnMgcmVxdWlyZXMgYXBleCBydW50aW1lIGxpYnJhcnkKKyAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoIi9kYXRhIiwgZmFsc2UpKSB7CisgICAgICAgIGVudHJ5LmZzX21ncl9mbGFncy5jaGVjayA9IHRydWU7CisgICAgfQorICAgIGJvb2wgbW91bnRlZCA9IGZhbHNlOworICAgIGZvciAoYXV0byBmc190eXBlIDogZmlsZXN5c3RlbV9jYW5kaWRhdGVzKSB7CisgICAgICAgIGVudHJ5LmZzX3R5cGUgPSBmc190eXBlOworICAgICAgICBpZiAoZnNfbWdyX2RvX21vdW50X29uZShlbnRyeSkgPT0gMCkgeworICAgICAgICAgICAgbW91bnRlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1vdW50ZWQpIHsKKyAgICAgICAgcm1kaXIoa1NjcmF0Y2hNb3VudFBvaW50KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTk9URTogT3ZlcmxheWZzU2V0dXBBbGxvd2VkKCkgbXVzdCBiZSAic3RyaWN0ZXIiIHRoYW4gT3ZlcmxheWZzVGVhcmRvd25BbGxvd2VkKCkuCisvLyBTZXR1cCBpcyBhbGxvd2VkIG9ubHkgaWYgdGVhcmRvd24gaXMgYWxzbyBhbGxvd2VkLgorYm9vbCBPdmVybGF5ZnNTZXR1cEFsbG93ZWQoYm9vbCB2ZXJib3NlKSB7CisgICAgaWYgKCFrQWxsb3dPdmVybGF5ZnMpIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk92ZXJsYXlmcyByZW1vdW50cyBjYW4gb25seSBiZSB1c2VkIGluIGRlYnVnZ2FibGUgYnVpbGRzIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIENoZWNrIG1hbmRhdG9yeSBrZXJuZWwgcGF0Y2hlcy4KKyAgICBpZiAoIWFuZHJvaWQ6OmZzX21ncjo6Q2hlY2tPdmVybGF5ZnMoKS5zdXBwb3J0ZWQpIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIktlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsYXlmcyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBpbiByZWNvdmVyeSBvciBmYXN0Ym9vdGQsIG5vdCBhbGxvd2VkIQorICAgIGlmIChJblJlY292ZXJ5KCkpIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIG92ZXJsYXlmcyBzZXR1cCBmcm9tIHJlY292ZXJ5IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGZzX21ncl93YW50c19vdmVybGF5ZnMoRnN0YWJFbnRyeSogZW50cnkpIHsKKyAgICAvLyBEb24ndCBjaGVjayBlbnRyaWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdm9sZC4KKyAgICBpZiAoZW50cnktPmZzX21ncl9mbGFncy52b2xkX21hbmFnZWQgfHwgZW50cnktPmZzX21ncl9mbGFncy5yZWNvdmVyeV9vbmx5KSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyAqX290aGVyIGRvZXNuJ3Qgd2FudCBvdmVybGF5ZnMuCisgICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3Muc2xvdF9zZWxlY3Rfb3RoZXIpIHJldHVybiBmYWxzZTsKKworICAgIC8vIE9ubHkgY29uY2VybmVkIHdpdGggcmVhZG9ubHkgcGFydGl0aW9ucy4KKyAgICBpZiAoIShlbnRyeS0+ZmxhZ3MgJiBNU19SRE9OTFkpKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB1bmJpbmRhYmxlLCBkbyBub3QgYWxsb3cgb3ZlcmxheWZzIGFzIHRoaXMgY291bGQgZXhwb3NlIHVzIHRvCisgICAgLy8gc2VjdXJpdHkgaXNzdWVzLiAgT24gQW5kcm9pZCwgdGhpcyBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gdHVybiBvZmYKKyAgICAvLyB0aGUgYWJpbGl0eSB0byBvdmVybGF5IGFuIG90aGVyd2lzZSBhY2NlcHRhYmxlIGZpbGVzeXN0ZW0gc2luY2UKKyAgICAvLyAvc3lzdGVtIGFuZCAvdmVuZG9yIGFyZSBuZXZlciBib3VuZChzaWMpIHRvLgorICAgIGlmIChlbnRyeS0+ZmxhZ3MgJiBNU19VTkJJTkRBQkxFKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfZW5hYmxlZChlbnRyeSkpIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitGc3RhYiBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KGNvbnN0IEZzdGFiJiBmc3RhYikgeworICAgIGFuZHJvaWQ6OmZzX21ncjo6RnN0YWIgbW91bnRzOworICAgIGlmICghYW5kcm9pZDo6ZnNfbWdyOjpSZWFkRnN0YWJGcm9tRmlsZSgiL3Byb2MvbW91bnRzIiwgJm1vdW50cykpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIC9wcm9jL21vdW50cyI7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBGc3RhYiBjYW5kaWRhdGVzOworICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc3RhYikgeworICAgICAgICAvLyBGaWx0ZXIgb3V0IHBhcnRpdGlvbnMgd2hvc2UgdHlwZSBkb2Vzbid0IG1hdGNoIHdoYXQncyBtb3VudGVkLgorICAgICAgICAvLyBUaGlzIGF2b2lkcyBzcGFtbXkgYmVoYXZpb3Igb24gZGV2aWNlcyB3aGljaCBjYW4gbW91bnQgZGlmZmVyZW50CisgICAgICAgIC8vIGZpbGVzeXN0ZW1zIGZvciBlYWNoIHBhcnRpdGlvbi4KKyAgICAgICAgYXV0byBwcm9jX21vdW50X3BvaW50ID0gKGVudHJ5Lm1vdW50X3BvaW50ID09ICIvc3lzdGVtIikgPyAiLyIgOiBlbnRyeS5tb3VudF9wb2ludDsKKyAgICAgICAgYXV0byBtb3VudGVkID0gR2V0RW50cnlGb3JNb3VudFBvaW50KCZtb3VudHMsIHByb2NfbW91bnRfcG9pbnQpOworICAgICAgICBpZiAoIW1vdW50ZWQgfHwgbW91bnRlZC0+ZnNfdHlwZSAhPSBlbnRyeS5mc190eXBlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEZzdGFiRW50cnkgbmV3X2VudHJ5ID0gZW50cnk7CisgICAgICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoZW50cnkubW91bnRfcG9pbnQpICYmCisgICAgICAgICAgICAhZnNfbWdyX3dhbnRzX292ZXJsYXlmcygmbmV3X2VudHJ5KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgYXV0byBuZXdfbW91bnRfcG9pbnQgPSBmc19tZ3JfbW91bnRfcG9pbnQobmV3X2VudHJ5Lm1vdW50X3BvaW50KTsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZF9pZihjYW5kaWRhdGVzLmJlZ2luKCksIGNhbmRpZGF0ZXMuZW5kKCksIFsmXShjb25zdCBhdXRvJiBpdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmc19tZ3JfbW91bnRfcG9pbnQoaXQubW91bnRfcG9pbnQpID09IG5ld19tb3VudF9wb2ludDsKKyAgICAgICAgICAgIH0pICE9IGNhbmRpZGF0ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhbmRpZGF0ZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShuZXdfZW50cnkpKTsKKyAgICB9CisgICAgcmV0dXJuIGNhbmRpZGF0ZXM7Cit9CisKK3N0YXRpYyB2b2lkIFRyeU1vdW50U2NyYXRjaCgpIHsKKyAgICAvLyBOb3RlIHdlIGdldCB0aGUgYm9vdCBzY3JhdGNoIGRldmljZSBoZXJlLCB3aGljaCBtZWFucyBpZiBzY3JhdGNoIHdhcworICAgIC8vIGp1c3QgY3JlYXRlZCB0aHJvdWdoIEltYWdlTWFuYWdlciwgdGhpcyBjb3VsZCBmYWlsLiBJbiBwcmFjdGljZSB0aGlzCisgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYmVjYXVzZSAicmVtb3VudCIgZGV0ZWN0cyB0aGlzIHNjZW5hcmlvIChieSBjaGVja2luZworICAgIC8vIGlmIHZlcml0eSBpcyBzdGlsbCBkaXNhYmxlZCwgaS5lLiBubyByZWJvb3Qgb2NjdXJyZWQpLCBhbmQgc2tpcHMgY2FsbGluZworICAgIC8vIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfYWxsKCkuCisgICAgYXV0byBzY3JhdGNoX2RldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7CisgICAgaWYgKGFjY2VzcyhzY3JhdGNoX2RldmljZS5jX3N0cigpLCBSX09LIHwgV19PSykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIVdhaXRGb3JGaWxlKHNjcmF0Y2hfZGV2aWNlLCAxMHMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFNb3VudFNjcmF0Y2goc2NyYXRjaF9kZXZpY2UsIHRydWUgLyogcmVhZG9ubHkgKi8pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgYXV0byB0b3AgPSBrU2NyYXRjaE1vdW50UG9pbnQgKyAiLyJzICsga092ZXJsYXlUb3BEaXI7CisgICAgY29uc3QgYm9vbCBoYXNfb3ZlcmxheWZzX2RpciA9IGFjY2Vzcyh0b3AuY19zdHIoKSwgRl9PSykgPT0gMDsKKyAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7CisgICAgaWYgKGhhc19vdmVybGF5ZnNfZGlyKSB7CisgICAgICAgIE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSk7CisgICAgfQorfQorCitib29sIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfYWxsKEZzdGFiKiBmc3RhYikgeworICAgIGlmICghT3ZlcmxheWZzU2V0dXBBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEVuc3VyZSBrTW92ZU1vdW50VGVtcERpciBpcyBzdGFuZGFsb25lIG1vdW50IHRyZWUgd2l0aCAncHJpdmF0ZScgcHJvcGFnYXRpb24gYnkgYmluZCBtb3VudGluZworICAgIC8vIHRvIGl0c2VsZiBhbmQgc2V0IHRvIE1TX1BSSVZBVEUuCisgICAgLy8gT3RoZXJ3aXNlIG1vdW50cyBtb3ZlZCBpbiB0byBpdCB3b3VsZCBoYXZlIHRoZWlyIHByb3BhZ2F0aW9uIHR5cGUgY2hhbmdlZCB1bmludGVudGlvbmFsbHkuCisgICAgLy8gU2VjdGlvbiA1ZCwgaHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zaGFyZWRzdWJ0cmVlLnR4dAorICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoa01vdmVNb3VudFRlbXBEaXIsIGZhbHNlKSkgeworICAgICAgICBpZiAobWtkaXIoa01vdmVNb3VudFRlbXBEaXIsIDA3NTUpICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICAgICAgUEVSUk9SIDw8ICJta2RpciAiIDw8IGtNb3ZlTW91bnRUZW1wRGlyOworICAgICAgICB9CisgICAgICAgIGlmIChtb3VudChrTW92ZU1vdW50VGVtcERpciwga01vdmVNb3VudFRlbXBEaXIsIG51bGxwdHIsIE1TX0JJTkQsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBQRVJST1IgPDwgImJpbmQgbW91bnQgIiA8PCBrTW92ZU1vdW50VGVtcERpcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoa01vdmVNb3VudFRlbXBEaXIsIGZhbHNlKTsKKyAgICBhbmRyb2lkOjpiYXNlOjpTY29wZUd1YXJkIHVtb3VudERpcihbXSgpIHsKKyAgICAgICAgdW1vdW50KGtNb3ZlTW91bnRUZW1wRGlyKTsKKyAgICAgICAgcm1kaXIoa01vdmVNb3VudFRlbXBEaXIpOworICAgIH0pOworCisgICAgYXV0byByZXQgPSB0cnVlOworICAgIGF1dG8gc2NyYXRjaF9jYW5fYmVfbW91bnRlZCA9ICFmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChrU2NyYXRjaE1vdW50UG9pbnQsIGZhbHNlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdCgqZnN0YWIpKSB7CisgICAgICAgIGlmIChmc19tZ3JfaXNfdmVyaXR5X2VuYWJsZWQoZW50cnkpKSBjb250aW51ZTsKKyAgICAgICAgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChlbnRyeS5tb3VudF9wb2ludCk7CisgICAgICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChtb3VudF9wb2ludCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzY3JhdGNoX2Nhbl9iZV9tb3VudGVkKSB7CisgICAgICAgICAgICBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkID0gZmFsc2U7CisgICAgICAgICAgICBUcnlNb3VudFNjcmF0Y2goKTsKKyAgICAgICAgfQorICAgICAgICByZXQgJj0gZnNfbWdyX292ZXJsYXlmc19tb3VudF9vbmUoZW50cnkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIGZzX21ncl9vdmVybGF5ZnNfaXNfc2V0dXAoKSB7CisgICAgaWYgKCFPdmVybGF5ZnNTZXR1cEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChrU2NyYXRjaE1vdW50UG9pbnQsIGZhbHNlKSkgcmV0dXJuIHRydWU7CisgICAgRnN0YWIgZnN0YWI7CisgICAgaWYgKCFSZWFkRGVmYXVsdEZzdGFiKCZmc3RhYikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdChmc3RhYikpIHsKKyAgICAgICAgaWYgKGZzX21ncl9pc192ZXJpdHlfZW5hYmxlZChlbnRyeSkpIGNvbnRpbnVlOworICAgICAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoZnNfbWdyX21vdW50X3BvaW50KGVudHJ5Lm1vdW50X3BvaW50KSkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBib29sIG92ZXJsYXlfb25seSkgeworICAgIEZzdGFiIGZzdGFiOworICAgIGlmICghUmVhZEZzdGFiRnJvbVByb2NNb3VudHMoJmZzdGFiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IGF1dG8gbG93ZXJkaXIgPSBrTG93ZXJkaXJPcHRpb24gKyBtb3VudF9wb2ludDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogR2V0RW50cmllc0Zvck1vdW50UG9pbnQoJmZzdGFiLCBtb3VudF9wb2ludCkpIHsKKyAgICAgICAgaWYgKCFvdmVybGF5X29ubHkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRyeS0+ZnNfdHlwZSAhPSAib3ZlcmxheSIgJiYgZW50cnktPmZzX3R5cGUgIT0gIm92ZXJsYXlmcyIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGF1dG8gb3B0aW9ucyA9IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGVudHJ5LT5mc19vcHRpb25zLCAiLCIpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG9wdCA6IG9wdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChvcHQgPT0gbG93ZXJkaXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmc19tZ3IgeworCit2b2lkIE1vdW50T3ZlcmxheWZzKGNvbnN0IEZzdGFiRW50cnkmIGZzdGFiX2VudHJ5LCBib29sKiBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkKSB7CisgICAgaWYgKCFPdmVybGF5ZnNTZXR1cEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IGF1dG8gY2FuZGlkYXRlcyA9IGZzX21ncl9vdmVybGF5ZnNfY2FuZGlkYXRlX2xpc3Qoe2ZzdGFiX2VudHJ5fSk7CisgICAgaWYgKGNhbmRpZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IGF1dG8mIGVudHJ5ID0gY2FuZGlkYXRlcy5mcm9udCgpOworICAgIGlmIChmc19tZ3JfaXNfdmVyaXR5X2VuYWJsZWQoZW50cnkpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChlbnRyeS5tb3VudF9wb2ludCk7CisgICAgaWYgKGZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKG1vdW50X3BvaW50KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgqc2NyYXRjaF9jYW5fYmVfbW91bnRlZCkgeworICAgICAgICAqc2NyYXRjaF9jYW5fYmVfbW91bnRlZCA9IGZhbHNlOworICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGtTY3JhdGNoTW91bnRQb2ludCwgZmFsc2UpKSB7CisgICAgICAgICAgICBUcnlNb3VudFNjcmF0Y2goKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBhdXRvIG9wdGlvbnMgPSBmc19tZ3JfZ2V0X292ZXJsYXlmc19vcHRpb25zKGVudHJ5KTsKKyAgICBpZiAob3B0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnNfbWdyX292ZXJsYXlmc19tb3VudChtb3VudF9wb2ludCwgb3B0aW9ucyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmc19tZ3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19tb3VudC5oIGIvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnNfbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGI5MDA3Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnNfbW91bnQuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgorCitjb25zdGV4cHIgY2hhciBrT3ZlcmxheWZzRmlsZUNvbnRleHRbXSA9ICJ1Om9iamVjdF9yOm92ZXJsYXlmc19maWxlOnMwIjsKKworY29uc3RleHByIGNoYXIga1NjcmF0Y2hNb3VudFBvaW50W10gPSAiL21udC9zY3JhdGNoIjsKK2NvbnN0ZXhwciBjaGFyIGtPdmVybGF5VG9wRGlyW10gPSAib3ZlcmxheSI7Citjb25zdGV4cHIgY2hhciBrVXBwZXJOYW1lW10gPSAidXBwZXIiOworY29uc3RleHByIGNoYXIga1dvcmtOYW1lW10gPSAid29yayI7CisKKyNpZiBBTExPV19BREJEX0RJU0FCTEVfVkVSSVRZCitjb25zdGV4cHIgYm9vbCBrQWxsb3dPdmVybGF5ZnMgPSB0cnVlOworI2Vsc2UKK2NvbnN0ZXhwciBib29sIGtBbGxvd092ZXJsYXlmcyA9IGZhbHNlOworI2VuZGlmCisKK2NsYXNzIEF1dG9TZXRGc0NyZWF0ZUNvbiBmaW5hbCB7CisgIHB1YmxpYzoKKyAgICBBdXRvU2V0RnNDcmVhdGVDb24oKSB7fQorICAgIEF1dG9TZXRGc0NyZWF0ZUNvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGV4dCkgeyBTZXQoY29udGV4dCk7IH0KKyAgICB+QXV0b1NldEZzQ3JlYXRlQ29uKCkgeyBSZXN0b3JlKCk7IH0KKworICAgIGJvb2wgT2soKSBjb25zdCB7IHJldHVybiBva187IH0KKyAgICBib29sIFNldChjb25zdCBzdGQ6OnN0cmluZyYgY29udGV4dCk7CisgICAgYm9vbCBSZXN0b3JlKCk7CisKKyAgcHJpdmF0ZToKKyAgICBib29sIG9rXyA9IGZhbHNlOworICAgIGJvb2wgcmVzdG9yZWRfID0gZmFsc2U7Cit9OworCitib29sIGZzX21ncl9pc19kc3VfcnVubmluZygpOworYm9vbCBmc19tZ3JfZmlsZXN5c3RlbV9oYXNfc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGZzX21ncl9tb3VudF9wb2ludChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQpOworYm9vbCBPdmVybGF5ZnNTZXR1cEFsbG93ZWQoYm9vbCB2ZXJib3NlID0gZmFsc2UpOworYm9vbCBNb3VudFNjcmF0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9wYXRoLCBib29sIHJlYWRvbmx5ID0gZmFsc2UpOworYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7CitzdGQ6OnZlY3Rvcjxjb25zdCBzdGQ6OnN0cmluZz4gT3ZlcmxheU1vdW50UG9pbnRzKCk7Citib29sIGZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgYm9vbCBvdmVybGF5X29ubHkgPSB0cnVlKTsKK2Jvb2wgZnNfbWdyX3dhbnRzX292ZXJsYXlmcyhhbmRyb2lkOjpmc19tZ3I6OkZzdGFiRW50cnkqIGVudHJ5KTsKK2FuZHJvaWQ6OmZzX21ncjo6RnN0YWIgZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdChjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkZzdGFiJiBmc3RhYik7CitzdGQ6OnN0cmluZyBHZXRFbmNvZGVkQmFzZURpckZvck1vdW50UG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KTsKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3JfcHJpdi5oIGIvZnNfbWdyL2ZzX21ncl9wcml2LmgKaW5kZXggNDZjZGI2Mi4uN2U0ZDVlNSAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21ncl9wcml2LmgKKysrIGIvZnNfbWdyL2ZzX21ncl9wcml2LmgKQEAgLTIzLDE1ICsyMyw3IEBACiAjaW5jbHVkZSA8ZnNfbWdyLmg+CiAjaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KIAotI2luY2x1ZGUgImZzX21ncl9wcml2X2Jvb3RfY29uZmlnLmgiCi0KLS8qIFRoZSBDSEVDSygpIGluIGxvZ2dpbmcuaCB3aWxsIHVzZSBwcm9ncmFtIGludm9jYXRpb24gbmFtZSBhcyB0aGUgdGFnLgotICogVGh1cywgdGhlIGxvZyB3aWxsIGhhdmUgcHJlZml4ICJpbml0OiAiIHdoZW4gbGliZnNfbWdyIGlzIHN0YXRpY2FsbHkKLSAqIGxpbmtlZCBpbiB0aGUgaW5pdCBwcm9jZXNzLiBUaGlzIG1pZ2h0IGJlIG9wYXF1ZSB3aGVuIGRlYnVnZ2luZy4KLSAqIEFwcGVuZHMgImluIGxpYmZzX21nciIgYXQgdGhlIGVuZCBvZiB0aGUgYWJvcnQgbWVzc2FnZSB0byBleHBsaWNpdGx5Ci0gKiBpbmRpY2F0ZSB0aGUgY2hlY2sgaGFwcGVucyBpbiBmc19tZ3IuCi0gKi8KLSNkZWZpbmUgRlNfTUdSX0NIRUNLKHgpIENIRUNLKHgpIDw8ICJpbiBsaWJmc19tZ3IgIgorI2luY2x1ZGUgImxpYmZzdGFiL2ZzdGFiX3ByaXYuaCIKIAogI2RlZmluZSBGU19NR1JfVEFHICJbbGliZnNfbWdyXSAiCiAKQEAgLTg5LDI4ICs4MSwyNSBAQAogdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwogCiBib29sIGZzX21ncl9zZXRfYmxrX3JvKGNvbnN0IHN0ZDo6c3RyaW5nJiBibG9ja2RldiwgYm9vbCByZWFkb25seSA9IHRydWUpOwotYm9vbCBmc19tZ3JfdXBkYXRlX2Zvcl9zbG90c2VsZWN0KGFuZHJvaWQ6OmZzX21ncjo6RnN0YWIqIGZzdGFiKTsKIGJvb2wgZnNfbWdyX2lzX2RldmljZV91bmxvY2tlZCgpOwotY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9hbmRyb2lkX2R0X2RpcigpOwotYm9vbCBpc19kdF9jb21wYXRpYmxlKCk7CiAKIGJvb2wgZnNfbWdyX2lzX2V4dDQoY29uc3Qgc3RkOjpzdHJpbmcmIGJsa19kZXZpY2UpOwogYm9vbCBmc19tZ3JfaXNfZjJmcyhjb25zdCBzdGQ6OnN0cmluZyYgYmxrX2RldmljZSk7CiAKLWJvb2wgZnNfbWdyX3RlYXJkb3duX3Zlcml0eShhbmRyb2lkOjpmc19tZ3I6OkZzdGFiRW50cnkqIGZzdGFiKTsKLQogYm9vbCBmc19tZ3JfZmlsZXN5c3RlbV9hdmFpbGFibGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVzeXN0ZW0pOwogc3RkOjpzdHJpbmcgZnNfbWdyX2dldF9jb250ZXh0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCk7CiAKLWVudW0gY2xhc3MgT3ZlcmxheWZzVmFsaWRSZXN1bHQgewotICAgIGtOb3RTdXBwb3J0ZWQgPSAwLAotICAgIGtPaywKLSAgICBrT3ZlcnJpZGVDcmVkc1JlcXVpcmVkLAotfTsKLU92ZXJsYXlmc1ZhbGlkUmVzdWx0IGZzX21ncl9vdmVybGF5ZnNfdmFsaWQoKTsKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGZzX21nciB7CisKIGJvb2wgVW5tYXBEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworCitzdHJ1Y3QgT3ZlcmxheWZzQ2hlY2tSZXN1bHQgeworICAgIGJvb2wgc3VwcG9ydGVkOworICAgIHN0ZDo6c3RyaW5nIG1vdW50X2ZsYWdzOworfTsKKworT3ZlcmxheWZzQ2hlY2tSZXN1bHQgQ2hlY2tPdmVybGF5ZnMoKTsKKwogfSAgLy8gbmFtZXNwYWNlIGZzX21ncgogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3JfcHJpdl9ib290X2NvbmZpZy5oIGIvZnNfbWdyL2ZzX21ncl9wcml2X2Jvb3RfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzg0MDEuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2ZzX21ncl9wcml2X2Jvb3RfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0NPUkVfRlNfTUdSX1BSSVZfQk9PVENPTkZJR19ICi0jZGVmaW5lIF9fQ09SRV9GU19NR1JfUFJJVl9CT09UQ09ORklHX0gKLQotI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGZzX21ncl9wYXJzZV9jbWRsaW5lKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lKTsKLQotYm9vbCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRfdmFsKTsKLWJvb2wgZnNfbWdyX2dldF9ib290X2NvbmZpZ19mcm9tX2tlcm5lbF9jbWRsaW5lKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBvdXRfdmFsKTsKLWJvb2wgZnNfbWdyX2dldF9ib290X2NvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0X3ZhbCk7Ci1zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gZnNfbWdyX3BhcnNlX3Byb2NfYm9vdGNvbmZpZygKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcpOwotYm9vbCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgYm9vdGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dF92YWwpOwotYm9vbCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZ19zb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIG91dF92YWwpOwotCi0jZW5kaWYgLyogX19DT1JFX0ZTX01HUl9QUklWX0JPT1RDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9wcml2X292ZXJsYXlmcy5oIGIvZnNfbWdyL2ZzX21ncl9wcml2X292ZXJsYXlmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDMzNzAxLi4wMDAwMDAwCi0tLSBhL2ZzX21nci9mc19tZ3JfcHJpdl9vdmVybGF5ZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBib29sIG92ZXJsYXlfb25seSA9IHRydWUpOwotYm9vbCBmc19tZ3Jfd2FudHNfb3ZlcmxheWZzKGFuZHJvaWQ6OmZzX21ncjo6RnN0YWJFbnRyeSogZW50cnkpOwotYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6RnN0YWImIGZzdGFiKTsKLQotLy8gSWYgIm1vdW50X3BvaW50IiBpcyBub24tbnVsbCwgc2V0IHVwIGV4YWN0bHkgb25lIG92ZXJsYXkuCi0vLyBJZiAibW91bnRfcG9pbnQiIGlzIG51bGwsIHNldHVwIGFueSBvdmVybGF5cy4KLS8vCi0vLyBJZiB8d2FudF9yZWJvb3R8IGlzIG5vbi1udWxsLCBhbmQgYSByZWJvb3QgaXMgbmVlZGVkIHRvIGFwcGx5IG92ZXJsYXlzLCB0aGVuCi0vLyBpdCB3aWxsIGJlIHRydWUgb24gcmV0dXJuLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgaXQuCi1ib29sIGZzX21ncl9vdmVybGF5ZnNfc2V0dXAoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiYgZnN0YWIsIGNvbnN0IGNoYXIqIG1vdW50X3BvaW50ID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB3YW50X3JlYm9vdCA9IG51bGxwdHIsIGJvb2wganVzdF9kaXNhYmxlZF92ZXJpdHkgPSB0cnVlKTsKLQotZW51bSBjbGFzcyBPdmVybGF5ZnNUZWFyZG93blJlc3VsdCB7Ci0gICAgT2ssCi0gICAgQnVzeSwgIC8vIEluZGljYXRlcyB0aGF0IG92ZXJsYXlzIGFyZSBzdGlsbCBpbiB1c2UuCi0gICAgRXJyb3IKLX07Ci1PdmVybGF5ZnNUZWFyZG93blJlc3VsdCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50ID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QgPSBudWxscHRyKTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGZzX21nciB7Ci0KLXZvaWQgQ2xlYW51cE9sZFNjcmF0Y2hGaWxlcygpOwotCi19ICAvLyBuYW1lc3BhY2UgZnNfbWdyCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9yZW1vdW50LmNwcCBiL2ZzX21nci9mc19tZ3JfcmVtb3VudC5jcHAKaW5kZXggNWE5ZjM5MS4uNzMzYmEyZiAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21ncl9yZW1vdW50LmNwcAorKysgYi9mc19tZ3IvZnNfbWdyX3JlbW91bnQuY3BwCkBAIC00Myw3ICs0Myw4IEBACiAjaW5jbHVkZSA8bGliYXZiX3VzZXIvbGliYXZiX3VzZXIuaD4KICNpbmNsdWRlIDxsaWJnc2kvbGliZ3NpZC5oPgogCi0jaW5jbHVkZSAiZnNfbWdyX3ByaXZfb3ZlcmxheWZzLmgiCisjaW5jbHVkZSAiZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmgiCisjaW5jbHVkZSAiZnNfbWdyX292ZXJsYXlmc19tb3VudC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpsaXRlcmFsczsKIHVzaW5nIGFuZHJvaWQ6OmZzX21ncjo6RnN0YWI7CkBAIC04NywxNyArODgsNiBAQAogICAgIHJldHVybiBlbnRyeS5tb3VudF9wb2ludDsKIH0KIAotY29uc3QgRnN0YWJFbnRyeSogR2V0V3JhcHBlZEVudHJ5KGNvbnN0IEZzdGFiJiBvdmVybGF5ZnNfY2FuZGlkYXRlcywgY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKLSAgICBhdXRvIG1vdW50X3BvaW50ID0gc3lzdGVtX21vdW50X3BvaW50KGVudHJ5KTsKLSAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKG92ZXJsYXlmc19jYW5kaWRhdGVzLmJlZ2luKCksIG92ZXJsYXlmc19jYW5kaWRhdGVzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZtb3VudF9wb2ludF0oY29uc3QgYXV0byYgZW50cnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChtb3VudF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW91bnRfcG9pbnQoZW50cnkpICsgIi8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIGlmIChpdCA9PSBvdmVybGF5ZnNfY2FuZGlkYXRlcy5lbmQoKSkgcmV0dXJuIG51bGxwdHI7Ci0gICAgcmV0dXJuICYoKml0KTsKLX0KLQogY2xhc3MgTXlMb2dnZXIgewogICBwdWJsaWM6CiAgICAgZXhwbGljaXQgTXlMb2dnZXIoYm9vbCB2ZXJib3NlKSA6IHZlcmJvc2VfKHZlcmJvc2UpIHt9CkBAIC0xMjcsMTIgKzExNywxMSBAQAogfQogCiBzdGF0aWMgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkPiBHZXRWb2xkKCkgeworICAgIGF1dG8gc20gPSBhbmRyb2lkOjpkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpZiAoYXV0byBzbSA9IGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKSB7Ci0gICAgICAgICAgICBpZiAoYXV0byBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShhbmRyb2lkOjpTdHJpbmcxNigidm9sZCIpKSkgewotICAgICAgICAgICAgICAgIGlmIChhdXRvIHZvbGQgPSBhbmRyb2lkOjppbnRlcmZhY2VfY2FzdDxhbmRyb2lkOjpvczo6SVZvbGQ+KGJpbmRlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvbGQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAoYXV0byBiaW5kZXIgPSBzbS0+Y2hlY2tTZXJ2aWNlKGFuZHJvaWQ6OlN0cmluZzE2KCJ2b2xkIikpKSB7CisgICAgICAgICAgICBpZiAoYXV0byB2b2xkID0gYW5kcm9pZDo6aW50ZXJmYWNlX2Nhc3Q8YW5kcm9pZDo6b3M6OklWb2xkPihiaW5kZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZvbGQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDJzKTsKQEAgLTE2OSwxNSArMTU4LDI1IEBACiAgICAgLy8gbm90IGNoZWNrcG9pbnRpbmcuCiAgICAgYXV0byB2b2xkID0gR2V0Vm9sZCgpOwogICAgIGJvb2wgY2hlY2twb2ludGluZyA9IGZhbHNlOwotICAgIGlmICghdm9sZC0+aXNDaGVja3BvaW50aW5nKCZjaGVja3BvaW50aW5nKS5pc09rKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGRldGVybWluZSBjaGVja3BvaW50aW5nIHN0YXR1cy4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChjaGVja3BvaW50aW5nKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCB1c2UgcmVtb3VudCB3aGVuIGEgY2hlY2twb2ludCBpcyBpbiBwcm9ncmVzcy4iOwotICAgICAgICBMT0coRVJST1IpIDw8ICJUbyBmb3JjZSBlbmQgY2hlY2twb2ludGluZywgY2FsbCAndmRjIGNoZWNrcG9pbnQgY29tbWl0Q2hhbmdlcyciOwotICAgICAgICBMT0coRVJST1IpIDw8ICJXYXJuaW5nOiB0aGlzIGNhbiBsZWFkIHRvIGRhdGEgY29ycnVwdGlvbiBpZiByb2xsZWQgYmFjay4iOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgYm9vbCBzaG93X2hlbHAgPSB0cnVlOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKCF2b2xkLT5pc0NoZWNrcG9pbnRpbmcoJmNoZWNrcG9pbnRpbmcpLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGRldGVybWluZSBjaGVja3BvaW50aW5nIHN0YXR1cy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghY2hlY2twb2ludGluZykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3dfaGVscCkgeworICAgICAgICAgICAgc2hvd19oZWxwID0gZmFsc2U7CisgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIldBUk5JTkc6IFVzZXJkYXRhIGNoZWNrcG9pbnQgaXMgaW4gcHJvZ3Jlc3MuIFRvIGZvcmNlIGVuZCBjaGVja3BvaW50aW5nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGwgJ3ZkYyBjaGVja3BvaW50IGNvbW1pdENoYW5nZXMnLiBUaGlzIGNhbiBsZWFkIHRvIGRhdGEgY29ycnVwdGlvbiBpZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInJvbGxlZCBiYWNrLiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIldhaXRpbmcgZm9yIGNoZWNrcG9pbnQgdG8gY29tcGxldGUgYW5kIHRoZW4gY29udGludWUgcmVtb3VudC4iOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig0cyk7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMTk2LDkgKzE5NSw2IEBACiAgICAgaWYgKGF1dG8gY2FuZGlkYXRlX2VudHJ5ID0gR2V0RW50cnlGb3JNb3VudFBvaW50KCZjYW5kaWRhdGVzLCBlbnRyeS5tb3VudF9wb2ludCkpIHsKICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZV9lbnRyeS0+ZnNfdHlwZSA9PSBlbnRyeS5mc190eXBlOwogICAgIH0KLSAgICBpZiAoR2V0V3JhcHBlZEVudHJ5KGNhbmRpZGF0ZXMsIGVudHJ5KSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC0yNTIsMTEgKzI0OCw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBGc3RhYkVudHJ5KiBlbnRyeSA9ICYqaXQ7Ci0gICAgICAgIGlmIChhdXRvIHdyYXAgPSBHZXRXcmFwcGVkRW50cnkoY2FuZGlkYXRlcywgKmVudHJ5KTsgd3JhcCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgInBhcnRpdGlvbiAiIDw8IGFyZyA8PCAiIGNvdmVyZWQgYnkgb3ZlcmxheWZzIGZvciAiIDw8IHdyYXAtPm1vdW50X3BvaW50Ci0gICAgICAgICAgICAgICAgICAgICAgPDwgIiwgc3dpdGNoaW5nIjsKLSAgICAgICAgICAgIGVudHJ5ID0gd3JhcDsKLSAgICAgICAgfQogCiAgICAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSByZW1vdW50ZWQsIGluY2x1ZGUgaXQgc28gaXQgZ2V0cyBncmFjZWZ1bGx5IHNraXBwZWQKICAgICAgICAgLy8gbGF0ZXIgb24uCkBAIC0zODksOCArMzgwLDggQEAKIAogICAgIC8vIE5vdyByZW1vdW50IQogICAgIGZvciAoY29uc3QgYXV0byYgbW50X3BvaW50IDoge21vdW50X3BvaW50LCBlbnRyeS5tb3VudF9wb2ludH0pIHsKLSAgICAgICAgaWYgKDo6bW91bnQoYmxrX2RldmljZS5jX3N0cigpLCBtbnRfcG9pbnQuY19zdHIoKSwgZW50cnkuZnNfdHlwZS5jX3N0cigpLCBNU19SRU1PVU5ULAotICAgICAgICAgICAgICAgICAgICBudWxscHRyKSA9PSAwKSB7CisgICAgICAgIGlmICg6Om1vdW50KGJsa19kZXZpY2UuY19zdHIoKSwgbW50X3BvaW50LmNfc3RyKCksIGVudHJ5LmZzX3R5cGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgTVNfUkVNT1VOVCB8IE1TX05PQVRJTUUsIG51bGxwdHIpID09IDApIHsKICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUmVtb3VudGVkICIgPDwgbW50X3BvaW50IDw8ICIgYXMgUlciOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3Jfcm9vdHMuY3BwIGIvZnNfbWdyL2ZzX21ncl9yb290cy5jcHAKaW5kZXggMmFkODEyNS4uYTY5N2ZiMyAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21ncl9yb290cy5jcHAKKysrIGIvZnNfbWdyL2ZzX21ncl9yb290cy5jcHAKQEAgLTExNSw4ICsxMTUsOCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN1cHBvcnRlZF9mc3siZXh0NCIsICJzcXVhc2hmcyIsICJ2ZmF0IiwgImYyZnMiLCAiZXJvZnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25lIn07CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdXBwb3J0ZWRfZnN7ImV4dDQiLCAic3F1YXNoZnMiLCAidmZhdCIsICJleGZhdCIsICJmMmZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJvZnMiLCAibm9uZSJ9OwogICAgIGlmIChzdGQ6OmZpbmQoc3VwcG9ydGVkX2ZzLmJlZ2luKCksIHN1cHBvcnRlZF9mcy5lbmQoKSwgcmVjLT5mc190eXBlKSA9PSBzdXBwb3J0ZWRfZnMuZW5kKCkpIHsKICAgICAgICAgTEVSUk9SIDw8ICJ1bmtub3duIGZzX3R5cGUgXCIiIDw8IHJlYy0+ZnNfdHlwZSA8PCAiXCIgZm9yICIgPDwgbW91bnRfcG9pbnQ7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3JfdmVuZG9yX292ZXJsYXkuY3BwIGIvZnNfbWdyL2ZzX21ncl92ZW5kb3Jfb3ZlcmxheS5jcHAKaW5kZXggNmIzMmI0ZC4uNmI3NDJlNSAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21ncl92ZW5kb3Jfb3ZlcmxheS5jcHAKKysrIGIvZnNfbWdyL2ZzX21ncl92ZW5kb3Jfb3ZlcmxheS5jcHAKQEAgLTg1LDEwICs4NSw4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBhdXRvIG9wdGlvbnMgPSBrTG93ZXJkaXJPcHRpb24gKyBzb3VyY2VfZGlyZWN0b3J5ICsgIjoiICsgdmVuZG9yX21vdW50X3BvaW50OwotICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX3ZhbGlkKCkgPT0gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtPdmVycmlkZUNyZWRzUmVxdWlyZWQpIHsKLSAgICAgICAgb3B0aW9ucyArPSAiLG92ZXJyaWRlX2NyZWRzPW9mZiI7Ci0gICAgfQorICAgIGNvbnN0IGF1dG8gb3B0aW9ucyA9IGtMb3dlcmRpck9wdGlvbiArIHNvdXJjZV9kaXJlY3RvcnkgKyAiOiIgKyB2ZW5kb3JfbW91bnRfcG9pbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmZzX21ncjo6Q2hlY2tPdmVybGF5ZnMoKS5tb3VudF9mbGFnczsKICAgICBhdXRvIHJlcG9ydCA9ICJfX21vdW50KHNvdXJjZT1vdmVybGF5LHRhcmdldD0icyArIHZlbmRvcl9tb3VudF9wb2ludCArICIsdHlwZT1vdmVybGF5LCIgKwogICAgICAgICAgICAgICAgICAgb3B0aW9ucyArICIpPSI7CiAgICAgYXV0byByZXQgPSBtb3VudCgib3ZlcmxheSIsIHZlbmRvcl9tb3VudF9wb2ludC5jX3N0cigpLCAib3ZlcmxheSIsIE1TX1JET05MWSB8IE1TX05PQVRJTUUsCkBAIC0xMTQsMTMgKzExMiwxNCBAQAogICAgIC8vIHByb3BlcnRpZXMgYXJlIGxvYWRlZC4KICAgICBzdGF0aWMgY29uc3QgYXV0byB2bmRrX3ZlcnNpb24gPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eShrVm5ka1ZlcnNpb25Qcm9wZXJ0eU5hbWUsICIiKTsKICAgICBpZiAodm5ka192ZXJzaW9uLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gVmVuZG9yIG92ZXJsYXkgaXMgZGlzYWJsZWQgZnJvbSBWTkRLIGRlcHJlY2F0ZWQgZGV2aWNlcy4KICAgICAgICAgTElORk8gPDwgInZlbmRvciBvdmVybGF5OiB2bmRrIHZlcnNpb24gbm90IGRlZmluZWQiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgY29uc3QgYXV0byB2ZW5kb3Jfb3ZlcmxheV9kaXJzID0gZnNfbWdyX2dldF92ZW5kb3Jfb3ZlcmxheV9kaXJzKHZuZGtfdmVyc2lvbik7CiAgICAgaWYgKHZlbmRvcl9vdmVybGF5X2RpcnMuZW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGZzX21ncl9vdmVybGF5ZnNfdmFsaWQoKSA9PSBPdmVybGF5ZnNWYWxpZFJlc3VsdDo6a05vdFN1cHBvcnRlZCkgeworICAgIGlmICghYW5kcm9pZDo6ZnNfbWdyOjpDaGVja092ZXJsYXlmcygpLnN1cHBvcnRlZCkgewogICAgICAgICBMSU5GTyA8PCAidmVuZG9yIG92ZXJsYXk6IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsYXlmcyI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS9mc19tZ3IvaW5jbHVkZS9mc19tZ3IuaCBiL2ZzX21nci9pbmNsdWRlL2ZzX21nci5oCmluZGV4IDQzZGU2ZDguLmJjNGE3YTYgMTAwNjQ0Ci0tLSBhL2ZzX21nci9pbmNsdWRlL2ZzX21nci5oCisrKyBiL2ZzX21nci9pbmNsdWRlL2ZzX21nci5oCkBAIC04NSwxMyArODUsMTAgQEAKICNkZWZpbmUgRlNfTUdSX0RPTU5UX0ZBSUxFRCAoLTEpCiAjZGVmaW5lIEZTX01HUl9ET01OVF9CVVNZICgtMikKICNkZWZpbmUgRlNfTUdSX0RPTU5UX1NVQ0NFU1MgMAotaW50IGZzX21ncl9kb19tb3VudChhbmRyb2lkOjpmc19tZ3I6OkZzdGFiKiBmc3RhYiwgY29uc3QgY2hhciogbl9uYW1lLCBjaGFyKiBuX2Jsa19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqIHRtcF9tb3VudF9wb2ludCk7Ci1pbnQgZnNfbWdyX2RvX21vdW50KGFuZHJvaWQ6OmZzX21ncjo6RnN0YWIqIGZzdGFiLCBjb25zdCBjaGFyKiBuX25hbWUsIGNoYXIqIG5fYmxrX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgY2hhciogdG1wX21vdW50X3BvaW50LCBib29sIG5lZWRfY3AsIGJvb2wgbWV0YWRhdGFfZW5jcnlwdGVkKTsKK2ludCBmc19tZ3JfZG9fbW91bnQoYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiogZnN0YWIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuX2Jsa19kZXZpY2UsIGludCBuZWVkc19jaGVja3BvaW50LCBib29sIG5lZWRzX2VuY3J5cHQpOwogaW50IGZzX21ncl9kb19tb3VudF9vbmUoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYkVudHJ5JiBlbnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCA9ICIiKTsKLWludCBmc19tZ3JfZG9fdG1wZnNfbW91bnQoY29uc3QgY2hhciAqbl9uYW1lKTsKIGJvb2wgZnNfbWdyX2xvYWRfdmVyaXR5X3N0YXRlKGludCogbW9kZSk7CiAvLyBSZXR1cm5zIHRydWUgaWYgdmVyaXR5IGlzIGVuYWJsZWQgb24gdGhpcyBwYXJ0aWN1bGFyIEZzdGFiRW50cnkuCiBib29sIGZzX21ncl9pc192ZXJpdHlfZW5hYmxlZChjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkZzdGFiRW50cnkmIGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzX21nci9pbmNsdWRlL2ZzX21ncl9vdmVybGF5ZnMuaCBiL2ZzX21nci9pbmNsdWRlL2ZzX21ncl9vdmVybGF5ZnMuaAppbmRleCBiZGFhYmJmLi5iZjY4YjJjIDEwMDY0NAotLS0gYS9mc19tZ3IvaW5jbHVkZS9mc19tZ3Jfb3ZlcmxheWZzLmgKKysrIGIvZnNfbWdyL2luY2x1ZGUvZnNfbWdyX292ZXJsYXlmcy5oCkBAIC0zMCw2ICszMCw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZnNfbWdyIHsKIAorLy8gTW91bnQgdGhlIG92ZXJsYXlmcyBvdmVycmlkZSBmb3IgfGZzdGFiX2VudHJ5fC4KK3ZvaWQgTW91bnRPdmVybGF5ZnMoY29uc3QgRnN0YWJFbnRyeSYgZnN0YWJfZW50cnksIGJvb2wqIHNjcmF0Y2hfY2FuX2JlX21vdW50ZWQpOworCiB2b2lkIE1hcFNjcmF0Y2hQYXJ0aXRpb25JZk5lZWRlZChGc3RhYiogZnN0YWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Jik+JiBpbml0KTsKIApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmRtL2RtLmNwcCBiL2ZzX21nci9saWJkbS9kbS5jcHAKaW5kZXggMWU4YzE0Zi4uZTI2MWFhMyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2RtLmNwcAorKysgYi9mc19tZ3IvbGliZG0vZG0uY3BwCkBAIC0xMDYsNiArMTA2LDEwIEBACiAgICAgaWYgKCFHZXREZXZpY2VVbmlxdWVQYXRoKG5hbWUsICZ1bmlxdWVfcGF0aCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCB1bmlxdWUgcGF0aCBmb3IgZGV2aWNlICIgPDwgbmFtZTsKICAgICB9CisgICAgLy8gRXhwZWN0IHRvIGhhdmUgdWV2ZW50IGdlbmVyYXRlZCBpZiB0aGUgdW5pcXVlIHBhdGggYWN0dWFsbHkgZXhpc3RzLiBUaGlzIG1heSBub3QgZXhpc3QKKyAgICAvLyBpZiB0aGUgZGV2aWNlIHdhcyBjcmVhdGVkIGJ1dCBoYXMgbmV2ZXIgYmVlbiBhY3RpdmF0ZWQgYmVmb3JlIGl0IGdldHMgZGVsZXRlZC4KKyAgICBib29sIG5lZWRfdWV2ZW50ID0gIXVuaXF1ZV9wYXRoLmVtcHR5KCkgJiYgYWNjZXNzKHVuaXF1ZV9wYXRoLmNfc3RyKCksIEZfT0spID09IDA7CisKICAgICBzdHJ1Y3QgZG1faW9jdGwgaW87CiAgICAgSW5pdElvKCZpbywgbmFtZSk7CiAKQEAgLTExNiw3ICsxMjAsNyBAQAogCiAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGFwcHJvcHJpYXRlIHVldmVudCBpcyBnZW5lcmF0ZWQgc28gdWV2ZW50ZCB3aWxsCiAgICAgLy8gZG8gdGhlIHJpZ2h0IHRoaW5nIGFuZCByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIG5vZGUgYW5kIHN5bWxpbmtzLgotICAgIGlmICgoaW8uZmxhZ3MgJiBETV9VRVZFTlRfR0VORVJBVEVEX0ZMQUcpID09IDApIHsKKyAgICBpZiAobmVlZF91ZXZlbnQgJiYgKGlvLmZsYWdzICYgRE1fVUVWRU5UX0dFTkVSQVRFRF9GTEFHKSA9PSAwKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkRpZG4ndCBnZW5lcmF0ZSB1ZXZlbnQgZm9yIFsiIDw8IG5hbWUgPDwgIl0gcmVtb3ZhbCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC02MDgsOCArNjEyLDEyIEBACiAKIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEV4dHJhY3RCbG9ja0RldmljZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6c3RyaW5nX3ZpZXcga0RldkJsb2NrUHJlZml4KCIvZGV2L2Jsb2NrLyIpOwotICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHBhdGgsIGtEZXZCbG9ja1ByZWZpeCkpIHsKLSAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGtEZXZCbG9ja1ByZWZpeC5sZW5ndGgoKSk7CisgICAgc3RkOjpzdHJpbmcgcmVhbF9wYXRoOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhbHBhdGgocGF0aCwgJnJlYWxfcGF0aCkpIHsKKyAgICAgICAgcmVhbF9wYXRoID0gcGF0aDsKKyAgICB9CisgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgocmVhbF9wYXRoLCBrRGV2QmxvY2tQcmVmaXgpKSB7CisgICAgICAgIHJldHVybiByZWFsX3BhdGguc3Vic3RyKGtEZXZCbG9ja1ByZWZpeC5sZW5ndGgoKSk7CiAgICAgfQogICAgIHJldHVybiB7fTsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9kbV90YWJsZS5jcHAgYi9mc19tZ3IvbGliZG0vZG1fdGFibGUuY3BwCmluZGV4IGVmZTAzYWIuLmI1NDY5OTUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9kbV90YWJsZS5jcHAKKysrIGIvZnNfbWdyL2xpYmRtL2RtX3RhYmxlLmNwcApAQCAtMzgsMTEgKzM4LDExIEBACiBib29sIERtVGFibGU6OnZhbGlkKCkgY29uc3QgewogICAgIGlmICh0YXJnZXRzXy5lbXB0eSgpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkRldmljZS1tYXBwZXIgdGFibGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0YXJnZXQuIjsKLSAgICAgICAgcmV0dXJuICIiOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh0YXJnZXRzX1swXS0+c3RhcnQoKSAhPSAwKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkRldmljZS1tYXBwZXIgdGFibGUgbXVzdCBzdGFydCBhdCBsb2dpY2FsIHNlY3RvciAwLiI7Ci0gICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9kbV90ZXN0LmNwcCBiL2ZzX21nci9saWJkbS9kbV90ZXN0LmNwcAppbmRleCBjNTIyZWFmLi5hMDEyOWMyIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAKKysrIGIvZnNfbWdyL2xpYmRtL2RtX3Rlc3QuY3BwCkBAIC01ODAsOSArNTgwLDE4IEBACiAgICAgQVNTRVJUX1RSVUUoZG0uR2V0RG1EZXZpY2VQYXRoQnlOYW1lKCJsaWJkbS10ZXN0LWRtLWxpbmVhciIsICZwYXRoKSk7CiAgICAgQVNTRVJUX0VRKDAsIGFjY2VzcyhwYXRoLmNfc3RyKCksIEZfT0spKTsKIAorICAgIHN0ZDo6c3RyaW5nIHVuaXF1ZV9wYXRoOworICAgIEFTU0VSVF9UUlVFKGRtLkdldERldmljZVVuaXF1ZVBhdGgoImxpYmRtLXRlc3QtZG0tbGluZWFyIiwgJnVuaXF1ZV9wYXRoKSk7CisgICAgQVNTRVJUX0VRKDAsIGFjY2Vzcyh1bmlxdWVfcGF0aC5jX3N0cigpLCBGX09LKSk7CisKICAgICBBU1NFUlRfVFJVRShkbS5EZWxldGVEZXZpY2UoImxpYmRtLXRlc3QtZG0tbGluZWFyIiwgNXMpKTsKICAgICBBU1NFUlRfRVEoRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCwgZG0uR2V0U3RhdGUoImxpYmRtLXRlc3QtZG0tbGluZWFyIikpOwotICAgIEFTU0VSVF9ORSgwLCBhY2Nlc3MocGF0aC5jX3N0cigpLCBGX09LKSk7CisgICAgLy8gQ2hlY2sgdGhhdCB1bmlxdWUgcGF0aCBvZiB0aGlzIGRldmljZSBoYXMgYmVlbiBkZWxldGV0ZWQuCisgICAgLy8gUHJldmlvdXNseSB0aGlzIHRlc3QgY2FzZSB1c2VkIHRvIGNoZWNrIHRoYXQgZGV2IG5vZGUgKGkuZS4gL2Rldi9ibG9jay9kbS1YWCkgaGFzIGJlZW4KKyAgICAvLyBkZWxldGVkLiBIb3dldmVyLCB0aGlzIGludHJvZHVjZXMgYSByYWNlIGNvbmRpdGlvbiwgdWV2ZW50ZCB3aWxsIHJlbW92ZSB0aGUgdW5pcXVlIHN5bWxpbmsKKyAgICAvLyAoaS5lLiAvZGV2L2Jsb2NrL21hcHBlci9ieS11dWlkLy4uLikgKipiZWZvcmUqKiByZW1vdmluZyB0aGUgZGV2aWNlIG5vZGUsIHdoaWxlIERlbGV0ZURldmljZQorICAgIC8vIEFQSSBzeW5jaHJvbml6ZXMgb24gdGhlIHVuaXF1ZSBzeW1saW5rIGJlaW5nIGRlbGV0ZWQuCisgICAgQVNTRVJUX05FKDAsIGFjY2Vzcyh1bmlxdWVfcGF0aC5jX3N0cigpLCBGX09LKSk7CiAgICAgQVNTRVJUX0VRKEVOT0VOVCwgZXJybm8pOwogfQogCmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oIGIvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaAppbmRleCAzZTdlY2M2Li4yMmM0NzVmIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oCisrKyBiL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmgKQEAgLTUyLDggKzUyLDggQEAKIAogc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrU2VjdG9yU2l6ZSA9IDUxMjsKIAotLy8gUmV0dXJucyBgcGF0aGAgd2l0aG91dCAvZGV2L2Jsb2NrIHByZWZpeCBpZiBhbmQgb25seSBpZiBgcGF0aGAgc3RhcnRzIHdpdGgKLS8vIHRoYXQgcHJlZml4LgorLy8gUmV0dXJucyBgcGF0aGAgd2l0aG91dCAvZGV2L2Jsb2NrIHByZWZpeCBpZiBgcGF0aGAgc3RhcnRzIHdpdGggdGhhdCBwcmVmaXguCisvLyBPciwgaWYgYHBhdGhgIGlzIGEgc3ltbGluaywgZG8gdGhlIHNhbWUgd2l0aCBpdHMgcmVhbCBwYXRoLgogc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gRXh0cmFjdEJsb2NrRGV2aWNlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAKIC8vIFRoaXMgaW50ZXJmYWNlIGlzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBTZWUgRGV2aWNlTWFwcGVyIHByb3BlciBmb3Igd2hhdCB0aGVzZSBtZXRob2RzIGRvLgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZpZW1hcC9BbmRyb2lkLmJwIGIvZnNfbWdyL2xpYmZpZW1hcC9BbmRyb2lkLmJwCmluZGV4IGRkZGE2NDguLmM4ZDU3NTYgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmaWVtYXAvQW5kcm9pZC5icAorKysgYi9mc19tZ3IvbGliZmllbWFwL0FuZHJvaWQuYnAKQEAgLTI0LDYgKzI0LDcgQEAKICAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogfQogCiBmaWxlZ3JvdXAgewpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZpZW1hcC9iaW5kZXIuY3BwIGIvZnNfbWdyL2xpYmZpZW1hcC9iaW5kZXIuY3BwCmluZGV4IDQxZTUzNGEuLjQzOWFhYzkgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmaWVtYXAvYmluZGVyLmNwcAorKysgYi9mc19tZ3IvbGliZmllbWFwL2JpbmRlci5jcHAKQEAgLTc3LDcgKzc3LDcgQEAKIAogc3RhdGljIEZpZW1hcFN0YXR1cyBUb0ZpZW1hcFN0YXR1cyhjb25zdCBjaGFyKiBmdW5jLCBjb25zdCBiaW5kZXI6OlN0YXR1cyYgc3RhdHVzKSB7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgZnVuYyA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMudG9TdHJpbmc4KCkuc3RyaW5nKCk7CisgICAgICAgIExPRyhFUlJPUikgPDwgZnVuYyA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMudG9TdHJpbmc4KCkuY19zdHIoKTsKICAgICAgICAgaWYgKHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gRmllbWFwU3RhdHVzOjpGcm9tRXJyb3JDb2RlKHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT5kZWxldGVCYWNraW5nSW1hZ2UobmFtZSk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgX19QUkVUVFlfRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgYXV0byBzdGF0dXMgPSBtYW5hZ2VyXy0+bWFwSW1hZ2VEZXZpY2UobmFtZSwgdGltZW91dF9tc19jb3VudCwgJm1hcCk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgX19QUkVUVFlfRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgICpwYXRoID0gbWFwLnBhdGg7CkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT51bm1hcEltYWdlRGV2aWNlKG5hbWUpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgIGF1dG8gc3RhdHVzID0gbWFuYWdlcl8tPmJhY2tpbmdJbWFnZUV4aXN0cyhuYW1lLCAmcmV0dmFsKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTE1NSw3ICsxNTUsNyBAQAogICAgIGF1dG8gc3RhdHVzID0gbWFuYWdlcl8tPmlzSW1hZ2VNYXBwZWQobmFtZSwgJnJldHZhbCk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgX19QUkVUVFlfRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT5nZXRBbGxCYWNraW5nSW1hZ2VzKCZyZXR2YWwpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICB9CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE4OSw3ICsxODksNyBAQAogICAgIGF1dG8gc3RhdHVzID0gbWFuYWdlcl8tPnJlbW92ZUFsbEltYWdlcygpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgIGF1dG8gc3RhdHVzID0gbWFuYWdlcl8tPmRpc2FibGVJbWFnZShuYW1lKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CkBAIC0yMDksNyArMjA5LDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT5yZW1vdmVEaXNhYmxlZEltYWdlcygpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgIGF1dG8gc3RhdHVzID0gbWFuYWdlcl8tPmdldE1hcHBlZEltYWdlRGV2aWNlKG5hbWUsIGRldmljZSk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgX19QUkVUVFlfRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiAhZGV2aWNlLT5lbXB0eSgpOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgYXV0byBzdGF0dXMgPSBtYW5hZ2VyXy0+aXNJbWFnZURpc2FibGVkKG5hbWUsICZyZXR2YWwpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gcmV0dmFsOwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAKICAgICBhdXRvIHN0YXR1cyA9IHNlcnZpY2UtPm9wZW5JbWFnZVNlcnZpY2UoZGlyLCAmbWFuYWdlcik7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpIHx8ICFtYW5hZ2VyKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBhY3F1aXJlIElJbWFnZU1hbmFnZXI6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5zdHJpbmcoKTsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGFjcXVpcmUgSUltYWdlTWFuYWdlcjogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxJbWFnZU1hbmFnZXJCaW5kZXI+KHN0ZDo6bW92ZShzZXJ2aWNlKSwgc3RkOjptb3ZlKG1hbmFnZXIpKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmaWVtYXAvZmllbWFwX3dyaXRlci5jcHAgYi9mc19tZ3IvbGliZmllbWFwL2ZpZW1hcF93cml0ZXIuY3BwCmluZGV4IDI3NTM4OGUuLjA2ZTIxMGUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmaWVtYXAvZmllbWFwX3dyaXRlci5jcHAKKysrIGIvZnNfbWdyL2xpYmZpZW1hcC9maWVtYXBfd3JpdGVyLmNwcApAQCAtNDU4LDkgKzQ1OCwzNCBAQAogICAgICAgICAgICAgcmV0dXJuIEZpZW1hcFN0YXR1czo6RXJyb3IoKTsKICAgICB9CiAKLSAgICBpZiAoZmFsbG9jYXRlKGZpbGVfZmQsIDAsIDAsIGZpbGVfc2l6ZSkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgZmlsZTogIiA8PCBmaWxlX3BhdGggPDwgIiBzaXplOiAiIDw8IGZpbGVfc2l6ZTsKLSAgICAgICAgcmV0dXJuIEZpZW1hcFN0YXR1czo6RnJvbUVycm5vKGVycm5vKTsKKyAgICAvLyBGMkZTIGNhbiByZXR1cm4gRUFHQUlOIGFuZCBwYXJ0aWFsbHkgZmFsbG9jYXRlLiBLZWVwIHRyeWluZyB0byBmYWxsb2NhdGUsCisgICAgLy8gYW5kIGlmIHdlIGRvbid0IG1ha2UgZm9yd2FyZCBwcm9ncmVzcywgcmV0dXJuIEVOT1NQQy4KKyAgICBzdGQ6Om9wdGlvbmFsPG9mZl90PiBwcmV2X3NpemU7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKGZhbGxvY2F0ZShmaWxlX2ZkLCAwLCAwLCBmaWxlX3NpemUpID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChlcnJubyAhPSBFQUdBSU4pIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGZpbGU6ICIgPDwgZmlsZV9wYXRoCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNpemU6ICIgPDwgZmlsZV9zaXplOworICAgICAgICAgICAgcmV0dXJuIEZpZW1hcFN0YXR1czo6RnJvbUVycm5vKGVycm5vKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBzdGF0IHM7CisgICAgICAgIGlmIChmc3RhdChmaWxlX2ZkLCAmcykgPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZzdGF0IGFmdGVyIGZhbGxvY2F0ZSBmYWlsdXJlOiAiIDw8IGZpbGVfcGF0aDsKKyAgICAgICAgICAgIHJldHVybiBGaWVtYXBTdGF0dXM6OkZyb21FcnJubyhlcnJubyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwcmV2X3NpemUpIHsKKyAgICAgICAgICAgIHByZXZfc2l6ZSA9IHtzLnN0X3NpemV9OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpwcmV2X3NpemUgPj0gcy5zdF9zaXplKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWxsb2NhdGUgcmV0cnkgZmFpbGVkLCBnb3QgIiA8PCBzLnN0X3NpemUgPDwgIiwgYXNrZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZmlsZV9zaXplOworICAgICAgICAgICAgcmV0dXJuIEZpZW1hcFN0YXR1cyhGaWVtYXBTdGF0dXM6OkVycm9yQ29kZTo6Tk9fU1BBQ0UpOworICAgICAgICB9CisgICAgICAgIExPRyhJTkZPKSA8PCAiUmV0cnlpbmcgZmFsbG9jYXRlLCBnb3QgIiA8PCBzLnN0X3NpemUgPDwgIiwgYXNrZWQgZm9yICIgPDwgZmlsZV9zaXplOwogICAgIH0KIAogICAgIGlmIChuZWVkX2V4cGxpY2l0X3dyaXRlcykgewpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZpZW1hcC9maWVtYXBfd3JpdGVyX3Rlc3QuY3BwIGIvZnNfbWdyL2xpYmZpZW1hcC9maWVtYXBfd3JpdGVyX3Rlc3QuY3BwCmluZGV4IGJkOTdhNzguLmMzNzMyOWMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmaWVtYXAvZmllbWFwX3dyaXRlcl90ZXN0LmNwcAorKysgYi9mc19tZ3IvbGliZmllbWFwL2ZpZW1hcF93cml0ZXJfdGVzdC5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxzeXMvdmZzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgogCkBAIC01MTgsNyArNTE5LDggQEAKICAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CiAKICAgICAgICAgLy8gbW91bnQgdGhlIGZpbGUgc3lzdGVtCi0gICAgICAgIEFTU0VSVF9FUShtb3VudChsb29wX2Rldi5kZXZpY2UoKS5jX3N0cigpLCBtbnRwb2ludF8uY19zdHIoKSwgImYyZnMiLCAwLCBudWxscHRyKSwgMCk7CisgICAgICAgIEFTU0VSVF9FUShtb3VudChsb29wX2Rldi5kZXZpY2UoKS5jX3N0cigpLCBtbnRwb2ludF8uY19zdHIoKSwgImYyZnMiLCAwLCBudWxscHRyKSwgMCkKKyAgICAgICAgICAgICAgICA8PCBzdHJlcnJvcihlcnJubyk7CiAgICAgfQogCiAgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmaWVtYXAvaW1hZ2VfbWFuYWdlci5jcHAgYi9mc19tZ3IvbGliZmllbWFwL2ltYWdlX21hbmFnZXIuY3BwCmluZGV4IGM0MTZmNGQuLmE1ZGE2ZTMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmaWVtYXAvaW1hZ2VfbWFuYWdlci5jcHAKKysrIGIvZnNfbWdyL2xpYmZpZW1hcC9pbWFnZV9tYW5hZ2VyLmNwcApAQCAtNTMxLDExICs1MzEsMTYgQEAKICAgICAvLyBJZiB0aGVyZSBpcyBubyBpbnRlcm1lZGlhdGUgZGV2aWNlLW1hcHBlciBub2RlLCB0aGVuIHBhcnRpdGlvbnMgY2Fubm90IGJlCiAgICAgLy8gb3BlbmVkIHdyaXRhYmxlIGR1ZSB0byBzZXBvbGljeSBhbmQgZXhjbHVzaXZpdHkgb2YgaGF2aW5nIGEgbW91bnRlZAogICAgIC8vIGZpbGVzeXN0ZW0uIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uIGRldmljZXMgd2l0aCBubyBlbmNyeXB0aW9uLCBvcgotICAgIC8vIGRldmljZXMgd2l0aCBGQkUgYW5kIG5vIG1ldGFkYXRhIGVuY3J5cHRpb24uIEZvciB0aGVzZSBjYXNlcyBpdCBzdWZmaWNlcwotICAgIC8vIHRvIHBlcmZvcm0gbm9ybWFsIGZpbGUgd3JpdGVzIHRvIC9kYXRhL2dzaSAod2hpY2ggaXMgdW5lbmNyeXB0ZWQpLgorICAgIC8vIGRldmljZXMgd2l0aCBGQkUgYW5kIG5vIG1ldGFkYXRhIGVuY3J5cHRpb24uIEZvciB0aGVzZSBjYXNlcyB3ZSBDT1VMRAorICAgIC8vIHBlcmZvcm0gbm9ybWFsIHdyaXRlcyB0byAvZGF0YS9nc2kgKHdoaWNoIGlzIHVuZW5jcnlwdGVkKSwgYnV0IGdpdmVuIHRoYXQKKyAgICAvLyBtZXRhZGF0YSBlbmNyeXB0aW9uIGhhcyBiZWVuIG1hbmRhdGVkIHNpbmNlIEFuZHJvaWQgUiwgd2UgZG9uJ3QgYWN0dWFsbHkKKyAgICAvLyBzdXBwb3J0IG9yIHRlc3QgdGhpcy4KICAgICAvLwotICAgIC8vIE5vdGU6IHRoaXMgaXMgbm90IGdhdGVkIG9uIERldmljZUluZm8sIGJlY2F1c2UgdGhlIHJlY292ZXJ5LXNwZWNpZmljIHBhdGgKLSAgICAvLyBtdXN0IG9ubHkgYmUgdXNlZCBpbiBhY3R1YWwgcmVjb3ZlcnkuCisgICAgLy8gU28sIHdlIHZhbGlkYXRlIGhlcmUgdGhhdCAvZGF0YSBpcyBiYWNrZWQgYnkgZGV2aWNlLW1hcHBlci4gVGhpcyBjb2RlCisgICAgLy8gaXNuJ3QgbmVlZGVkIGluIHJlY292ZXJ5IHNpbmNlIHRoZXJlIGlzIG5vIC9kYXRhLgorICAgIC8vCisgICAgLy8gSWYgdGhpcyBsb2dpYyBzdGlja3MgZm9yIGEgcmVsZWFzZSwgd2UgY2FuIHJlbW92ZSBNYXBXaXRoTG9vcERldmljZSwgYXMKKyAgICAvLyB3ZWxsIGFzIFdyYXBVc2VyZGF0YUlmTmVlZGVkIGluIGZzX21nci4KICAgICBzdGQ6OnN0cmluZyBibG9ja19kZXZpY2U7CiAgICAgYm9vbCBjYW5fdXNlX2RldmljZW1hcHBlcjsKICAgICBpZiAoIUZpZW1hcFdyaXRlcjo6R2V0QmxvY2tEZXZpY2VGb3JGaWxlKGltYWdlX2hlYWRlciwgJmJsb2NrX2RldmljZSwgJmNhbl91c2VfZGV2aWNlbWFwcGVyKSkgewpAQCAtNTQzLDIxICs1NDgsMTYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChjYW5fdXNlX2RldmljZW1hcHBlcikgewotICAgICAgICBpZiAoIU1hcFdpdGhEbUxpbmVhcigqcGFydGl0aW9uX29wZW5lcl8uZ2V0KCksIG5hbWUsIHRpbWVvdXRfbXMsIHBhdGgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFNYXBXaXRoTG9vcERldmljZShuYW1lLCB0aW1lb3V0X21zLCBwYXRoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2Vsc2UKLSAgICAvLyBJbiByZWNvdmVyeSwgd2UgY2FuICpvbmx5KiB1c2UgZGV2aWNlLW1hcHBlciwgc2luY2UgcGFydGl0aW9ucyBhcmVuJ3QKLSAgICAvLyBtb3VudGVkLiBUaGF0IGFsc28gbWVhbnMgd2UgY2Fubm90IGNhbGwgR2V0QmxvY2tEZXZpY2VGb3JGaWxlLgotICAgIGlmICghTWFwV2l0aERtTGluZWFyKCpwYXJ0aXRpb25fb3BlbmVyXy5nZXQoKSwgbmFtZSwgdGltZW91dF9tcywgcGF0aCkpIHsKKyAgICBpZiAoIWNhbl91c2VfZGV2aWNlbWFwcGVyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBtYXAgaW1hZ2U6IC9kYXRhIG11c3QgYmUgbW91bnRlZCBvbiB0b3Agb2YgZGV2aWNlLW1hcHBlci4iOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogI2VuZGlmCiAKKyAgICBpZiAoIU1hcFdpdGhEbUxpbmVhcigqcGFydGl0aW9uX29wZW5lcl8uZ2V0KCksIG5hbWUsIHRpbWVvdXRfbXMsIHBhdGgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICAvLyBTZXQgYSBwcm9wZXJ0eSBzbyB3ZSByZW1lbWJlciB0aGlzIGlzIG1hcHBlZC4KICAgICBhdXRvIHByb3BfbmFtZSA9IEdldFN0YXR1c1Byb3BlcnR5TmFtZShuYW1lKTsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KHByb3BfbmFtZSwgKnBhdGgpKSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZmllbWFwL2luY2x1ZGUvbGliZmllbWFwL2ZpZW1hcF9zdGF0dXMuaCBiL2ZzX21nci9saWJmaWVtYXAvaW5jbHVkZS9saWJmaWVtYXAvZmllbWFwX3N0YXR1cy5oCmluZGV4IGQ3YjJjZjEuLjEzNjViYTQgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmaWVtYXAvaW5jbHVkZS9saWJmaWVtYXAvZmllbWFwX3N0YXR1cy5oCisrKyBiL2ZzX21nci9saWJmaWVtYXAvaW5jbHVkZS9saWJmaWVtYXAvZmllbWFwX3N0YXR1cy5oCkBAIC01Niw4ICs1Niw3IEBACiAgICAgLy8gRm9yIGxvZ2dpbmcgYW5kIGRlYnVnZ2luZyBvbmx5LgogICAgIHN0ZDo6c3RyaW5nIHN0cmluZygpIGNvbnN0OwogCi0gIHByb3RlY3RlZDoKLSAgICBGaWVtYXBTdGF0dXMoRXJyb3JDb2RlIGNvZGUpIDogZXJyb3JfY29kZV8oY29kZSkge30KKyAgICBleHBsaWNpdCBGaWVtYXBTdGF0dXMoRXJyb3JDb2RlIGNvZGUpIDogZXJyb3JfY29kZV8oY29kZSkge30KIAogICBwcml2YXRlOgogICAgIEVycm9yQ29kZSBlcnJvcl9jb2RlXzsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmaWVtYXAvbWV0YWRhdGEuY3BwIGIvZnNfbWdyL2xpYmZpZW1hcC9tZXRhZGF0YS5jcHAKaW5kZXggMjJiOGFmYi4uMGE1NmY2YSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmZpZW1hcC9tZXRhZGF0YS5jcHAKKysrIGIvZnNfbWdyL2xpYmZpZW1hcC9tZXRhZGF0YS5jcHAKQEAgLTExMSwxMyArMTExLDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdW5pcXVlX2ZkIGZkKG9wZW4obWV0YWRhdGFfZmlsZS5jX3N0cigpLCBPX0NSRUFUIHwgT19SRFdSIHwgT19UUlVOQyB8IE9fQ0xPRVhFQyB8IE9fQklOQVJZIHwgT19TWU5DLCAwNjQ0KSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJvcGVuIGZhaWxlZDogIiA8PCBtZXRhZGF0YV9maWxlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFXcml0ZVRvSW1hZ2VGaWxlKGZkLCAqZXhwb3J0ZWQuZ2V0KCkpKSB7CisgICAgaWYgKCFXcml0ZVRvSW1hZ2VGaWxlKG1ldGFkYXRhX2ZpbGUsICpleHBvcnRlZC5nZXQoKSkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHNhdmUgbmV3IG1ldGFkYXRhIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc19hdmIvYXZiX29wcy5jcHAgYi9mc19tZ3IvbGliZnNfYXZiL2F2Yl9vcHMuY3BwCmluZGV4IGExMTliZmMuLmNjMTk3NzYgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmc19hdmIvYXZiX29wcy5jcHAKKysrIGIvZnNfbWdyL2xpYmZzX2F2Yi9hdmJfb3BzLmNwcApAQCAtMTA4LDggKzEwOCw4IEBACiAvLyBDb252ZXJ0cyBhIHBhcnRpdGlvbiBuYW1lICh3aXRoIGFiX3N1ZmZpeCkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbW91bnQgcG9pbnQuCiAvLyBlLmcuLCAic3lzdGVtX2EiID0+ICIvc3lzdGVtIiwKIC8vIGUuZy4sICJ2ZW5kb3JfYSIgPT4gIi92ZW5kb3IiLAotc3RhdGljIHN0ZDo6c3RyaW5nIERlcml2ZU1vdW50UG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lKSB7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgYWJfc3VmZml4ID0gZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpOworc3RhdGljIHN0ZDo6c3RyaW5nIERlcml2ZU1vdW50UG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFiX3N1ZmZpeCkgewogICAgIHN0ZDo6c3RyaW5nIG1vdW50X3BvaW50KHBhcnRpdGlvbl9uYW1lKTsKICAgICBhdXRvIGZvdW5kID0gcGFydGl0aW9uX25hbWUucmZpbmQoYWJfc3VmZml4KTsKICAgICBpZiAoZm91bmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKQEAgLTExOSw3ICsxMTksNyBAQAogICAgIHJldHVybiAiLyIgKyBtb3VudF9wb2ludDsKIH0KIAotRnNNYW5hZ2VyQXZiT3BzOjpGc01hbmFnZXJBdmJPcHMoKSB7CitGc01hbmFnZXJBdmJPcHM6OkZzTWFuYWdlckF2Yk9wcyhjb25zdCBzdGQ6OnN0cmluZyYgc2xvdF9zdWZmaXgpIHsKICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcHJvdmlkZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgcmVhZF9mcm9tX3BhcnRpdGlvbigpCiAgICAgLy8gb3BlcmF0aW9uIHNpbmNlIHRoYXQncyBhbGwgd2hhdCBpcyBiZWluZyB1c2VkIGJ5IHRoZSBhdmJfc2xvdF92ZXJpZnkoKS4KICAgICAvLyBPdGhlciBJL08gb3BlcmF0aW9ucyBhcmUgb25seSByZXF1aXJlZCBpbiBib290bG9hZGVyIGJ1dCBub3QgaW4KQEAgLTEzNSw2ICsxMzUsMTEgQEAKIAogICAgIC8vIFNldHMgdXNlcl9kYXRhIGZvciBHZXRJbnN0YW5jZUZyb21BdmJPcHMoKSB0byBjb252ZXJ0IGl0IGJhY2sgdG8gRnNNYW5hZ2VyQXZiT3BzLgogICAgIGF2Yl9vcHNfLnVzZXJfZGF0YSA9IHRoaXM7CisKKyAgICBzbG90X3N1ZmZpeF8gPSBzbG90X3N1ZmZpeDsKKyAgICBpZiAoc2xvdF9zdWZmaXhfLmVtcHR5KCkpIHsKKyAgICAgICAgc2xvdF9zdWZmaXhfID0gZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpOworICAgIH0KIH0KIAogLy8gR2l2ZW4gYSBwYXJ0aXRpb24gbmFtZSAod2l0aCBhYl9zdWZmaXgpLCBlLmcuLCBzeXN0ZW1fYSwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZwpAQCAtMTQ5LDcgKzE1NCw3IEBACiAgICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKLSAgICBjb25zdCBhdXRvIG1vdW50X3BvaW50ID0gRGVyaXZlTW91bnRQb2ludChwYXJ0aXRpb25fbmFtZSk7CisgICAgY29uc3QgYXV0byBtb3VudF9wb2ludCA9IERlcml2ZU1vdW50UG9pbnQocGFydGl0aW9uX25hbWUsIHNsb3Rfc3VmZml4Xyk7CiAgICAgaWYgKG1vdW50X3BvaW50LmVtcHR5KCkpIHJldHVybiAiIjsKIAogICAgIGF1dG8gZnN0YWJfZW50cnkgPSBHZXRFbnRyeUZvck1vdW50UG9pbnQoJmZzdGFiXywgbW91bnRfcG9pbnQpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzX2F2Yi9hdmJfb3BzLmggYi9mc19tZ3IvbGliZnNfYXZiL2F2Yl9vcHMuaAppbmRleCAxMjY4NmE2Li43MDkwOTFlIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZnNfYXZiL2F2Yl9vcHMuaAorKysgYi9mc19tZ3IvbGliZnNfYXZiL2F2Yl9vcHMuaApAQCAtNDgsNyArNDgsNyBAQAogLy8KIGNsYXNzIEZzTWFuYWdlckF2Yk9wcyB7CiAgIHB1YmxpYzoKLSAgICBGc01hbmFnZXJBdmJPcHMoKTsKKyAgICBleHBsaWNpdCBGc01hbmFnZXJBdmJPcHMoY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3Rfc3VmZml4ID0ge30pOwogCiAgICAgc3RhdGljIEZzTWFuYWdlckF2Yk9wcyogR2V0SW5zdGFuY2VGcm9tQXZiT3BzKEF2Yk9wcyogb3BzKSB7CiAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZzTWFuYWdlckF2Yk9wcyo+KG9wcy0+dXNlcl9kYXRhKTsKQEAgLTY2LDYgKzY2LDcgQEAKICAgICBzdGQ6OnN0cmluZyBHZXRQYXJ0aXRpb25QYXRoKGNvbnN0IGNoYXIqIHBhcnRpdGlvbl9uYW1lKTsKICAgICBBdmJPcHMgYXZiX29wc187CiAgICAgRnN0YWIgZnN0YWJfOworICAgIHN0ZDo6c3RyaW5nIHNsb3Rfc3VmZml4XzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBmc19tZ3IKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc19hdmIvZnNfYXZiLmNwcCBiL2ZzX21nci9saWJmc19hdmIvZnNfYXZiLmNwcAppbmRleCBhMjg4ODc2Li5iZTQ4ZGU2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZnNfYXZiL2ZzX2F2Yi5jcHAKKysrIGIvZnNfbWdyL2xpYmZzX2F2Yi9mc19hdmIuY3BwCkBAIC0xODIsNiArMTgyLDExIEBACiAKIC8vIGNsYXNzIEF2YkhhbmRsZQogLy8gLS0tLS0tLS0tLS0tLS0tCitBdmJIYW5kbGU6OkF2YkhhbmRsZSgpIDogc3RhdHVzXyhBdmJIYW5kbGVTdGF0dXM6OmtVbmluaXRpYWxpemVkKSB7CisgICAgc2xvdF9zdWZmaXhfID0gZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpOworICAgIG90aGVyX3Nsb3Rfc3VmZml4XyA9IGZzX21ncl9nZXRfb3RoZXJfc2xvdF9zdWZmaXgoKTsKK30KKwogQXZiVW5pcXVlUHRyIEF2YkhhbmRsZTo6TG9hZEFuZFZlcmlmeVZibWV0YSgKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgYWJfc3VmZml4LAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWJfb3RoZXJfc3VmZml4LCBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfcHVibGljX2tleV9wYXRoLApAQCAtMTk0LDYgKzE5OSw5IEBACiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAorICAgIGF2Yl9oYW5kbGUtPnNsb3Rfc3VmZml4XyA9IGFiX3N1ZmZpeDsKKyAgICBhdmJfaGFuZGxlLT5vdGhlcl9zbG90X3N1ZmZpeF8gPSBhYl9vdGhlcl9zdWZmaXg7CisKICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZF9rZXlfYmxvYjsKICAgICBpZiAoIWV4cGVjdGVkX3B1YmxpY19rZXlfcGF0aC5lbXB0eSgpKSB7CiAgICAgICAgIGlmIChhY2Nlc3MoZXhwZWN0ZWRfcHVibGljX2tleV9wYXRoLmNfc3RyKCksIEZfT0spICE9IDApIHsKQEAgLTI4MCwxNCArMjg4LDgyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1BdmJVbmlxdWVQdHIgQXZiSGFuZGxlOjpMb2FkQW5kVmVyaWZ5VmJtZXRhKGNvbnN0IEZzdGFiRW50cnkmIGZzdGFiX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHByZWxvYWRfYXZiX2tleV9ibG9icykgeworYm9vbCBJc1B1YmxpY0tleU1hdGNoaW5nKGNvbnN0IEZzdGFiRW50cnkmIGZzdGFiX2VudHJ5LCBjb25zdCBzdGQ6OnN0cmluZyYgcHVibGljX2tleV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzKSB7CiAgICAgLy8gQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciBwdWJsaWMga2V5IG1hdGNoaW5nLgogICAgIGlmIChwcmVsb2FkX2F2Yl9rZXlfYmxvYnMuZW1wdHkoKSAmJiBmc3RhYl9lbnRyeS5hdmJfa2V5cy5lbXB0eSgpKSB7CiAgICAgICAgIExFUlJPUiA8PCAiYXZiX2tleXM9L3BhdGgvdG8va2V5KHMpIGlzIG1pc3NpbmcgZm9yICIgPDwgZnN0YWJfZW50cnkubW91bnRfcG9pbnQ7Ci0gICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gRXhwZWN0ZWQga2V5IHNob3VsZG4ndCBiZSBlbXB0eS4KKyAgICBpZiAocHVibGljX2tleV9kYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgTEVSUk9SIDw8ICJwdWJsaWMga2V5IGRhdGEgc2hvdWxkbid0IGJlIGVtcHR5IGZvciAiIDw8IGZzdGFiX2VudHJ5Lm1vdW50X3BvaW50OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUGVyZm9ybXMga2V5IG1hdGNoaW5nIGZvciBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMgZmlyc3QsIGlmIGl0IGlzIHByZXNlbnQuCisgICAgaWYgKCFwcmVsb2FkX2F2Yl9rZXlfYmxvYnMuZW1wdHkoKSkgeworICAgICAgICBpZiAoc3RkOjpmaW5kKHByZWxvYWRfYXZiX2tleV9ibG9icy5iZWdpbigpLCBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljX2tleV9kYXRhKSAhPSBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUGVyZm9ybXMga2V5IG1hdGNoaW5nIGZvciBmc3RhYl9lbnRyeS5hdmJfa2V5cyBpZiBuZWNlc3NhcnkuCisgICAgLy8gTm90ZSB0aGF0IGl0IGlzIGludGVudGlvbmFsIHRvIG1hdGNoIGJvdGggcHJlbG9hZF9hdmJfa2V5X2Jsb2JzIGFuZCBmc3RhYl9lbnRyeS5hdmJfa2V5cy4KKyAgICAvLyBTb21lIGtleXMgbWlnaHQgb25seSBiZSBhdmFpbGFibGUgYmVmb3JlIGluaXQgY2hyb290cyBpbnRvIC9zeXN0ZW0sIGUuZy4sIC9hdmIva2V5MQorICAgIC8vIGluIHRoZSBmaXJzdC1zdGFnZSByYW1kaXNrLCB3aGlsZSBvdGhlciBrZXlzIG1pZ2h0IG9ubHkgYmUgYXZhaWxhYmxlIGFmdGVyIHRoZSBjaHJvb3QsCisgICAgLy8gZS5nLiwgL3N5c3RlbS9ldGMvYXZiL2tleTIuCisgICAgLy8gZnN0YWJfZW50cnkuYXZiX2tleXMgbWlnaHQgYmUgZWl0aGVyIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbXVsdGlwbGUga2V5cywKKyAgICAvLyBvciBhIHN0cmluZyBpbmRpY2F0aW5nIG11bHRpcGxlIGtleXMgc2VwYXJhdGVkIGJ5ICc6Jy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsb3dlZF9hdmJfa2V5czsKKyAgICBhdXRvIGxpc3RfYXZiX2tleXNfaW5fZGlyID0gTGlzdEZpbGVzKGZzdGFiX2VudHJ5LmF2Yl9rZXlzKTsKKyAgICBpZiAobGlzdF9hdmJfa2V5c19pbl9kaXIub2soKSkgeworICAgICAgICBzdGQ6OnNvcnQobGlzdF9hdmJfa2V5c19pbl9kaXItPmJlZ2luKCksIGxpc3RfYXZiX2tleXNfaW5fZGlyLT5lbmQoKSk7CisgICAgICAgIGFsbG93ZWRfYXZiX2tleXMgPSAqbGlzdF9hdmJfa2V5c19pbl9kaXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWxsb3dlZF9hdmJfa2V5cyA9IFNwbGl0KGZzdGFiX2VudHJ5LmF2Yl9rZXlzLCAiOiIpOworICAgIH0KKyAgICByZXR1cm4gVmFsaWRhdGVQdWJsaWNLZXlCbG9iKHB1YmxpY19rZXlfZGF0YSwgYWxsb3dlZF9hdmJfa2V5cyk7Cit9CisKK2Jvb2wgSXNIYXNodHJlZURlc2NyaXB0b3JSb290RGlnZXN0TWF0Y2hpbmcoY29uc3QgRnN0YWJFbnRyeSYgZnN0YWJfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFZCTWV0YURhdGE+JiB2Ym1ldGFfaW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWJfc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWJfb3RoZXJfc3VmZml4KSB7CisgICAgLy8gUmVhZCBleHBlY3RlZCB2YWx1ZSBvZiBoYXNodHJlZSBkZXNjcmlwdG9yIHJvb3QgZGlnZXN0IGZyb20gZnN0YWJfZW50cnkuCisgICAgc3RkOjpzdHJpbmcgcm9vdF9kaWdlc3RfZXhwZWN0ZWQ7CisgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGZzdGFiX2VudHJ5LmF2Yl9oYXNodHJlZV9kaWdlc3QsICZyb290X2RpZ2VzdF9leHBlY3RlZCkpIHsKKyAgICAgICAgTEVSUk9SIDw8ICJGYWlsZWQgdG8gbG9hZCBleHBlY3RlZCByb290IGRpZ2VzdCBmb3IgIiA8PCBmc3RhYl9lbnRyeS5tb3VudF9wb2ludDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlYWQgYWN0dWFsIGhhc2h0cmVlIGRlc2NyaXB0b3IgZnJvbSB2Ym1ldGEgaW1hZ2UuCisgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uX25hbWUgPSBEZXJpdmVBdmJQYXJ0aXRpb25OYW1lKGZzdGFiX2VudHJ5LCBhYl9zdWZmaXgsIGFiX290aGVyX3N1ZmZpeCk7CisgICAgaWYgKHBhcnRpdGlvbl9uYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgTEVSUk9SIDw8ICJGYWlsZWQgdG8gZmluZCBwYXJ0aXRpb24gbmFtZSBmb3IgIiA8PCBmc3RhYl9lbnRyeS5tb3VudF9wb2ludDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RnNBdmJIYXNodHJlZURlc2NyaXB0b3I+IGhhc2h0cmVlX2Rlc2NyaXB0b3IgPQorICAgICAgICAgICAgYW5kcm9pZDo6ZnNfbWdyOjpHZXRIYXNodHJlZURlc2NyaXB0b3IocGFydGl0aW9uX25hbWUsIHZibWV0YV9pbWFnZXMpOworICAgIGlmICghaGFzaHRyZWVfZGVzY3JpcHRvcikgeworICAgICAgICBMRVJST1IgPDwgIk5vdCBmb3VuZCBoYXNodHJlZSBkZXNjcmlwdG9yIGZvciAiIDw8IGZzdGFiX2VudHJ5Lm1vdW50X3BvaW50OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUGVyZm9ybXMgaGFzaHRyZWUgZGVzY3JpcHRvciByb290IGRpZ2VzdCBtYXRjaGluZy4KKyAgICBpZiAoaGFzaHRyZWVfZGVzY3JpcHRvci0+cm9vdF9kaWdlc3QgIT0gcm9vdF9kaWdlc3RfZXhwZWN0ZWQpIHsKKyAgICAgICAgTEVSUk9SIDw8ICJyb290IGRpZ2VzdCAoIiA8PCBoYXNodHJlZV9kZXNjcmlwdG9yLT5yb290X2RpZ2VzdAorICAgICAgICAgICAgICAgPDwgIikgaXMgZGlmZmVyZW50IGZyb20gZXhwZWN0ZWQgdmFsdWUgKCIgPDwgcm9vdF9kaWdlc3RfZXhwZWN0ZWQgPDwgIikiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0F2YlVuaXF1ZVB0ciBBdmJIYW5kbGU6OkxvYWRBbmRWZXJpZnlWYm1ldGEoY29uc3QgRnN0YWJFbnRyeSYgZnN0YWJfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzKSB7CiAgICAgLy8gQmluZHMgYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yIGFuZCByb2xsYmFja19wcm90ZWN0aW9uIHRvIGRldmljZSB1bmxvY2sgc3RhdGUuCiAgICAgYm9vbCBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgPSBJc0F2YlBlcm1pc3NpdmUoKTsKICAgICBib29sIHJvbGxiYWNrX3Byb3RlY3Rpb24gPSAhYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yOwpAQCAtMzI1LDQwICs0MDEsMjQgQEAKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAotICAgIGJvb2wgcHVibGljX2tleV9tYXRjaCA9IGZhbHNlOwotICAgIC8vIFBlcmZvcm1zIGtleSBtYXRjaGluZyBmb3IgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzIGZpcnN0LCBpZiBpdCBpcyBwcmVzZW50LgotICAgIGlmICghcHVibGljX2tleV9kYXRhLmVtcHR5KCkgJiYgIXByZWxvYWRfYXZiX2tleV9ibG9icy5lbXB0eSgpKSB7Ci0gICAgICAgIGlmIChzdGQ6OmZpbmQocHJlbG9hZF9hdmJfa2V5X2Jsb2JzLmJlZ2luKCksIHByZWxvYWRfYXZiX2tleV9ibG9icy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfa2V5X2RhdGEpICE9IHByZWxvYWRfYXZiX2tleV9ibG9icy5lbmQoKSkgewotICAgICAgICAgICAgcHVibGljX2tleV9tYXRjaCA9IHRydWU7CisgICAgLy8gVmVyaWZ5IHZibWV0YSBpbWFnZSBjaGVja2luZyBieSBlaXRoZXIgcHVibGljIGtleSBvciBoYXNodHJlZSBkZXNjcmlwdG9yIHJvb3QgZGlnZXN0LgorICAgIGlmICghcHJlbG9hZF9hdmJfa2V5X2Jsb2JzLmVtcHR5KCkgfHwgIWZzdGFiX2VudHJ5LmF2Yl9rZXlzLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFJc1B1YmxpY0tleU1hdGNoaW5nKGZzdGFiX2VudHJ5LCBwdWJsaWNfa2V5X2RhdGEsIHByZWxvYWRfYXZiX2tleV9ibG9icykpIHsKKyAgICAgICAgICAgIGF2Yl9oYW5kbGUtPnN0YXR1c18gPSBBdmJIYW5kbGVTdGF0dXM6OmtWZXJpZmljYXRpb25FcnJvcjsKKyAgICAgICAgICAgIExXQVJOSU5HIDw8ICJGb3VuZCB1bmtub3duIHB1YmxpYyBrZXkgdXNlZCB0byBzaWduICIgPDwgZnN0YWJfZW50cnkubW91bnRfcG9pbnQ7CisgICAgICAgICAgICBpZiAoIWFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcikgeworICAgICAgICAgICAgICAgIExFUlJPUiA8PCAiVW5rbm93biBwdWJsaWMga2V5IGlzIG5vdCBhbGxvd2VkIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICAvLyBQZXJmb3JtcyBrZXkgbWF0Y2hpbmcgZm9yIGZzdGFiX2VudHJ5LmF2Yl9rZXlzIGlmIG5lY2Vzc2FyeS4KLSAgICAvLyBOb3RlIHRoYXQgaXQgaXMgaW50ZW50aW9uYWwgdG8gbWF0Y2ggYm90aCBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMgYW5kIGZzdGFiX2VudHJ5LmF2Yl9rZXlzLgotICAgIC8vIFNvbWUga2V5cyBtaWdodCBvbmx5IGJlIGF2YWlsYmxlIGJlZm9yZSBpbml0IGNocm9vdHMgaW50byAvc3lzdGVtLCBlLmcuLCAvYXZiL2tleTEKLSAgICAvLyBpbiB0aGUgZmlyc3Qtc3RhZ2UgcmFtZGlzaywgd2hpbGUgb3RoZXIga2V5cyBtaWdodCBvbmx5IGJlIGF2YWlsYWJsZSBhZnRlciB0aGUgY2hyb290LAotICAgIC8vIGUuZy4sIC9zeXN0ZW0vZXRjL2F2Yi9rZXkyLgotICAgIGlmICghcHVibGljX2tleV9kYXRhLmVtcHR5KCkgJiYgIXB1YmxpY19rZXlfbWF0Y2gpIHsKLSAgICAgICAgLy8gZnN0YWJfZW50cnkuYXZiX2tleXMgbWlnaHQgYmUgZWl0aGVyIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbXVsdGlwbGUga2V5cywKLSAgICAgICAgLy8gb3IgYSBzdHJpbmcgaW5kaWNhdGluZyBtdWx0aXBsZSBrZXlzIHNlcGFyYXRlZCBieSAnOicuCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGxvd2VkX2F2Yl9rZXlzOwotICAgICAgICBhdXRvIGxpc3RfYXZiX2tleXNfaW5fZGlyID0gTGlzdEZpbGVzKGZzdGFiX2VudHJ5LmF2Yl9rZXlzKTsKLSAgICAgICAgaWYgKGxpc3RfYXZiX2tleXNfaW5fZGlyLm9rKCkpIHsKLSAgICAgICAgICAgIHN0ZDo6c29ydChsaXN0X2F2Yl9rZXlzX2luX2Rpci0+YmVnaW4oKSwgbGlzdF9hdmJfa2V5c19pbl9kaXItPmVuZCgpKTsKLSAgICAgICAgICAgIGFsbG93ZWRfYXZiX2tleXMgPSAqbGlzdF9hdmJfa2V5c19pbl9kaXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhbGxvd2VkX2F2Yl9rZXlzID0gU3BsaXQoZnN0YWJfZW50cnkuYXZiX2tleXMsICI6Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFZhbGlkYXRlUHVibGljS2V5QmxvYihwdWJsaWNfa2V5X2RhdGEsIGFsbG93ZWRfYXZiX2tleXMpKSB7Ci0gICAgICAgICAgICBwdWJsaWNfa2V5X21hdGNoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghcHVibGljX2tleV9tYXRjaCkgeworICAgIH0gZWxzZSBpZiAoIUlzSGFzaHRyZWVEZXNjcmlwdG9yUm9vdERpZ2VzdE1hdGNoaW5nKGZzdGFiX2VudHJ5LCBhdmJfaGFuZGxlLT52Ym1ldGFfaW1hZ2VzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmJfaGFuZGxlLT5zbG90X3N1ZmZpeF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZiX2hhbmRsZS0+b3RoZXJfc2xvdF9zdWZmaXhfKSkgewogICAgICAgICBhdmJfaGFuZGxlLT5zdGF0dXNfID0gQXZiSGFuZGxlU3RhdHVzOjprVmVyaWZpY2F0aW9uRXJyb3I7Ci0gICAgICAgIExXQVJOSU5HIDw8ICJGb3VuZCB1bmtub3duIHB1YmxpYyBrZXkgdXNlZCB0byBzaWduICIgPDwgZnN0YWJfZW50cnkubW91bnRfcG9pbnQ7CisgICAgICAgIExXQVJOSU5HIDw8ICJGb3VuZCB1bmtub3duIGhhc2h0cmVlIGRlc2NyaXB0b3Igcm9vdCBkaWdlc3QgdXNlZCBvbiAiCisgICAgICAgICAgICAgICAgIDw8IGZzdGFiX2VudHJ5Lm1vdW50X3BvaW50OwogICAgICAgICBpZiAoIWFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvcikgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJVbmtub3duIHB1YmxpYyBrZXkgaXMgbm90IGFsbG93ZWQiOworICAgICAgICAgICAgTEVSUk9SIDw8ICJWZXJpZmljYXRpb24gYmFzZWQgb24gcm9vdCBkaWdlc3QgZmFpbGVkLiBWYm1ldGEgaW1hZ2UgaXMgbm90IGFsbG93ZWQuIjsKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgICAgICB9CiAgICAgfQpAQCAtMzczLDkgKzQzMywxNCBAQAogICAgIHJldHVybiBhdmJfaGFuZGxlOwogfQogCi1BdmJVbmlxdWVQdHIgQXZiSGFuZGxlOjpMb2FkQW5kVmVyaWZ5VmJtZXRhKCkgeworQXZiVW5pcXVlUHRyIEF2YkhhbmRsZTo6TG9hZEFuZFZlcmlmeVZibWV0YShjb25zdCBzdGQ6OnN0cmluZyYgc2xvdF9zdWZmaXgpIHsKICAgICAvLyBMb2FkcyBpbmxpbmUgdmJtZXRhIGltYWdlcywgc3RhcnRpbmcgZnJvbSAvdmJtZXRhLgotICAgIHJldHVybiBMb2FkQW5kVmVyaWZ5VmJtZXRhKCJ2Ym1ldGEiLCBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCksIGZzX21ncl9nZXRfb3RoZXJfc2xvdF9zdWZmaXgoKSwKKyAgICBhdXRvIHN1ZmZpeCA9IHNsb3Rfc3VmZml4OworICAgIGlmIChzdWZmaXguZW1wdHkoKSkgeworICAgICAgICBzdWZmaXggPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgfQorICAgIGF1dG8gb3RoZXJfc3VmZml4ID0gYW5kcm9pZDo6ZnNfbWdyOjpPdGhlclNsb3RTdWZmaXgoc3VmZml4KTsKKyAgICByZXR1cm4gTG9hZEFuZFZlcmlmeVZibWV0YSgidmJtZXRhIiwgc3VmZml4LCBvdGhlcl9zdWZmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30gLyogZXhwZWN0ZWRfcHVibGljX2tleSwgYWxyZWFkeSBjaGVja2VkIGJ5IGJvb3Rsb2FkZXIgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaEFsZ29yaXRobTo6a1NIQTI1NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0F2YlBlcm1pc3NpdmUoKSwgLyogYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yICovCkBAIC0zOTksNyArNDY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVZCX1NMT1RfVkVSSUZZX0ZMQUdTX0FMTE9XX1ZFUklGSUNBVElPTl9FUlJPUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVkJfU0xPVF9WRVJJRllfRkxBR1NfTk9ORTsKICAgICBBdmJTbG90VmVyaWZ5UmVzdWx0IHZlcmlmeV9yZXN1bHQgPQotICAgICAgICAgICAgYXZiX29wcy5BdmJTbG90VmVyaWZ5KGZzX21ncl9nZXRfc2xvdF9zdWZmaXgoKSwgZmxhZ3MsICZhdmJfaGFuZGxlLT52Ym1ldGFfaW1hZ2VzXyk7CisgICAgICAgICAgICBhdmJfb3BzLkF2YlNsb3RWZXJpZnkoYXZiX2hhbmRsZS0+c2xvdF9zdWZmaXhfLCBmbGFncywgJmF2Yl9oYW5kbGUtPnZibWV0YV9pbWFnZXNfKTsKIAogICAgIC8vIE9ubHkgYWxsb3cgdGhlIGZvbGxvd2luZyB2ZXJpZnkgcmVzdWx0czoKICAgICAvLyAgIC0gQVZCX1NMT1RfVkVSSUZZX1JFU1VMVF9PSy4KQEAgLTQ5Miw3ICs1NTcsNyBAQAogICAgIH0KIAogICAgIGlmICghTG9hZEF2Ykhhc2h0cmVlVG9FbmFibGVWZXJpdHkoZnN0YWJfZW50cnksIHdhaXRfZm9yX3Zlcml0eV9kZXYsIHZibWV0YV9pbWFnZXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpLCBmc19tZ3JfZ2V0X290aGVyX3Nsb3Rfc3VmZml4KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90X3N1ZmZpeF8sIG90aGVyX3Nsb3Rfc3VmZml4XykpIHsKICAgICAgICAgcmV0dXJuIEF2Ykhhc2h0cmVlUmVzdWx0OjprRmFpbDsKICAgICB9CiAKQEAgLTUyNiw4ICs1OTEsOCBAQAogICAgIGlmICh2Ym1ldGFfaW1hZ2VzXy5zaXplKCkgPCAxKSB7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9Ci0gICAgc3RkOjpzdHJpbmcgYXZiX3BhcnRpdGlvbl9uYW1lID0gRGVyaXZlQXZiUGFydGl0aW9uTmFtZShmc3RhYl9lbnRyeSwgZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfbWdyX2dldF9vdGhlcl9zbG90X3N1ZmZpeCgpKTsKKyAgICBzdGQ6OnN0cmluZyBhdmJfcGFydGl0aW9uX25hbWUgPQorICAgICAgICAgICAgRGVyaXZlQXZiUGFydGl0aW9uTmFtZShmc3RhYl9lbnRyeSwgc2xvdF9zdWZmaXhfLCBvdGhlcl9zbG90X3N1ZmZpeF8pOwogICAgIGF1dG8gYXZiX3Byb3BfbmFtZSA9ICJjb20uYW5kcm9pZC5idWlsZC4iICsgYXZiX3BhcnRpdGlvbl9uYW1lICsgIi5zZWN1cml0eV9wYXRjaCI7CiAgICAgcmV0dXJuIEdldEF2YlByb3BlcnR5RGVzY3JpcHRvcihhdmJfcHJvcF9uYW1lLCB2Ym1ldGFfaW1hZ2VzXyk7CiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZnNfYXZiL2luY2x1ZGUvZnNfYXZiL2ZzX2F2Yi5oIGIvZnNfbWdyL2xpYmZzX2F2Yi9pbmNsdWRlL2ZzX2F2Yi9mc19hdmIuaAppbmRleCA0NzAyZTY4Li45MjRhYjI0IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZnNfYXZiL2luY2x1ZGUvZnNfYXZiL2ZzX2F2Yi5oCisrKyBiL2ZzX21nci9saWJmc19hdmIvaW5jbHVkZS9mc19hdmIvZnNfYXZiLmgKQEAgLTgzLDggKzgzLDggQEAKICAgICAvLyAgICAgaXMgdmVyaWZpZWQgYW5kIGNhbiBiZSB0cnVzdGVkLgogICAgIC8vCiAgICAgLy8gVE9ETyhib3dnb3RzYWkpOiByZW1vdmUgT3BlbigpIGFuZCBzd2l0Y2ggdG8gTG9hZEFuZFZlcmlmeVZibWV0YSgpLgotICAgIHN0YXRpYyBBdmJVbmlxdWVQdHIgT3BlbigpOyAgICAgICAgICAgICAgICAgLy8gbG9hZHMgaW5saW5lIHZibWV0YSwgdmlhIGxpYmF2Yi4KLSAgICBzdGF0aWMgQXZiVW5pcXVlUHRyIExvYWRBbmRWZXJpZnlWYm1ldGEoKTsgIC8vIGxvYWRzIGlubGluZSB2Ym1ldGEuCisgICAgc3RhdGljIEF2YlVuaXF1ZVB0ciBPcGVuKCk7ICAvLyBsb2FkcyBpbmxpbmUgdmJtZXRhLCB2aWEgbGliYXZiLgorICAgIHN0YXRpYyBBdmJVbmlxdWVQdHIgTG9hZEFuZFZlcmlmeVZibWV0YShjb25zdCBzdGQ6OnN0cmluZyYgc2xvdF9zdWZmaXggPSB7fSk7CiAKICAgICAvLyBUaGUgY2FsbGVyIGNhbiBzcGVjaWZ5IG9wdGlvbmFsIHByZWxvYWRfYXZiX2tleV9ibG9icyBmb3IgcHVibGljIGtleSBtYXRjaGluZy4KICAgICAvLyBUaGlzIGlzIG1vc3RseSBmb3IgaW5pdCB0byBwcmVsb2FkIEFWQiBrZXlzIGJlZm9yZSBjaHJvb3QgaW50byAvc3lzdGVtLgpAQCAtMTM3LDEyICsxMzcsMTQgQEAKICAgICBBdmJIYW5kbGUmIG9wZXJhdG9yPShBdmJIYW5kbGUmJikgbm9leGNlcHQgPSBkZWxldGU7ICAvLyBubyBtb3ZlIGFzc2lnbm1lbnQKIAogICBwcml2YXRlOgotICAgIEF2YkhhbmRsZSgpIDogc3RhdHVzXyhBdmJIYW5kbGVTdGF0dXM6OmtVbmluaXRpYWxpemVkKSB7fQorICAgIEF2YkhhbmRsZSgpOwogCiAgICAgc3RkOjp2ZWN0b3I8VkJNZXRhRGF0YT4gdmJtZXRhX2ltYWdlc187CiAgICAgVkJNZXRhSW5mbyB2Ym1ldGFfaW5mb187ICAvLyBBIHN1bW1hcnkgaW5mbyBmb3IgdmJtZXRhX2ltYWdlc18uCiAgICAgQXZiSGFuZGxlU3RhdHVzIHN0YXR1c187CiAgICAgc3RkOjpzdHJpbmcgYXZiX3ZlcnNpb25fOworICAgIHN0ZDo6c3RyaW5nIHNsb3Rfc3VmZml4XzsKKyAgICBzdGQ6OnN0cmluZyBvdGhlcl9zbG90X3N1ZmZpeF87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2F2Yl91dGlsX3Rlc3QuY3BwIGIvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9hdmJfdXRpbF90ZXN0LmNwcAppbmRleCAyZTM0OTIwLi5lZTgzY2RhIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2F2Yl91dGlsX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJmc19hdmIvdGVzdHMvYXZiX3V0aWxfdGVzdC5jcHAKQEAgLTY1NSwxMCArNjU1LDEyIEBACiAgICAgICAgICAgICAiICAgICAgUGFydGl0aW9uIE5hbWU6ICAgICAgICAgIGJvb3RcbiIKICAgICAgICAgICAgICIgICAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogMVxuIgogICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICBjZGJiNzcxNzdmNzMxOTIwYmJlMGEwZjk0Zjg0ZDkwMzhhZTA2MTdkXG4iCisgICAgICAgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgIDBcbiIKICAgICAgICAgICAgICIgICAgQ2hhaW4gUGFydGl0aW9uIGRlc2NyaXB0b3I6XG4iCiAgICAgICAgICAgICAiICAgICAgUGFydGl0aW9uIE5hbWU6ICAgICAgICAgIHN5c3RlbVxuIgogICAgICAgICAgICAgIiAgICAgIFJvbGxiYWNrIEluZGV4IExvY2F0aW9uOiAyXG4iCi0gICAgICAgICAgICAiICAgICAgUHVibGljIGtleSAoc2hhMSk6ICAgICAgIDI1OTdjMjE4YWFlNDcwYTEzMGY2MTE2MmZlYWFlNzBhZmQ5N2YwMTFcbiIsCisgICAgICAgICAgICAiICAgICAgUHVibGljIGtleSAoc2hhMSk6ICAgICAgIDI1OTdjMjE4YWFlNDcwYTEzMGY2MTE2MmZlYWFlNzBhZmQ5N2YwMTFcbiIKKyAgICAgICAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgICAgMFxuIiwKICAgICAgICAgICAgIEluZm9JbWFnZSgidmJtZXRhLmltZyIpKTsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChvcGVuKHZibWV0YV9wYXRoLnZhbHVlKCkuY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKQEAgLTg3NiwxMCArODc4LDEyIEBACiAgICAgICAgICAgICAiICAgICAgUGFydGl0aW9uIE5hbWU6ICAgICAgICAgIGJvb3RcbiIKICAgICAgICAgICAgICIgICAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogMVxuIgogICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICBjZGJiNzcxNzdmNzMxOTIwYmJlMGEwZjk0Zjg0ZDkwMzhhZTA2MTdkXG4iCisgICAgICAgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgIDBcbiIKICAgICAgICAgICAgICIgICAgQ2hhaW4gUGFydGl0aW9uIGRlc2NyaXB0b3I6XG4iCiAgICAgICAgICAgICAiICAgICAgUGFydGl0aW9uIE5hbWU6ICAgICAgICAgIHZibWV0YV9zeXN0ZW1cbiIKICAgICAgICAgICAgICIgICAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogMlxuIgotICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iLAorICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iCisgICAgICAgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgIDBcbiIsCiAgICAgICAgICAgICBJbmZvSW1hZ2UoInZibWV0YS5pbWciKSk7CiAKICAgICBib29sIGZhdGFsX2Vycm9yID0gZmFsc2U7CkBAIC05MDksNyArOTEzLDggQEAKICAgICAgICAgICAgICIgICAgQ2hhaW4gUGFydGl0aW9uIGRlc2NyaXB0b3I6XG4iCiAgICAgICAgICAgICAiICAgICAgUGFydGl0aW9uIE5hbWU6ICAgICAgICAgIHN5c3RlbVxuIgogICAgICAgICAgICAgIiAgICAgIFJvbGxiYWNrIEluZGV4IExvY2F0aW9uOiAzXG4iCi0gICAgICAgICAgICAiICAgICAgUHVibGljIGtleSAoc2hhMSk6ICAgICAgIDI1OTdjMjE4YWFlNDcwYTEzMGY2MTE2MmZlYWFlNzBhZmQ5N2YwMTFcbiIsCisgICAgICAgICAgICAiICAgICAgUHVibGljIGtleSAoc2hhMSk6ICAgICAgIDI1OTdjMjE4YWFlNDcwYTEzMGY2MTE2MmZlYWFlNzBhZmQ5N2YwMTFcbiIKKyAgICAgICAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgICAgMFxuIiwKICAgICAgICAgICAgIEluZm9JbWFnZSgidmJtZXRhX3N5c3RlbS5pbWciKSk7CiAKICAgICBjaGFpbmVkX2Rlc2NyaXB0b3JzID0gR2V0Q2hhaW5QYXJ0aXRpb25JbmZvKExvYWRWQk1ldGFEYXRhKCJ2Ym1ldGFfc3lzdGVtLmltZyIpLCAmZmF0YWxfZXJyb3IpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9iYXNpY190ZXN0LmNwcCBiL2ZzX21nci9saWJmc19hdmIvdGVzdHMvYmFzaWNfdGVzdC5jcHAKaW5kZXggMWM0N2MwNy4uZDQ5YWZmYiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9iYXNpY190ZXN0LmNwcAorKysgYi9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2Jhc2ljX3Rlc3QuY3BwCkBAIC0yNjgsMTAgKzI2OCwxMiBAQAogICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgICBib290XG4iCiAgICAgICAgICAgICAiICAgICAgUm9sbGJhY2sgSW5kZXggTG9jYXRpb246IDFcbiIKICAgICAgICAgICAgICIgICAgICBQdWJsaWMga2V5IChzaGExKTogICAgICAgY2RiYjc3MTc3ZjczMTkyMGJiZTBhMGY5NGY4NGQ5MDM4YWUwNjE3ZFxuIgorICAgICAgICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAwXG4iCiAgICAgICAgICAgICAiICAgIENoYWluIFBhcnRpdGlvbiBkZXNjcmlwdG9yOlxuIgogICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgICBzeXN0ZW1cbiIKICAgICAgICAgICAgICIgICAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogMlxuIgotICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iLAorICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iCisgICAgICAgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgIDBcbiIsCiAgICAgICAgICAgICBJbmZvSW1hZ2UoInZibWV0YS5pbWciKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc3RhYi9BbmRyb2lkLmJwIGIvZnNfbWdyL2xpYmZzdGFiL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwMjY5YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJmc3RhYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjIgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiQW5kcm9pZC1BcGFjaGUtMi4wIiwKKyAgICAgICAgInN5c3RlbV9jb3JlX2ZzX21ncl9saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgLy8gRG8gbm90IGV2ZXIgbWFrZSB0aGlzIGEgc2hhcmVkIGxpYnJhcnkgYXMgbG9uZyBhcyBpdCBpcyB2ZW5kb3JfYXZhaWxhYmxlLgorICAgIC8vIEl0IGRvZXMgbm90IGhhdmUgYSBzdGFibGUgaW50ZXJmYWNlLgorICAgIG5hbWU6ICJsaWJmc3RhYiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCisgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbImZzX21ncl9kZWZhdWx0cyJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliZ3NpX2hlYWRlcnMiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiZnN0YWIuY3BwIiwKKyAgICAgICAgImJvb3RfY29uZmlnLmNwcCIsCisgICAgICAgICJzbG90c2VsZWN0LmNwcCIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgdmVuZG9yOiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsKKyAgICAgICAgICAgICAgICAvLyBTa2lwcGluZyBlbnRyaWVzIGluIGZzdGFiIHNob3VsZCBvbmx5IGJlIGRvbmUgaW4gYSBzeXN0ZW0KKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGFzIHRoZSBjb25maWcgZmlsZSBpcyBpbiAvc3lzdGVtX2V4dC4KKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9wIGZyb20gdGhlIHZlbmRvciB2YXJpYW50LgorICAgICAgICAgICAgICAgICItRE5PX1NLSVBfTU9VTlQiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzMSIsCit9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZnN0YWIvYm9vdF9jb25maWcuY3BwIGIvZnNfbWdyL2xpYmZzdGFiL2Jvb3RfY29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjE0OTVlCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmZzdGFiL2Jvb3RfY29uZmlnLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisKKyNpbmNsdWRlICJmc3RhYl9wcml2LmgiCisjaW5jbHVkZSAibG9nZ2luZ19tYWNyb3MuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBHZXRBbmRyb2lkRHREaXIoKSB7CisgICAgLy8gU2V0IG9uY2UgYW5kIHNhdmVzIHRpbWUgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQW5kcm9pZER0RGlyID0gW10geworICAgICAgICBzdGQ6OnN0cmluZyBhbmRyb2lkX2R0X2RpcjsKKyAgICAgICAgaWYgKChHZXRCb290Y29uZmlnKCJhbmRyb2lkYm9vdC5hbmRyb2lkX2R0X2RpciIsICZhbmRyb2lkX2R0X2RpcikgfHwKKyAgICAgICAgICAgICBHZXRLZXJuZWxDbWRsaW5lKCJhbmRyb2lkYm9vdC5hbmRyb2lkX2R0X2RpciIsICZhbmRyb2lkX2R0X2RpcikpICYmCisgICAgICAgICAgICAhYW5kcm9pZF9kdF9kaXIuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSByZXR1cm5lZCBwYXRoIGVuZHMgd2l0aCBhIC8KKyAgICAgICAgICAgIGlmIChhbmRyb2lkX2R0X2Rpci5iYWNrKCkgIT0gJy8nKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9kdF9kaXIucHVzaF9iYWNrKCcvJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHN0YW5kYXJkIHByb2Nmcy1iYXNlZCBwYXRoCisgICAgICAgICAgICBhbmRyb2lkX2R0X2RpciA9ICIvcHJvYy9kZXZpY2UtdHJlZS9maXJtd2FyZS9hbmRyb2lkLyI7CisgICAgICAgIH0KKyAgICAgICAgTElORk8gPDwgIlVzaW5nIEFuZHJvaWQgRFQgZGlyZWN0b3J5ICIgPDwgYW5kcm9pZF9kdF9kaXI7CisgICAgICAgIHJldHVybiBhbmRyb2lkX2R0X2RpcjsKKyAgICB9KCk7CisgICAgcmV0dXJuIGtBbmRyb2lkRHREaXI7Cit9CisKK3ZvaWQgSW1wb3J0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pIHsKKyAgICBmb3IgKHN0ZDo6c3RyaW5nX3ZpZXcgbGluZSA6IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGJvb3Rjb25maWcsICJcbiIpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gZXF1YWxfcG9zID0gbGluZS5maW5kKCc9Jyk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGtleSA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0obGluZS5zdWJzdHIoMCwgZXF1YWxfcG9zKSk7CisgICAgICAgIGlmIChrZXkuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgICAgIGlmIChlcXVhbF9wb3MgIT0gbGluZS5ucG9zKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0obGluZS5zdWJzdHIoZXF1YWxfcG9zICsgMSkpOworICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGEgY29tbWEtZGVsaW1pdGVkIGxpc3QsIHRoZSBrZXJuZWwgd291bGQgaW5zZXJ0IGEgc3BhY2UgYmV0d2VlbiB0aGUKKyAgICAgICAgICAgIC8vIGxpc3QgZWxlbWVudHMgd2hlbiByZWFkIGZyb20gL3Byb2MvYm9vdGNvbmZpZy4KKyAgICAgICAgICAgIC8vIEJvYXJkQ29uZmlnLm1rOgorICAgICAgICAgICAgLy8gICAgICBCT0FSRF9CT09UQ09ORklHIDo9IGtleT12YWx1ZTEsdmFsdWUyLHZhbHVlMworICAgICAgICAgICAgLy8gL3Byb2MvYm9vdGNvbmZpZzoKKyAgICAgICAgICAgIC8vICAgICAga2V5ID0gInZhbHVlMSIsICJ2YWx1ZTIiLCAidmFsdWUzIgorICAgICAgICAgICAgaWYgKGtleSA9PSAiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2UiIHx8IGtleSA9PSAiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2VzIikgeworICAgICAgICAgICAgICAgIC8vIGJvb3RfZGV2aWNlW3NdIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGEgbGlzdCBlbGVtZW50IGNhbiBjb250YWluIGNvbW1hIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAvLyBjYWxsZXIgZXhwZWN0cyBhIHNwYWNlLWRlbGltaXRlZCBsaXN0LCBzbyBkb24ndCByZW1vdmUgc3BhY2UgaGVyZS4KKyAgICAgICAgICAgICAgICB2YWx1ZS5lcmFzZShzdGQ6OnJlbW92ZSh2YWx1ZS5iZWdpbigpLCB2YWx1ZS5lbmQoKSwgJyInKSwgdmFsdWUuZW5kKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBub3QgYnJlYWsgdGhlIGV4cGVjdGF0aW9ucyBvZiBleGlzdGluZyBjb2RlLCB3ZSBtb2RpZnkgdGhlIHZhbHVlIHRvCisgICAgICAgICAgICAgICAgLy8ga2VlcCB0aGUgZm9ybWF0IGNvbnNpc3RlbnQgd2l0aCB0aGUga2VybmVsIGNtZGxpbmUgYnkgcmVtb3ZpbmcgcXVvdGUgYW5kIHNwYWNlLgorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nX3ZpZXcgc3YodmFsdWUpOworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkNvbnN1bWVQcmVmaXgoJnN2LCAiXCIiKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpDb25zdW1lU3VmZml4KCZzdiwgIlwiIik7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdSZXBsYWNlKHN2LCBSIigiLCAiKSIsICIsIiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gImtleSIgYW5kICJrZXkgPSIgbWVhbnMgZW1wdHkgdmFsdWUuCisgICAgICAgIGZuKHN0ZDo6bW92ZShrZXkpLCBzdGQ6Om1vdmUodmFsdWUpKTsKKyAgICB9Cit9CisKK2Jvb2wgR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgSW1wb3J0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoYm9vdGNvbmZpZywgWyZdKHN0ZDo6c3RyaW5nIGNvbmZpZ19rZXksIHN0ZDo6c3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmICghZm91bmQgJiYgY29uZmlnX2tleSA9PSBrZXkpIHsKKyAgICAgICAgICAgICpvdXQgPSBzdGQ6Om1vdmUodmFsdWUpOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIGZvdW5kOworfQorCit2b2lkIEltcG9ydEJvb3Rjb25maWcoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyk+JiBmbikgeworICAgIHN0ZDo6c3RyaW5nIGJvb3Rjb25maWc7CisgICAgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZygiL3Byb2MvYm9vdGNvbmZpZyIsICZib290Y29uZmlnKTsKKyAgICBJbXBvcnRCb290Y29uZmlnRnJvbVN0cmluZyhib290Y29uZmlnLCBmbik7Cit9CisKK2Jvb2wgR2V0Qm9vdGNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0KSB7CisgICAgc3RkOjpzdHJpbmcgYm9vdGNvbmZpZzsKKyAgICBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKCIvcHJvYy9ib290Y29uZmlnIiwgJmJvb3Rjb25maWcpOworICAgIHJldHVybiBHZXRCb290Y29uZmlnRnJvbVN0cmluZyhib290Y29uZmlnLCBrZXksIG91dCk7Cit9CisKK3ZvaWQgSW1wb3J0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgcXVvdGUgPSAnIic7CisKKyAgICBzaXplX3QgYmFzZSA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgLy8gc2tpcCBxdW90ZWQgc3BhbnMKKyAgICAgICAgYXV0byBmb3VuZCA9IGJhc2U7CisgICAgICAgIHdoaWxlICgoKGZvdW5kID0gY21kbGluZS5maW5kX2ZpcnN0X29mKCIgXCIiLCBmb3VuZCkpICE9IGNtZGxpbmUubnBvcykgJiYKKyAgICAgICAgICAgICAgIChjbWRsaW5lW2ZvdW5kXSA9PSBxdW90ZSkpIHsKKyAgICAgICAgICAgIC8vIHVuYmFsYW5jZWQgcXVvdGUgaXMgb2sKKyAgICAgICAgICAgIGlmICgoZm91bmQgPSBjbWRsaW5lLmZpbmQocXVvdGUsIGZvdW5kICsgMSkpID09IGNtZGxpbmUubnBvcykgYnJlYWs7CisgICAgICAgICAgICArK2ZvdW5kOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHBpZWNlID0gY21kbGluZS5zdWJzdHIoYmFzZSwgZm91bmQgLSBiYXNlKTsKKyAgICAgICAgcGllY2UuZXJhc2Uoc3RkOjpyZW1vdmUocGllY2UuYmVnaW4oKSwgcGllY2UuZW5kKCksIHF1b3RlKSwgcGllY2UuZW5kKCkpOworICAgICAgICBhdXRvIGVxdWFsX3NpZ24gPSBwaWVjZS5maW5kKCc9Jyk7CisgICAgICAgIGlmIChlcXVhbF9zaWduID09IHBpZWNlLm5wb3MpIHsKKyAgICAgICAgICAgIGlmICghcGllY2UuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiA8a2V5PiBhbmQgPGtleT49CisgICAgICAgICAgICAgICAgZm4oc3RkOjptb3ZlKHBpZWNlKSwgIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBwaWVjZS5zdWJzdHIoZXF1YWxfc2lnbiArIDEpOworICAgICAgICAgICAgcGllY2UucmVzaXplKGVxdWFsX3NpZ24pOworICAgICAgICAgICAgZm4oc3RkOjptb3ZlKHBpZWNlKSwgc3RkOjptb3ZlKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kID09IGNtZGxpbmUubnBvcykgYnJlYWs7CisgICAgICAgIGJhc2UgPSBmb3VuZCArIDE7CisgICAgfQorfQorCitib29sIEdldEtlcm5lbENtZGxpbmVGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0KSB7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIEltcG9ydEtlcm5lbENtZGxpbmVGcm9tU3RyaW5nKGNtZGxpbmUsIFsmXShzdGQ6OnN0cmluZyBjb25maWdfa2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAoIWZvdW5kICYmIGNvbmZpZ19rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICAqb3V0ID0gc3RkOjptb3ZlKHZhbHVlKTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBmb3VuZDsKK30KKwordm9pZCBJbXBvcnRLZXJuZWxDbWRsaW5lKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pIHsKKyAgICBzdGQ6OnN0cmluZyBjbWRsaW5lOworICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2NtZGxpbmUiLCAmY21kbGluZSk7CisgICAgSW1wb3J0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoYW5kcm9pZDo6YmFzZTo6VHJpbShjbWRsaW5lKSwgZm4pOworfQorCitib29sIEdldEtlcm5lbENtZGxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIG91dCkgeworICAgIHN0ZDo6c3RyaW5nIGNtZGxpbmU7CisgICAgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZygiL3Byb2MvY21kbGluZSIsICZjbWRsaW5lKTsKKyAgICByZXR1cm4gR2V0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoYW5kcm9pZDo6YmFzZTo6VHJpbShjbWRsaW5lKSwga2V5LCBvdXQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyBUcmllcyB0byBnZXQgdGhlIGJvb3QgY29uZmlnIHZhbHVlIGluIGRldmljZSB0cmVlLCBwcm9wZXJ0aWVzLCBrZXJuZWwgYm9vdGNvbmZpZyBhbmQga2VybmVsCisvLyBjbWRsaW5lIChpbiB0aGF0IG9yZGVyKS4KKy8vIFJldHVybnMgJ3RydWUnIGlmIHN1Y2Nlc3NmdWxseSBmb3VuZCwgJ2ZhbHNlJyBvdGhlcndpc2UuCitib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIG91dF92YWwpIHsKKyAgICBGU1RBQl9DSEVDSyhvdXRfdmFsICE9IG51bGxwdHIpOworCisgICAgLy8gZmlyc3RseSwgY2hlY2sgdGhlIGRldmljZSB0cmVlCisgICAgaWYgKGlzX2R0X2NvbXBhdGlibGUoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBhbmRyb2lkOjpmc19tZ3I6OkdldEFuZHJvaWREdERpcigpICsga2V5OworICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhmaWxlX25hbWUsIG91dF92YWwpKSB7CisgICAgICAgICAgICBpZiAoIW91dF92YWwtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBvdXRfdmFsLT5wb3BfYmFjaygpOyAgLy8gVHJpbXMgdGhlIHRyYWlsaW5nICdcMCcgb3V0LgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gbmV4dCwgY2hlY2sgaWYgd2UgaGF2ZSAicm8uYm9vdCIgcHJvcGVydHkgYWxyZWFkeQorICAgICpvdXRfdmFsID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLmJvb3QuIiArIGtleSwgIiIpOworICAgIGlmICghb3V0X3ZhbC0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBuZXh0LCBjaGVjayBpZiB3ZSBoYXZlIHRoZSBwcm9wZXJ0eSBpbiBib290Y29uZmlnCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY29uZmlnX2tleSA9ICJhbmRyb2lkYm9vdC4iICsga2V5OworICAgIGlmIChhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3Rjb25maWcoY29uZmlnX2tleSwgb3V0X3ZhbCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gZmluYWxseSwgZmFsbGJhY2sgdG8ga2VybmVsIGNtZGxpbmUsIHByb3BlcnRpZXMgbWF5IG5vdCBiZSByZWFkeSB5ZXQKKyAgICBpZiAoYW5kcm9pZDo6ZnNfbWdyOjpHZXRLZXJuZWxDbWRsaW5lKGNvbmZpZ19rZXksIG91dF92YWwpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3JfZnN0YWIuY3BwIGIvZnNfbWdyL2xpYmZzdGFiL2ZzdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBmc19tZ3IvZnNfbWdyX2ZzdGFiLmNwcApyZW5hbWUgdG8gZnNfbWdyL2xpYmZzdGFiL2ZzdGFiLmNwcAppbmRleCA1OThhM2QyLi42ZmEyMmZlIDEwMDY0NAotLS0gYS9mc19tZ3IvZnNfbWdyX2ZzdGFiLmNwcAorKysgYi9mc19tZ3IvbGliZnN0YWIvZnN0YWIuY3BwCkBAIC0zNiw3ICszNiw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxsaWJnc2kvbGliZ3NpLmg+CiAKLSNpbmNsdWRlICJmc19tZ3JfcHJpdi5oIgorI2luY2x1ZGUgImZzdGFiX3ByaXYuaCIKKyNpbmNsdWRlICJsb2dnaW5nX21hY3Jvcy5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aDsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlBhcnNlQnl0ZUNvdW50OwpAQCAtNTAsMTAgKzUxLDEwIEBACiBuYW1lc3BhY2UgZnNfbWdyIHsKIG5hbWVzcGFjZSB7CiAKLWNvbnN0ZXhwciBjaGFyIGtEZWZhdWx0QW5kcm9pZER0RGlyW10gPSAiL3Byb2MvZGV2aWNlLXRyZWUvZmlybXdhcmUvYW5kcm9pZCI7Citjb25zdGV4cHIgY2hhciBrUHJvY01vdW50c1BhdGhbXSA9ICIvcHJvYy9tb3VudHMiOwogCiBzdHJ1Y3QgRmxhZ0xpc3QgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciogbmFtZTsKICAgICB1aW50NjRfdCBmbGFnOwogfTsKIApAQCAtNzksNyArODAsNyBAQAogb2ZmNjRfdCBDYWxjdWxhdGVacmFtU2l6ZShpbnQgcGVyY2VudGFnZSkgewogICAgIG9mZjY0X3QgdG90YWw7CiAKLSAgICB0b3RhbCAgPSBzeXNjb25mKF9TQ19QSFlTX1BBR0VTKTsKKyAgICB0b3RhbCA9IHN5c2NvbmYoX1NDX1BIWVNfUEFHRVMpOwogICAgIHRvdGFsICo9IHBlcmNlbnRhZ2U7CiAgICAgdG90YWwgLz0gMTAwOwogCkBAIC0yNDIsNyArMjQzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgTFdBUk5JTkcgPDwgIldhcm5pbmc6IHpyYW1zaXplPSBmbGFnIG1hbGZvcm1lZDogIiA8PCBhcmc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKFN0YXJ0c1dpdGgoZmxhZywgImZpbGVlbmNyeXB0aW9uPSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoU3RhcnRzV2l0aChmbGFnLCAiZmlsZWVuY3J5cHRpb249IikgfHwgZmxhZyA9PSAiZmlsZWVuY3J5cHRpb24iKSB7CisgICAgICAgICAgICAvLyAiZmlsZWVuY3J5cHRpb24iIGVuYWJsZXMgZmlsZS1iYXNlZCBlbmNyeXB0aW9uLiAgSXQncyBub3JtYWxseSBmb2xsb3dlZCBieSBhbiA9IGFuZAorICAgICAgICAgICAgLy8gdGhlbiB0aGUgZW5jcnlwdGlvbiBvcHRpb25zLiAgQnV0IHRoYXQgY2FuIGJlIG9taXR0ZWQgdG8gdXNlIHRoZSBkZWZhdWx0IG9wdGlvbnMuCiAgICAgICAgICAgICBQYXJzZUZpbGVFbmNyeXB0aW9uKGFyZywgZW50cnkpOwogICAgICAgICB9IGVsc2UgaWYgKFN0YXJ0c1dpdGgoZmxhZywgIm1heF9jb21wX3N0cmVhbXM9IikpIHsKICAgICAgICAgICAgIGlmICghUGFyc2VJbnQoYXJnLCAmZW50cnktPm1heF9jb21wX3N0cmVhbXMpKSB7CkBAIC0yODMsNiArMjg2LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoU3RhcnRzV2l0aChmbGFnLCAiYXZiX2tleXM9IikpIHsgIC8vIG11c3QgYmVmb3JlIHRoZSBmb2xsb3dpbmcgImF2YiIKICAgICAgICAgICAgIGVudHJ5LT5hdmJfa2V5cyA9IGFyZzsKKyAgICAgICAgfSBlbHNlIGlmIChTdGFydHNXaXRoKGZsYWcsICJhdmJfaGFzaHRyZWVfZGlnZXN0PSIpKSB7CisgICAgICAgICAgICAvLyAiYXZiX2hhc2h0cmVlX2RpZ2VzdCIgbXVzdCBiZWZvcmUgdGhlIGZvbGxvd2luZyAiYXZiIgorICAgICAgICAgICAgLy8gVGhlIHBhdGggd2hlcmUgaGV4LWVuY29kZWQgaGFzaHRyZWUgZGVzY3JpcHRvciByb290IGRpZ2VzdCBpcyBsb2NhdGVkLgorICAgICAgICAgICAgZW50cnktPmF2Yl9oYXNodHJlZV9kaWdlc3QgPSBhcmc7CiAgICAgICAgIH0gZWxzZSBpZiAoU3RhcnRzV2l0aChmbGFnLCAiYXZiIikpIHsKICAgICAgICAgICAgIGVudHJ5LT5mc19tZ3JfZmxhZ3MuYXZiID0gdHJ1ZTsKICAgICAgICAgICAgIGVudHJ5LT52Ym1ldGFfcGFydGl0aW9uID0gYXJnOwpAQCAtMzI1LDggKzMzMiw3IEBACiAgICAgLy8gc29tZSByZWNvdmVyeSBmc3RhYnMgc3RpbGwgY29udGFpbiB0aGUgRkRFIG9wdGlvbnMgc2luY2UgdGhleSBkaWRuJ3QgZG8KICAgICAvLyBhbnl0aGluZyBpbiByZWNvdmVyeSBtb2RlIGFueXdheSAoZXhjZXB0IHBvc3NpYmx5IHRvIGNhdXNlIHRoZQogICAgIC8vIHJlc2VydmF0aW9uIG9mIGEgY3J5cHRvIGZvb3RlcikgYW5kIHRodXMgbmV2ZXIgZ290IHJlbW92ZWQuCi0gICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MuY3J5cHQgJiYgIWVudHJ5LT5mc19tZ3JfZmxhZ3Mudm9sZF9tYW5hZ2VkICYmCi0gICAgICAgIGFjY2VzcygiL3N5c3RlbS9iaW4vcmVjb3ZlcnkiLCBGX09LKSAhPSAwKSB7CisgICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MuY3J5cHQgJiYgIWVudHJ5LT5mc19tZ3JfZmxhZ3Mudm9sZF9tYW5hZ2VkICYmICFJblJlY292ZXJ5KCkpIHsKICAgICAgICAgTEVSUk9SIDw8ICJGREUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZDsgJ2VuY3J5cHRhYmxlJyBjYW4gb25seSBiZSB1c2VkIGZvciBhZG9wdGFibGUgIgogICAgICAgICAgICAgICAgICAgInN0b3JhZ2UiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zMzQsMjUgKzM0MCwxNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGQ6OnN0cmluZyBJbml0QW5kcm9pZER0RGlyKCkgewotICAgIHN0ZDo6c3RyaW5nIGFuZHJvaWRfZHRfZGlyOwotICAgIC8vIFRoZSBwbGF0Zm9ybSBtYXkgc3BlY2lmeSBhIGN1c3RvbSBBbmRyb2lkIERUIHBhdGggaW4ga2VybmVsIGNtZGxpbmUKLSAgICBpZiAoIWZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnX3NvdXJjZSgiYW5kcm9pZF9kdF9kaXIiLCAmYW5kcm9pZF9kdF9kaXIpICYmCi0gICAgICAgICFmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsX2NtZGxpbmUoImFuZHJvaWRfZHRfZGlyIiwgJmFuZHJvaWRfZHRfZGlyKSkgewotICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHN0YW5kYXJkIHByb2Nmcy1iYXNlZCBwYXRoCi0gICAgICAgIGFuZHJvaWRfZHRfZGlyID0ga0RlZmF1bHRBbmRyb2lkRHREaXI7Ci0gICAgfQotICAgIHJldHVybiBhbmRyb2lkX2R0X2RpcjsKLX0KLQogYm9vbCBJc0R0RnN0YWJDb21wYXRpYmxlKCkgewogICAgIHN0ZDo6c3RyaW5nIGR0X3ZhbHVlOwotICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IGdldF9hbmRyb2lkX2R0X2RpcigpICsgIi9mc3RhYi9jb21wYXRpYmxlIjsKKyAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBHZXRBbmRyb2lkRHREaXIoKSArICJmc3RhYi9jb21wYXRpYmxlIjsKIAogICAgIGlmIChSZWFkRHRGaWxlKGZpbGVfbmFtZSwgJmR0X3ZhbHVlKSAmJiBkdF92YWx1ZSA9PSAiYW5kcm9pZCxmc3RhYiIpIHsKICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBzdGF0dXMgcHJvcGVydHkgb3IgaXRzIHNldCB0byAib2siIG9yICJva2F5IiwgdGhlbiB3ZSB1c2UgdGhlIERUIGZzdGFiLgogICAgICAgICBzdGQ6OnN0cmluZyBzdGF0dXNfdmFsdWU7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0YXR1c19maWxlX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArICIvZnN0YWIvc3RhdHVzIjsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RhdHVzX2ZpbGVfbmFtZSA9IEdldEFuZHJvaWREdERpcigpICsgImZzdGFiL3N0YXR1cyI7CiAgICAgICAgIHJldHVybiAhUmVhZER0RmlsZShzdGF0dXNfZmlsZV9uYW1lLCAmc3RhdHVzX3ZhbHVlKSB8fCBzdGF0dXNfdmFsdWUgPT0gIm9rIiB8fAogICAgICAgICAgICAgICAgc3RhdHVzX3ZhbHVlID09ICJva2F5IjsKICAgICB9CkBAIC0zNjUsNyArMzYwLDcgQEAKICAgICAgICAgcmV0dXJuIHt9OwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIGZzdGFiZGlyX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArICIvZnN0YWIiOworICAgIHN0ZDo6c3RyaW5nIGZzdGFiZGlyX25hbWUgPSBHZXRBbmRyb2lkRHREaXIoKSArICJmc3RhYiI7CiAgICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgaW50ICgqKShESVIqKT4gZnN0YWJkaXIob3BlbmRpcihmc3RhYmRpcl9uYW1lLmNfc3RyKCkpLCBjbG9zZWRpcik7CiAgICAgaWYgKCFmc3RhYmRpcikgcmV0dXJuIHt9OwogCkBAIC0zOTgsNyArMzkzLDcgQEAKIAogICAgICAgICBzdGQ6OnN0cmluZyBtb3VudF9wb2ludDsKICAgICAgICAgZmlsZV9uYW1lID0KLSAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJXMvJXMvbW50X3BvaW50IiwgZnN0YWJkaXJfbmFtZS5jX3N0cigpLCBkcC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIiVzLyVzL21udF9wb2ludCIsIGZzdGFiZGlyX25hbWUuY19zdHIoKSwgZHAtPmRfbmFtZSk7CiAgICAgICAgIGlmIChSZWFkRHRGaWxlKGZpbGVfbmFtZSwgJnZhbHVlKSkgewogICAgICAgICAgICAgTElORk8gPDwgImR0X2ZzdGFiOiBVc2luZyBhIHNwZWNpZmllZCBtb3VudCBwb2ludCAiIDw8IHZhbHVlIDw8ICIgZm9yICIgPDwgZHAtPmRfbmFtZTsKICAgICAgICAgICAgIG1vdW50X3BvaW50ID0gdmFsdWU7CkBAIC00MTQsMTQgKzQwOSwxNiBAQAogICAgICAgICB9CiAgICAgICAgIGZzdGFiX2VudHJ5LnB1c2hfYmFjayh2YWx1ZSk7CiAKLSAgICAgICAgZmlsZV9uYW1lID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIlcy8lcy9tbnRfZmxhZ3MiLCBmc3RhYmRpcl9uYW1lLmNfc3RyKCksIGRwLT5kX25hbWUpOworICAgICAgICBmaWxlX25hbWUgPQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJXMvJXMvbW50X2ZsYWdzIiwgZnN0YWJkaXJfbmFtZS5jX3N0cigpLCBkcC0+ZF9uYW1lKTsKICAgICAgICAgaWYgKCFSZWFkRHRGaWxlKGZpbGVfbmFtZSwgJnZhbHVlKSkgewogICAgICAgICAgICAgTEVSUk9SIDw8ICJkdF9mc3RhYjogRmFpbGVkIHRvIGZpbmQgdHlwZSBmb3IgcGFydGl0aW9uICIgPDwgZHAtPmRfbmFtZTsKICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgfQogICAgICAgICBmc3RhYl9lbnRyeS5wdXNoX2JhY2sodmFsdWUpOwogCi0gICAgICAgIGZpbGVfbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJXMvJXMvZnNtZ3JfZmxhZ3MiLCBmc3RhYmRpcl9uYW1lLmNfc3RyKCksIGRwLT5kX25hbWUpOworICAgICAgICBmaWxlX25hbWUgPQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJXMvJXMvZnNtZ3JfZmxhZ3MiLCBmc3RhYmRpcl9uYW1lLmNfc3RyKCksIGRwLT5kX25hbWUpOwogICAgICAgICBpZiAoIVJlYWREdEZpbGUoZmlsZV9uYW1lLCAmdmFsdWUpKSB7CiAgICAgICAgICAgICBMRVJST1IgPDwgImR0X2ZzdGFiOiBGYWlsZWQgdG8gZmluZCB0eXBlIGZvciBwYXJ0aXRpb24gIiA8PCBkcC0+ZF9uYW1lOwogICAgICAgICAgICAgcmV0dXJuIHt9OwpAQCAtNTE3LDYgKzUxNCw5IEBACiAvLyByYW1kaXNrJ3MgY29weSBvZiB0aGUgZnN0YWIgaGFkIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LCBidXQgbm93CiAvLyB0aGUgc3lzdGVtL2V0YyBkaXJlY3RvcnkgaXMgc3VwcG9ydGVkIHRvbyBhbmQgaXMgdGhlIHByZWZlcnJlZCBsb2NhdGlvbi4KIHN0ZDo6c3RyaW5nIEdldEZzdGFiUGF0aCgpIHsKKyAgICBpZiAoSW5SZWNvdmVyeSgpKSB7CisgICAgICAgIHJldHVybiAiL2V0Yy9yZWNvdmVyeS5mc3RhYiI7CisgICAgfQogICAgIGZvciAoY29uc3QgY2hhciogcHJvcCA6IHsiZnN0YWJfc3VmZml4IiwgImhhcmR3YXJlIiwgImhhcmR3YXJlLnBsYXRmb3JtIn0pIHsKICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OwogCkBAIC02OTcsOSArNjk3LDcgQEAKICAgICB9CiB9CiAKLWJvb2wgUmVhZEZzdGFiRnJvbUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIEZzdGFiKiBmc3RhYl9vdXQpIHsKLSAgICBjb25zdCBib29sIGlzX3Byb2NfbW91bnRzID0gKHBhdGggPT0gIi9wcm9jL21vdW50cyIpOwotCitzdGF0aWMgYm9vbCBSZWFkRnN0YWJGcm9tRmlsZUNvbW1vbihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgRnN0YWIqIGZzdGFiX291dCkgewogICAgIHN0ZDo6c3RyaW5nIGZzdGFiX3N0cjsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJmZzdGFiX3N0ciwgLyogZm9sbG93X3N5bWxpbmtzID0gKi8gdHJ1ZSkpIHsKICAgICAgICAgUEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IGZhaWxlZCB0byByZWFkIGZpbGU6ICciIDw8IHBhdGggPDwgIiciOwpAQCAtNzA3LDExICs3MDUsMjIgQEAKICAgICB9CiAKICAgICBGc3RhYiBmc3RhYjsKLSAgICBpZiAoIVBhcnNlRnN0YWJGcm9tU3RyaW5nKGZzdGFiX3N0ciwgaXNfcHJvY19tb3VudHMsICZmc3RhYikpIHsKKyAgICBpZiAoIVBhcnNlRnN0YWJGcm9tU3RyaW5nKGZzdGFiX3N0ciwgcGF0aCA9PSBrUHJvY01vdW50c1BhdGgsICZmc3RhYikpIHsKICAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IGZhaWxlZCB0byBsb2FkIGZzdGFiIGZyb20gOiAnIiA8PCBwYXRoIDw8ICInIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIWlzX3Byb2NfbW91bnRzKSB7CisKKyAgICBFbmFibGVNYW5kYXRvcnlGbGFncygmZnN0YWIpOworCisgICAgKmZzdGFiX291dCA9IHN0ZDo6bW92ZShmc3RhYik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZEZzdGFiRnJvbUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIEZzdGFiKiBmc3RhYikgeworICAgIGlmICghUmVhZEZzdGFiRnJvbUZpbGVDb21tb24ocGF0aCwgZnN0YWIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHBhdGggIT0ga1Byb2NNb3VudHNQYXRoICYmICFJblJlY292ZXJ5KCkpIHsKICAgICAgICAgaWYgKCFhY2Nlc3MoYW5kcm9pZDo6Z3NpOjprR3NpQm9vdGVkSW5kaWNhdG9yRmlsZSwgRl9PSykpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRzdV9zbG90OwogICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpnc2k6OkdldEFjdGl2ZURzdSgmZHN1X3Nsb3QpKSB7CkBAIC03MjMsMjAgKzczMiwyMyBAQAogICAgICAgICAgICAgICAgIFBFUlJPUiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBmYWlsZWQgdG8gcmVhZCBEU1UgTFAgbmFtZXMiOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYW5zZm9ybUZzdGFiRm9yRHN1KCZmc3RhYiwgZHN1X3Nsb3QsIFNwbGl0KGxwX25hbWVzLCAiLCIpKTsKKyAgICAgICAgICAgIFRyYW5zZm9ybUZzdGFiRm9yRHN1KGZzdGFiLCBkc3Vfc2xvdCwgU3BsaXQobHBfbmFtZXMsICIsIikpOwogICAgICAgICB9IGVsc2UgaWYgKGVycm5vICE9IEVOT0VOVCkgewogICAgICAgICAgICAgUEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IGZhaWxlZCB0byBhY2Nlc3MoKSBEU1UgYm9vdGVkIGluZGljYXRvciI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKworICAgICAgICBTa2lwTW91bnRpbmdQYXJ0aXRpb25zKGZzdGFiLCBmYWxzZSAvKiB2ZXJib3NlICovKTsKICAgICB9Ci0KLSAgICBTa2lwTW91bnRpbmdQYXJ0aXRpb25zKCZmc3RhYiwgZmFsc2UgLyogdmVyYm9zZSAqLyk7Ci0gICAgRW5hYmxlTWFuZGF0b3J5RmxhZ3MoJmZzdGFiKTsKLQotICAgICpmc3RhYl9vdXQgPSBzdGQ6Om1vdmUoZnN0YWIpOwogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIFJlYWRGc3RhYkZyb21Qcm9jTW91bnRzKEZzdGFiKiBmc3RhYikgeworICAgIC8vIERvbid0IGNhbGwgYFJlYWRGc3RhYkZyb21GaWxlYCBiZWNhdXNlIHRoZSBjb2RlIGZvciBgcGF0aCAhPSBrUHJvY01vdW50c1BhdGhgIGhhcyBhbiBleHRyYQorICAgIC8vIGNvZGUgc2l6ZSBjb3N0LCBldmVuIGlmIGl0J3MgbmV2ZXIgZXhlY3V0ZWQuCisgICAgcmV0dXJuIFJlYWRGc3RhYkZyb21GaWxlQ29tbW9uKGtQcm9jTW91bnRzUGF0aCwgZnN0YWIpOworfQorCiAvLyBSZXR1cm5zIGZzdGFiIGVudHJpZXMgcGFyc2VkIGZyb20gdGhlIGRldmljZSB0cmVlIGlmIHRoZXkgZXhpc3QKIGJvb2wgUmVhZEZzdGFiRnJvbUR0KEZzdGFiKiBmc3RhYiwgYm9vbCB2ZXJib3NlKSB7CiAgICAgc3RkOjpzdHJpbmcgZnN0YWJfYnVmID0gUmVhZEZzdGFiRnJvbUR0KCk7CkBAIC04MjAsMTkgKzgzMiwxMSBAQAogICAgIGZzdGFiLT5jbGVhcigpOwogICAgIFJlYWRGc3RhYkZyb21EdChmc3RhYiwgZmFsc2UgLyogdmVyYm9zZSAqLyk7CiAKLSAgICBzdGQ6OnN0cmluZyBkZWZhdWx0X2ZzdGFiX3BhdGg7Ci0gICAgLy8gVXNlIGRpZmZlcmVudCBmc3RhYiBwYXRocyBmb3Igbm9ybWFsIGJvb3QgYW5kIHJlY292ZXJ5IGJvb3QsIHJlc3BlY3RpdmVseQotICAgIGlmICgoYWNjZXNzKCIvc2Jpbi9yZWNvdmVyeSIsIEZfT0spID09IDApIHx8IChhY2Nlc3MoIi9zeXN0ZW0vYmluL3JlY292ZXJ5IiwgRl9PSykgPT0gMCkpIHsKLSAgICAgICAgZGVmYXVsdF9mc3RhYl9wYXRoID0gIi9ldGMvcmVjb3ZlcnkuZnN0YWIiOwotICAgIH0gZWxzZSB7ICAvLyBub3JtYWwgYm9vdAotICAgICAgICBkZWZhdWx0X2ZzdGFiX3BhdGggPSBHZXRGc3RhYlBhdGgoKTsKLSAgICB9Ci0KICAgICBGc3RhYiBkZWZhdWx0X2ZzdGFiOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRlZmF1bHRfZnN0YWJfcGF0aCA9IEdldEZzdGFiUGF0aCgpOwogICAgIGlmICghZGVmYXVsdF9mc3RhYl9wYXRoLmVtcHR5KCkgJiYgUmVhZEZzdGFiRnJvbUZpbGUoZGVmYXVsdF9mc3RhYl9wYXRoLCAmZGVmYXVsdF9mc3RhYikpIHsKLSAgICAgICAgZm9yIChhdXRvJiYgZW50cnkgOiBkZWZhdWx0X2ZzdGFiKSB7Ci0gICAgICAgICAgICBmc3RhYi0+ZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShlbnRyeSkpOwotICAgICAgICB9CisgICAgICAgIGZzdGFiLT5pbnNlcnQoZnN0YWItPmVuZCgpLCBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihkZWZhdWx0X2ZzdGFiLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKGRlZmF1bHRfZnN0YWIuZW5kKCkpKTsKICAgICB9IGVsc2UgewogICAgICAgICBMSU5GTyA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBmYWlsZWQgdG8gZmluZCBkZXZpY2UgZGVmYXVsdCBmc3RhYiI7CiAgICAgfQpAQCAtODYyLDQwICs4NjYsMzMgQEAKIH0KIAogc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEdldEJvb3REZXZpY2VzKCkgeworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBib290X2RldmljZXM7CiAgICAgLy8gRmlyc3QgY2hlY2sgYm9vdGNvbmZpZywgdGhlbiBrZXJuZWwgY29tbWFuZGxpbmUsIHRoZW4gdGhlIGRldmljZSB0cmVlCi0gICAgc3RkOjpzdHJpbmcgZHRfZmlsZV9uYW1lID0gZ2V0X2FuZHJvaWRfZHRfZGlyKCkgKyAiL2Jvb3RfZGV2aWNlcyI7CiAgICAgc3RkOjpzdHJpbmcgdmFsdWU7Ci0gICAgaWYgKGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnX3NvdXJjZSgiYm9vdF9kZXZpY2VzIiwgJnZhbHVlKSB8fAotICAgICAgICBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZ19zb3VyY2UoImJvb3RfZGV2aWNlIiwgJnZhbHVlKSkgewotICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gYm9vdF9kZXZpY2VzOwotICAgICAgICAvLyByZW1vdmUgcXVvdGVzIGFuZCBzcGxpdCBieSBzcGFjZXMKLSAgICAgICAgYXV0byBib290X2RldmljZV9zdHJpbmdzID0gYmFzZTo6U3BsaXQoYmFzZTo6U3RyaW5nUmVwbGFjZSh2YWx1ZSwgIlwiIiwgIiIsIHRydWUpLCAiICIpOwotICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nX3ZpZXcgZGV2aWNlIDogYm9vdF9kZXZpY2Vfc3RyaW5ncykgewotICAgICAgICAgICAgLy8gdHJpbSB0aGUgdHJhaWxpbmcgY29tbWEsIGtlZXAgdGhlIHJlc3QuCisgICAgaWYgKEdldEJvb3Rjb25maWcoImFuZHJvaWRib290LmJvb3RfZGV2aWNlcyIsICZ2YWx1ZSkgfHwKKyAgICAgICAgR2V0Qm9vdGNvbmZpZygiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2UiLCAmdmFsdWUpKSB7CisgICAgICAgIC8vIHNwbGl0IGJ5IHNwYWNlcyBhbmQgdHJpbSB0aGUgdHJhaWxpbmcgY29tbWEuCisgICAgICAgIGZvciAoc3RkOjpzdHJpbmdfdmlldyBkZXZpY2UgOiBhbmRyb2lkOjpiYXNlOjpTcGxpdCh2YWx1ZSwgIiAiKSkgewogICAgICAgICAgICAgYmFzZTo6Q29uc3VtZVN1ZmZpeCgmZGV2aWNlLCAiLCIpOwogICAgICAgICAgICAgYm9vdF9kZXZpY2VzLmVtcGxhY2UoZGV2aWNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYm9vdF9kZXZpY2VzOwogICAgIH0KIAotICAgIGlmIChmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsX2NtZGxpbmUoImJvb3RfZGV2aWNlcyIsICZ2YWx1ZSkgfHwKLSAgICAgICAgUmVhZER0RmlsZShkdF9maWxlX25hbWUsICZ2YWx1ZSkpIHsKLSAgICAgICAgYXV0byBib290X2RldmljZXMgPSBTcGxpdCh2YWx1ZSwgIiwiKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPihib290X2RldmljZXMuYmVnaW4oKSwgYm9vdF9kZXZpY2VzLmVuZCgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkdF9maWxlX25hbWUgPSBHZXRBbmRyb2lkRHREaXIoKSArICJib290X2RldmljZXMiOworICAgIGlmIChHZXRLZXJuZWxDbWRsaW5lKCJhbmRyb2lkYm9vdC5ib290X2RldmljZXMiLCAmdmFsdWUpIHx8IFJlYWREdEZpbGUoZHRfZmlsZV9uYW1lLCAmdmFsdWUpKSB7CisgICAgICAgIGF1dG8gYm9vdF9kZXZpY2VzX2xpc3QgPSBTcGxpdCh2YWx1ZSwgIiwiKTsKKyAgICAgICAgcmV0dXJuIHtzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihib290X2RldmljZXNfbGlzdC5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihib290X2RldmljZXNfbGlzdC5lbmQoKSl9OwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIGNtZGxpbmU7Ci0gICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2NtZGxpbmUiLCAmY21kbGluZSkpIHsKLSAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGJvb3RfZGV2aWNlczsKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgY21kbGluZV9rZXkgPSAiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2UiOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIFtrZXksIHZhbHVlXSA6IGZzX21ncl9wYXJzZV9jbWRsaW5lKGNtZGxpbmUpKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IGNtZGxpbmVfa2V5KSB7Ci0gICAgICAgICAgICAgICAgYm9vdF9kZXZpY2VzLmVtcGxhY2UodmFsdWUpOwotICAgICAgICAgICAgfQorICAgIEltcG9ydEtlcm5lbENtZGxpbmUoWyZdKHN0ZDo6c3RyaW5nIGtleSwgc3RkOjpzdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKGtleSA9PSAiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2UiKSB7CisgICAgICAgICAgICBib290X2RldmljZXMuZW1wbGFjZShzdGQ6Om1vdmUodmFsdWUpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWJvb3RfZGV2aWNlcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYm9vdF9kZXZpY2VzOwotICAgICAgICB9CisgICAgfSk7CisgICAgaWYgKCFib290X2RldmljZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gYm9vdF9kZXZpY2VzOwogICAgIH0KIAogICAgIC8vIEZhbGxiYWNrIHRvIGV4dHJhY3QgYm9vdCBkZXZpY2VzIGZyb20gZnN0YWIuCkBAIC05MjEsMTggKzkxOCwyMiBAQAogICAgIHJldHVybiBiYXNlX2RldmljZSArICItdmVyaXR5IjsKIH0KIAorYm9vbCBJblJlY292ZXJ5KCkgeworICAgIC8vIENoZWNrIHRoZSBleGlzdGVuY2Ugb2YgcmVjb3ZlcnkgYmluYXJ5IGluc3RlYWQgb2YgdXNpbmcgdGhlIGNvbXBpbGUgdGltZQorICAgIC8vIF9fQU5EUk9JRF9SRUNPVkVSWV9fIG1hY3JvLgorICAgIC8vIElmIEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCBpcyB0cnVlLCBib3RoIG5vcm1hbCBhbmQgcmVjb3ZlcnkgYm9vdAorICAgIC8vIG1vZGUgd291bGQgdXNlIHRoZSBzYW1lIGluaXQgYmluYXJ5LCB3aGljaCB3b3VsZCBtZWFuIGR1cmluZyBub3JtYWwgYm9vdAorICAgIC8vIHRoZSAnL2luaXQnIGJpbmFyeSBpcyBhY3R1YWxseSBhIHN5bWxpbmsgcG9pbnRpbmcgdG8KKyAgICAvLyBpbml0X3NlY29uZF9zdGFnZS5yZWNvdmVyeSwgd2hpY2ggd291bGQgYmUgY29tcGlsZWQgd2l0aAorICAgIC8vIF9fQU5EUk9JRF9SRUNPVkVSWV9fIGRlZmluZWQuCisgICAgcmV0dXJuIGFjY2VzcygiL3N5c3RlbS9iaW4vcmVjb3ZlcnkiLCBGX09LKSA9PSAwIHx8IGFjY2VzcygiL3NiaW4vcmVjb3ZlcnkiLCBGX09LKSA9PSAwOworfQorCiB9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0vLyBGSVhNRTogVGhlIHNhbWUgbG9naWMgaXMgZHVwbGljYXRlZCBpbiBzeXN0ZW0vY29yZS9pbml0LwotY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9hbmRyb2lkX2R0X2RpcigpIHsKLSAgICAvLyBTZXQgb25jZSBhbmQgc2F2ZXMgdGltZSBmb3Igc3Vic2VxdWVudCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uCi0gICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBbmRyb2lkRHREaXIgPSBhbmRyb2lkOjpmc19tZ3I6OkluaXRBbmRyb2lkRHREaXIoKTsKLSAgICByZXR1cm4ga0FuZHJvaWREdERpcjsKLX0KLQogYm9vbCBpc19kdF9jb21wYXRpYmxlKCkgewotICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IGdldF9hbmRyb2lkX2R0X2RpcigpICsgIi9jb21wYXRpYmxlIjsKKyAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBhbmRyb2lkOjpmc19tZ3I6OkdldEFuZHJvaWREdERpcigpICsgImNvbXBhdGlibGUiOwogICAgIHN0ZDo6c3RyaW5nIGR0X3ZhbHVlOwogICAgIGlmIChhbmRyb2lkOjpmc19tZ3I6OlJlYWREdEZpbGUoZmlsZV9uYW1lLCAmZHRfdmFsdWUpKSB7CiAgICAgICAgIGlmIChkdF92YWx1ZSA9PSAiYW5kcm9pZCxmaXJtd2FyZSIpIHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc3RhYi9mc3RhYl9wcml2LmggYi9mc19tZ3IvbGliZnN0YWIvZnN0YWJfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMDVkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGliZnN0YWIvZnN0YWJfcHJpdi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KKworLy8gRG8gbm90IGluY2x1ZGUgbG9nZ2luZ19tYWNyb3MuaCBoZXJlIGFzIHRoaXMgaGVhZGVyIGlzIHVzZWQgYnkgZnNfbWdyLCB0b28uCisKK2Jvb2wgZnNfbWdyX2dldF9ib290X2NvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0X3ZhbCk7CisKK2Jvb2wgZnNfbWdyX3VwZGF0ZV9mb3Jfc2xvdHNlbGVjdChhbmRyb2lkOjpmc19tZ3I6OkZzdGFiKiBmc3RhYik7Citib29sIGlzX2R0X2NvbXBhdGlibGUoKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK2Jvb2wgSW5SZWNvdmVyeSgpOworYm9vbCBQYXJzZUZzdGFiRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZnN0YWJfc3RyLCBib29sIHByb2NfbW91bnRzLCBGc3RhYiogZnN0YWJfb3V0KTsKK2Jvb2wgU2tpcE1vdW50V2l0aENvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgc2tpcF9jb25maWcsIEZzdGFiKiBmc3RhYiwgYm9vbCB2ZXJib3NlKTsKK3N0ZDo6c3RyaW5nIEdldEZzdGFiUGF0aCgpOworCit2b2lkIEltcG9ydEJvb3Rjb25maWdGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBib290Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nKT4mIGZuKTsKKworYm9vbCBHZXRCb290Y29uZmlnRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgYm9vdGNvbmZpZywgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dCk7CisKK3ZvaWQgSW1wb3J0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pOworCitib29sIEdldEtlcm5lbENtZGxpbmVGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0KTsKKworfSAgLy8gbmFtZXNwYWNlIGZzX21ncgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9mdXp6L0FuZHJvaWQuYnAgYi9mc19tZ3IvbGliZnN0YWIvZnV6ei9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBmc19tZ3IvZnV6ei9BbmRyb2lkLmJwCnJlbmFtZSB0byBmc19tZ3IvbGliZnN0YWIvZnV6ei9BbmRyb2lkLmJwCmRpZmYgLS1naXQgYS9mc19tZ3IvZnV6ei9mc19tZ3JfZnN0YWJfZnV6emVyLmNwcCBiL2ZzX21nci9saWJmc3RhYi9mdXp6L2ZzX21ncl9mc3RhYl9mdXp6ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGZzX21nci9mdXp6L2ZzX21ncl9mc3RhYl9mdXp6ZXIuY3BwCnJlbmFtZSB0byBmc19tZ3IvbGliZnN0YWIvZnV6ei9mc19tZ3JfZnN0YWJfZnV6emVyLmNwcAppbmRleCBiNWZkYWQ0Li5iMDliMjczIDEwMDY0NAotLS0gYS9mc19tZ3IvZnV6ei9mc19tZ3JfZnN0YWJfZnV6emVyLmNwcAorKysgYi9mc19tZ3IvbGliZnN0YWIvZnV6ei9mc19tZ3JfZnN0YWJfZnV6emVyLmNwcApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CiAjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgogCisjaW5jbHVkZSAiLi4vZnN0YWJfcHJpdi5oIgorCiBleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKIApkaWZmIC0tZ2l0IGEvZnNfbWdyL2Z1enovZnN0YWIuZGljdCBiL2ZzX21nci9saWJmc3RhYi9mdXp6L2ZzdGFiLmRpY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGZzX21nci9mdXp6L2ZzdGFiLmRpY3QKcmVuYW1lIHRvIGZzX21nci9saWJmc3RhYi9mdXp6L2ZzdGFiLmRpY3QKZGlmZiAtLWdpdCBhL2ZzX21nci9pbmNsdWRlX2ZzdGFiL2ZzdGFiL2ZzdGFiLmggYi9mc19tZ3IvbGliZnN0YWIvaW5jbHVkZS9mc3RhYi9mc3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggNzclCnJlbmFtZSBmcm9tIGZzX21nci9pbmNsdWRlX2ZzdGFiL2ZzdGFiL2ZzdGFiLmgKcmVuYW1lIHRvIGZzX21nci9saWJmc3RhYi9pbmNsdWRlL2ZzdGFiL2ZzdGFiLmgKaW5kZXggYTkxNGI1My4uNWU0MDE5YyAxMDA2NDQKLS0tIGEvZnNfbWdyL2luY2x1ZGVfZnN0YWIvZnN0YWIvZnN0YWIuaAorKysgYi9mc19tZ3IvbGliZnN0YWIvaW5jbHVkZS9mc3RhYi9mc3RhYi5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtNTYsNiArNTcsNyBAQAogICAgIHVpbnQ2NF90IHpyYW1fYmFja2luZ2Rldl9zaXplID0gMDsKICAgICBzdGQ6OnN0cmluZyBhdmJfa2V5czsKICAgICBzdGQ6OnN0cmluZyBsb3dlcmRpcjsKKyAgICBzdGQ6OnN0cmluZyBhdmJfaGFzaHRyZWVfZGlnZXN0OwogCiAgICAgc3RydWN0IEZzTWdyRmxhZ3MgewogICAgICAgICBib29sIHdhaXQgOiAxOwpAQCAtOTMsMTQgKzk1LDggQEAKIC8vIFVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZCwgYSBsb29rdXAgb24gbW91bnQgcG9pbnQgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhlIDFzdCBvbmUuCiB1c2luZyBGc3RhYiA9IHN0ZDo6dmVjdG9yPEZzdGFiRW50cnk+OwogCi0vLyBFeHBvcnRlZCBmb3IgdGVzdGFiaWxpdHkuIFJlZ3VsYXIgdXNlcnMgc2hvdWxkIHVzZSBSZWFkRnN0YWJGcm9tRmlsZSgpLgotYm9vbCBQYXJzZUZzdGFiRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZnN0YWJfc3RyLCBib29sIHByb2NfbW91bnRzLCBGc3RhYiogZnN0YWJfb3V0KTsKLS8vIEV4cG9ydGVkIGZvciB0ZXN0YWJpbGl0eS4gUmVndWxhciB1c2VycyBzaG91bGQgdXNlIFJlYWREZWZhdWx0RnN0YWIoKS4KLXN0ZDo6c3RyaW5nIEdldEZzdGFiUGF0aCgpOwotLy8gRXhwb3J0ZWQgZm9yIHRlc3RhYmlsaXR5LgotYm9vbCBTa2lwTW91bnRXaXRoQ29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBza2lwX2NvbmZpZywgRnN0YWIqIGZzdGFiLCBib29sIHZlcmJvc2UpOwotCiBib29sIFJlYWRGc3RhYkZyb21GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBGc3RhYiogZnN0YWIpOworYm9vbCBSZWFkRnN0YWJGcm9tUHJvY01vdW50cyhGc3RhYiogZnN0YWIpOwogYm9vbCBSZWFkRnN0YWJGcm9tRHQoRnN0YWIqIGZzdGFiLCBib29sIHZlcmJvc2UgPSB0cnVlKTsKIGJvb2wgUmVhZERlZmF1bHRGc3RhYihGc3RhYiogZnN0YWIpOwogYm9vbCBTa2lwTW91bnRpbmdQYXJ0aXRpb25zKEZzdGFiKiBmc3RhYiwgYm9vbCB2ZXJib3NlID0gZmFsc2UpOwpAQCAtMTMwLDUgKzEyNiwyOCBAQAogLy8gZXhwZWN0ZWQgbmFtZS4KIHN0ZDo6c3RyaW5nIEdldFZlcml0eURldmljZU5hbWUoY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpOwogCisvLyBSZXR1cm5zIHRoZSBBbmRyb2lkIERldmljZSBUcmVlIGRpcmVjdG9yeSBhcyBzcGVjaWZpZWQgaW4gdGhlIGtlcm5lbCBib290Y29uZmlnIG9yIGNtZGxpbmUuCisvLyBJZiB0aGUgcGxhdGZvcm0gZG9lcyBub3QgY29uZmlndXJlIGEgY3VzdG9tIERUIHBhdGgsIHJldHVybnMgdGhlIHN0YW5kYXJkIG9uZSAoYmFzZWQgaW4gcHJvY2ZzKS4KK2NvbnN0IHN0ZDo6c3RyaW5nJiBHZXRBbmRyb2lkRHREaXIoKTsKKworLy8gSW1wb3J0IHRoZSBrZXJuZWwgYm9vdGNvbmZpZyBieSBjYWxsaW5nIHRoZSBjYWxsYmFjayB8Zm58IHdpdGggZWFjaCBrZXktdmFsdWUgcGFpci4KK3ZvaWQgSW1wb3J0Qm9vdGNvbmZpZyhjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nKT4mIGZuKTsKKworLy8gR2V0IHRoZSBrZXJuZWwgYm9vdGNvbmZpZyB2YWx1ZSBmb3IgfGtleXwuCisvLyBSZXR1cm5zIHRydWUgaWYgfGtleXwgaXMgZm91bmQgaW4gYm9vdGNvbmZpZy4KKy8vIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCB8Km91dHwgaXMgbm90IG1vZGlmaWVkLgorYm9vbCBHZXRCb290Y29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBvdXQpOworCisvLyBJbXBvcnQgdGhlIGtlcm5lbCBjbWRsaW5lIGJ5IGNhbGxpbmcgdGhlIGNhbGxiYWNrIHxmbnwgd2l0aCBlYWNoIGtleS12YWx1ZSBwYWlyLgordm9pZCBJbXBvcnRLZXJuZWxDbWRsaW5lKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pOworCisvLyBHZXQgdGhlIGtlcm5lbCBjbWRsaW5lIHZhbHVlIGZvciB8a2V5fC4KKy8vIFJldHVybnMgdHJ1ZSBpZiB8a2V5fCBpcyBmb3VuZCBpbiB0aGUga2VybmVsIGNtZGxpbmUuCisvLyBPdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgfCpvdXR8IGlzIG5vdCBtb2RpZmllZC4KK2Jvb2wgR2V0S2VybmVsQ21kbGluZShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0KTsKKworLy8gUmV0dXJuIHRoZSAib3RoZXIiIHNsb3QgZm9yIHRoZSBnaXZlbiBzbG90IHN1ZmZpeC4KK3N0ZDo6c3RyaW5nIE90aGVyU2xvdFN1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KTsKKwogfSAgLy8gbmFtZXNwYWNlIGZzX21ncgogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc3RhYi9sb2dnaW5nX21hY3Jvcy5oIGIvZnNfbWdyL2xpYmZzdGFiL2xvZ2dpbmdfbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhMWI3NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJmc3RhYi9sb2dnaW5nX21hY3Jvcy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNkZWZpbmUgRlNUQUJfVEFHICJbbGliZnN0YWJdICIKKworLyogVGhlIENIRUNLKCkgaW4gbG9nZ2luZy5oIHdpbGwgdXNlIHByb2dyYW0gaW52b2NhdGlvbiBuYW1lIGFzIHRoZSB0YWcuCisgKiBUaHVzLCB0aGUgbG9nIHdpbGwgaGF2ZSBwcmVmaXggImluaXQ6ICIgd2hlbiBsaWJmc19tZ3IgaXMgc3RhdGljYWxseQorICogbGlua2VkIGluIHRoZSBpbml0IHByb2Nlc3MuIFRoaXMgbWlnaHQgYmUgb3BhcXVlIHdoZW4gZGVidWdnaW5nLgorICogQXBwZW5kIGEgbGlicmFyeSBuYW1lIHRhZyBhdCB0aGUgZW5kIG9mIHRoZSBhYm9ydCBtZXNzYWdlIHRvIGFpZCBkZWJ1Z2dpbmcuCisgKi8KKyNkZWZpbmUgRlNUQUJfQ0hFQ0soeCkgQ0hFQ0soeCkgPDwgImluICIgPDwgRlNUQUJfVEFHCisKKy8vIExvZ3MgYSBtZXNzYWdlIHRvIGtlcm5lbAorI2RlZmluZSBMSU5GTyBMT0coSU5GTykgPDwgRlNUQUJfVEFHCisjZGVmaW5lIExXQVJOSU5HIExPRyhXQVJOSU5HKSA8PCBGU1RBQl9UQUcKKyNkZWZpbmUgTEVSUk9SIExPRyhFUlJPUikgPDwgRlNUQUJfVEFHCisjZGVmaW5lIExGQVRBTCBMT0coRkFUQUwpIDw8IEZTVEFCX1RBRworCisvLyBMb2dzIGEgbWVzc2FnZSB3aXRoIHN0cmVycm9yKGVycm5vKSBhdCB0aGUgZW5kCisjZGVmaW5lIFBJTkZPIFBMT0coSU5GTykgPDwgRlNUQUJfVEFHCisjZGVmaW5lIFBXQVJOSU5HIFBMT0coV0FSTklORykgPDwgRlNUQUJfVEFHCisjZGVmaW5lIFBFUlJPUiBQTE9HKEVSUk9SKSA8PCBGU1RBQl9UQUcKKyNkZWZpbmUgUEZBVEFMIFBMT0coRkFUQUwpIDw8IEZTVEFCX1RBRwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9zbG90c2VsZWN0LmNwcCBiL2ZzX21nci9saWJmc3RhYi9zbG90c2VsZWN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBmc19tZ3IvZnNfbWdyX3Nsb3RzZWxlY3QuY3BwCnJlbmFtZSB0byBmc19tZ3IvbGliZnN0YWIvc2xvdHNlbGVjdC5jcHAKaW5kZXggMDljMWI3ZS4uZGIzZjhkYSAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21ncl9zbG90c2VsZWN0LmNwcAorKysgYi9mc19tZ3IvbGliZnN0YWIvc2xvdHNlbGVjdC5jcHAKQEAgLTE4LDggKzE4LDggQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgImZzX21nci5oIgotI2luY2x1ZGUgImZzX21ncl9wcml2LmgiCisjaW5jbHVkZSAiZnN0YWJfcHJpdi5oIgorI2luY2x1ZGUgImxvZ2dpbmdfbWFjcm9zLmgiCiAKIC8vIFJlYWxpc3RpY2FsbHksIHRoaXMgZmlsZSBzaG91bGQgYmUgcGFydCBvZiB0aGUgYW5kcm9pZDo6ZnNfbWdyIG5hbWVzcGFjZTsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpmc19tZ3I7CkBAIC03NCwzICs3NCwxMyBAQAogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK3N0ZDo6c3RyaW5nIE90aGVyU2xvdFN1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KSB7CisgICAgcmV0dXJuIG90aGVyX3N1ZmZpeChzdWZmaXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL0FuZHJvaWQuYnAgYi9mc19tZ3IvbGlibHAvQW5kcm9pZC5icAppbmRleCA5OTZmZmQ3Li4yNGVlYmRmIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlibHAvQW5kcm9pZC5icAorKysgYi9mc19tZ3IvbGlibHAvQW5kcm9pZC5icApAQCAtOTMsOCArOTMsOCBAQAogICAgIHNyY3M6IFsKICAgICAgICAgImJ1aWxkZXJfdGVzdC5jcHAiLAogICAgICAgICAic3VwZXJfbGF5b3V0X2J1aWxkZXJfdGVzdC5jcHAiLAotICAgICAgICAidGVzdF9wYXJ0aXRpb25fb3BlbmVyLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5X3Rlc3QuY3BwIiwKKyAgICAgICAgIjpUZXN0UGFydGl0aW9uT3BlbmVyX2dyb3VwIiwKICAgICBdLAogfQogCkBAIC0xMjIsMyArMTIyLDggQEAKICAgICBuYW1lOiAidnRzX2tlcm5lbF9saWJscF90ZXN0IiwKICAgICBkZWZhdWx0czogWyJsaWJscF90ZXN0X2RlZmF1bHRzIl0sCiB9CisKK2ZpbGVncm91cCB7CisgICBuYW1lOiAiVGVzdFBhcnRpdGlvbk9wZW5lcl9ncm91cCIsCisgICBzcmNzOiBbICJ0ZXN0X3BhcnRpdGlvbl9vcGVuZXIuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAgYi9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAKaW5kZXggNmNiMmM1MS4uNGU2ZTk3YiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmxwL2J1aWxkZXIuY3BwCisrKyBiL2ZzX21nci9saWJscC9idWlsZGVyLmNwcApAQCAtMTIxMSw2ICsxMjExLDE1IEBACiAgICAgaGVhZGVyXy5mbGFncyB8PSBMUF9IRUFERVJfRkxBR19WSVJUVUFMX0FCX0RFVklDRTsKIH0KIAordm9pZCBNZXRhZGF0YUJ1aWxkZXI6OlNldE92ZXJsYXlzQWN0aXZlRmxhZyhib29sIGZsYWcpIHsKKyAgICBSZXF1aXJlRXhwYW5kZWRNZXRhZGF0YUhlYWRlcigpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGhlYWRlcl8uZmxhZ3MgfD0gTFBfSEVBREVSX0ZMQUdfT1ZFUkxBWVNfQUNUSVZFOworICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWRlcl8uZmxhZ3MgJj0gfkxQX0hFQURFUl9GTEFHX09WRVJMQVlTX0FDVElWRTsKKyAgICB9Cit9CisKIGJvb2wgTWV0YWRhdGFCdWlsZGVyOjpJc0FCRGV2aWNlKCkgewogICAgIHJldHVybiAhSVByb3BlcnR5RmV0Y2hlcjo6R2V0SW5zdGFuY2UoKS0+R2V0UHJvcGVydHkoInJvLmJvb3Quc2xvdF9zdWZmaXgiLCAiIikuZW1wdHkoKTsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9mdXp6ZXIvQW5kcm9pZC5icCBiL2ZzX21nci9saWJscC9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWUzNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmxwL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJscF9mdXp6X2RlZmF1bHRzIiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RvcmFnZV9saXRlcmFsc19oZWFkZXJzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJscCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAic3lzdGVtL2NvcmUvZnNfbWdyL2xpYmxwIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiA1OTE0OCwKKyAgICAgICAgaG90bGlzdHM6IFsiNDU5MzMxMSJdLAorICAgICAgICBkZXNjcmlwdGlvbjogIlRoZSBmdXp6ZXJzIHRhcmdldCB0aGUgQVBJcyBvZiBhbGwgbGlibHAgbW9kdWxlcyIsCisgICAgICAgIHZlY3RvcjogImxvY2FsX25vX3ByaXZpbGVnZXNfcmVxdWlyZWQiLAorICAgICAgICBzZXJ2aWNlX3ByaXZpbGVnZTogInByaXZpbGVnZWQiLAorICAgICAgICB1c2VyczogIm11bHRpX3VzZXIiLAorICAgICAgICBmdXp6ZWRfY29kZV91c2FnZTogInNoaXBwZWQiCisgICAgfQorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibHBfYnVpbGRlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsibGlibHBfYnVpbGRlcl9mdXp6ZXIuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsibGlibHBfZnV6el9kZWZhdWx0cyJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibHBfc3VwZXJfbGF5b3V0X2J1aWxkZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbImxpYmxwX3N1cGVyX2xheW91dF9idWlsZGVyX2Z1enplci5jcHAiXSwKKyAgICBkZWZhdWx0czogWyJsaWJscF9mdXp6X2RlZmF1bHRzIl0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImltYWdlX2dlbl9yYW5kIiwKKyAgICBzcmNzOiBbImltYWdlX2dlbl9yYW5kLnB5Il0sCit9CisKK2dlbnJ1bGVfZGVmYXVsdHMgeworICAgIG5hbWU6ICJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIiwKKyAgICB0b29sczogWworICAgICAgICAiaW1hZ2VfZ2VuX3JhbmQiLAorICAgIF0sCit9CisKKy8vIEZha2UgZHRiIGltYWdlLgorZ2VucnVsZSB7CisgICAgbmFtZTogInRlc3RfZHRiIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfZHRiLmltZyJdLAorICAgIGNtZDogIiQobG9jYXRpb24gaW1hZ2VfZ2VuX3JhbmQpIC0tc2VlZCBkdGIgLS1sZW5ndGggMTAyNCA+ICQob3V0KSIsCit9CisKKy8vIEZha2UgYm9vdGNvbmZpZyBpbWFnZS4KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJ0ZXN0X2Jvb3Rjb25maWciLAorICAgIGRlZmF1bHRzOiBbInRlc3RfZGF0YV9nZW5fZGVmYXVsdHMiXSwKKyAgICBvdXQ6IFsidGVzdF9ib290Y29uZmlnLmltZyJdLAorICAgIGNtZDogIiQobG9jYXRpb24gaW1hZ2VfZ2VuX3JhbmQpIC0tc2VlZCBib290Y29uZmlnIC0tbGVuZ3RoIDEwMjQgPiAkKG91dCkiLAorfQorCisvLyBGYWtlIHZlbmRvciByYW1kaXNrIHdpdGggdHlwZSAibm9uZSIuCitnZW5ydWxlIHsKKyAgICBuYW1lOiAidGVzdF92ZW5kb3JfcmFtZGlza19ub25lIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfdmVuZG9yX3JhbWRpc2tfbm9uZS5pbWciXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGltYWdlX2dlbl9yYW5kKSAtLXNlZWQgdmVuZG9yX3JhbWRpc2tfbm9uZSAtLWxlbmd0aCAxMDI0ID4gJChvdXQpIiwKK30KKworLy8gRmFrZSB2ZW5kb3IgcmFtZGlzayB3aXRoIHR5cGUgInBsYXRmb3JtIi4KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJ0ZXN0X3ZlbmRvcl9yYW1kaXNrX3BsYXRmb3JtIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfdmVuZG9yX3JhbWRpc2tfcGxhdGZvcm0uaW1nIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBpbWFnZV9nZW5fcmFuZCkgLS1zZWVkIHZlbmRvcl9yYW1kaXNrX3BsYXRmb3JtIC0tbGVuZ3RoIDEwMjQgPiAkKG91dCkiLAorfQorCisvLyBGYWtlIHJlcGxhY2VtZW50IHJhbWRpc2suCitnZW5ydWxlIHsKKyAgICBuYW1lOiAidGVzdF92ZW5kb3JfcmFtZGlza19yZXBsYWNlIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfdmVuZG9yX3JhbWRpc2tfcmVwbGFjZS5pbWciXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGltYWdlX2dlbl9yYW5kKSAtLXNlZWQgcmVwbGFjZSAtLWxlbmd0aCAzMDcyID4gJChvdXQpIiwKK30KKworLy8gR2VucnVsZXMgZm9yIHRlc3QgdmVuZG9yIGJvb3QgaW1hZ2VzLgorZmFzdGJvb3Rfc2lnbl90ZXN0X2ltYWdlID0gIiQobG9jYXRpb24gYXZidG9vbCkgYWRkX2hhc2hfZm9vdGVyIC0tc2FsdCAwMCAtLWltYWdlICQob3V0KSAiICsKKyAgICAiLS1wYXJ0aXRpb25fbmFtZSB2ZW5kb3JfYm9vdCAtLXBhcnRpdGlvbl9zaXplICQkKCggMSAqIDEwMjQgKiAxMDI0ICkpIgorCitnZW5ydWxlX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAidGVzdF92ZW5kb3JfYm9vdF9nZW5fZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbInRlc3RfZGF0YV9nZW5fZGVmYXVsdHMiXSwKKyAgICB0b29sczogWworICAgICAgICAiYXZidG9vbCIsCisgICAgICAgICJta2Jvb3RpbWciLAorICAgIF0sCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJ0ZXN0X3ZlbmRvcl9ib290X3YzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X3ZlbmRvcl9ib290X2dlbl9kZWZhdWx0cyJdLAorICAgIG91dDogWyJ0ZXN0X3ZlbmRvcl9ib290X3YzLmltZyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjp0ZXN0X2R0YiIsCisgICAgICAgICI6dGVzdF92ZW5kb3JfcmFtZGlza19ub25lIiwKKyAgICBdLAorICAgIGNtZDogIiQobG9jYXRpb24gbWtib290aW1nKSAtLWhlYWRlcl92ZXJzaW9uIDMgIiArCisgICAgICAgICItLXZlbmRvcl9yYW1kaXNrICQobG9jYXRpb24gOnRlc3RfdmVuZG9yX3JhbWRpc2tfbm9uZSkgIiArCisgICAgICAgICItLWR0YiAkKGxvY2F0aW9uIDp0ZXN0X2R0YikgIiArCisgICAgICAgICItLXZlbmRvcl9ib290ICQob3V0KSAmJiAiICsKKyAgICAgICAgZmFzdGJvb3Rfc2lnbl90ZXN0X2ltYWdlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAidGVzdF92ZW5kb3JfYm9vdF92NF93aXRob3V0X2ZyYWciLAorICAgIGRlZmF1bHRzOiBbInRlc3RfdmVuZG9yX2Jvb3RfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfdmVuZG9yX2Jvb3RfdjRfd2l0aG91dF9mcmFnLmltZyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjp0ZXN0X2R0YiIsCisgICAgICAgICI6dGVzdF92ZW5kb3JfcmFtZGlza19ub25lIiwKKyAgICAgICAgIjp0ZXN0X2Jvb3Rjb25maWciLAorICAgIF0sCisgICAgY21kOiAiJChsb2NhdGlvbiBta2Jvb3RpbWcpIC0taGVhZGVyX3ZlcnNpb24gNCAiICsKKyAgICAgICAgIi0tdmVuZG9yX3JhbWRpc2sgJChsb2NhdGlvbiA6dGVzdF92ZW5kb3JfcmFtZGlza19ub25lKSAiICsKKyAgICAgICAgIi0tZHRiICQobG9jYXRpb24gOnRlc3RfZHRiKSAiICsKKyAgICAgICAgIi0tdmVuZG9yX2Jvb3Rjb25maWcgJChsb2NhdGlvbiA6dGVzdF9ib290Y29uZmlnKSAiICsKKyAgICAgICAgIi0tdmVuZG9yX2Jvb3QgJChvdXQpICYmICIgKworICAgICAgICBmYXN0Ym9vdF9zaWduX3Rlc3RfaW1hZ2UsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJ0ZXN0X3ZlbmRvcl9ib290X3Y0X3dpdGhfZnJhZyIsCisgICAgZGVmYXVsdHM6IFsidGVzdF92ZW5kb3JfYm9vdF9nZW5fZGVmYXVsdHMiXSwKKyAgICBvdXQ6IFsidGVzdF92ZW5kb3JfYm9vdF92NF93aXRoX2ZyYWcuaW1nIl0sCisgICAgc3JjczogWworICAgICAgICAiOnRlc3RfZHRiIiwKKyAgICAgICAgIjp0ZXN0X3ZlbmRvcl9yYW1kaXNrX25vbmUiLAorICAgICAgICAiOnRlc3RfdmVuZG9yX3JhbWRpc2tfcGxhdGZvcm0iLAorICAgICAgICAiOnRlc3RfYm9vdGNvbmZpZyIsCisgICAgXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIG1rYm9vdGltZykgLS1oZWFkZXJfdmVyc2lvbiA0ICIgKworICAgICAgICAiLS1kdGIgJChsb2NhdGlvbiA6dGVzdF9kdGIpICIgKworICAgICAgICAiLS12ZW5kb3JfYm9vdGNvbmZpZyAkKGxvY2F0aW9uIDp0ZXN0X2Jvb3Rjb25maWcpICIgKworICAgICAgICAiLS1yYW1kaXNrX3R5cGUgbm9uZSAtLXJhbWRpc2tfbmFtZSBub25lX3JhbWRpc2sgIiArCisgICAgICAgICItLXZlbmRvcl9yYW1kaXNrX2ZyYWdtZW50ICQobG9jYXRpb24gOnRlc3RfdmVuZG9yX3JhbWRpc2tfbm9uZSkgIiArCisgICAgICAgICItLXJhbWRpc2tfdHlwZSBwbGF0Zm9ybSAtLXJhbWRpc2tfbmFtZSBwbGF0Zm9ybV9yYW1kaXNrICIgKworICAgICAgICAiLS12ZW5kb3JfcmFtZGlza19mcmFnbWVudCAkKGxvY2F0aW9uIDp0ZXN0X3ZlbmRvcl9yYW1kaXNrX3BsYXRmb3JtKSAiICsKKyAgICAgICAgIi0tdmVuZG9yX2Jvb3QgJChvdXQpICYmICIgKworICAgICAgICBmYXN0Ym9vdF9zaWduX3Rlc3RfaW1hZ2UsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJscF9hcGlzX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibGlibHBfYXBpc19mdXp6ZXIuY3BwIiwKKyAgICAgICAgIjpUZXN0UGFydGl0aW9uT3BlbmVyX2dyb3VwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbImxpYmxwX2Z1enpfZGVmYXVsdHMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3BhcnNlIiwKKyAgICBdLAorICAgIGRhdGE6IFsKKyAgICAgICAgIjp0ZXN0X2R0YiIsCisgICAgICAgICI6dGVzdF9ib290Y29uZmlnIiwKKyAgICAgICAgIjp0ZXN0X3ZlbmRvcl9yYW1kaXNrX25vbmUiLAorICAgICAgICAiOnRlc3RfdmVuZG9yX3JhbWRpc2tfcGxhdGZvcm0iLAorICAgICAgICAiOnRlc3RfdmVuZG9yX3JhbWRpc2tfcmVwbGFjZSIsCisgICAgICAgICI6dGVzdF92ZW5kb3JfYm9vdF92MyIsCisgICAgICAgICI6dGVzdF92ZW5kb3JfYm9vdF92NF93aXRob3V0X2ZyYWciLAorICAgICAgICAiOnRlc3RfdmVuZG9yX2Jvb3RfdjRfd2l0aF9mcmFnIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICBdLAorfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2Z1enplci9SRUFETUUubWQgYi9mc19tZ3IvbGlibHAvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTVjNTliCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmxwL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSwxMzAgQEAKKyMgRnV6emVycyBmb3IgbGlibHAKKyMjIFRhYmxlIG9mIGNvbnRlbnRzCisrICBbbGlibHBfYnVpbGRlcl9mdXp6ZXJdKCNCdWlsZGVyKQorKyAgW2xpYmxwX3N1cGVyX2xheW91dF9idWlsZGVyX2Z1enplcl0oI1N1cGVyQnVpbGRlcikKKysgIFtsaWJscF9hcGlzX2Z1enplcl0oI0FQSXMpCisKKyMgPGEgIG5hbWU9IkJ1aWxkZXIiPjwvYT4gRnV6emVyIGZvciBMaWJscEJ1aWxkZXIKKworTGlibHBCdWlsZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIGtBdHRyaWJ1dGVUeXBlcyAocGFyYW1ldGVyIG5hbWU6ICJhdHRyaWJ1dGUiKQorMi4gYmxvY2tEZXZTaXplIChwYXJhbWV0ZXIgbmFtZTogImJsb2NrZGV2X3NpemUiKQorMy4gbWV0YWRhdGFNYXhTaXplIChwYXJhbWV0ZXIgbmFtZTogIm1ldGFkYXRhX21heF9zaXplIikKKzQuIG1ldGFkYXRhU2xvdENvdW50IChwYXJhbWV0ZXIgbmFtZTogIm1ldGFkYXRhX3Nsb3RfY291bnQiKQorNS4gcGFydGl0aW9uTmFtZSAocGFyYW1ldGVyIG5hbWU6ICJwYXJ0aXRpb25fbmFtZSIpCis2LiBzdXBlckJsb2NrRGV2aWNlTmFtZSAocGFyYW1ldGVyIG5hbWU6ICJibG9ja19kZXZpY2VfbmFtZSIpCis3LiBibG9ja0RldmljZUluZm9TaXplIChwYXJhbWV0ZXIgbmFtZTogImJsb2NrX2RldmljZV9pbmZvX3NpemUiKQorOC4gYWxpZ25tZW50IChwYXJhbWV0ZXIgbmFtZTogImFsaWdubWVudCIpCis5LiBhbGlnbm1lbnRPZmZzZXQgKHBhcmFtZXRlciBuYW1lOiAiYWxpZ25tZW50X29mZnNldCIpCisxMC4gbG9naWNhbEJsb2NrU2l6ZSAocGFyYW1ldGVyIG5hbWU6ICJsb2dpY2FsX2Jsb2NrX3NpemUiKQorMTEuIG1heE1ldGFkYXRhU2l6ZSAocGFyYW1ldGVyIG5hbWU6ICJtYXhfbWV0YWRhdGFfc2l6ZSIpCisxMi4gZGV2aWNlSW5kZXggKHBhcmFtZXRlciBuYW1lOiAiZGV2aWNlX2luZGV4IikKKzEzLiBzdGFydCAocGFyYW1ldGVyIG5hbWU6ICJzdGFydCIpCisxNC4gZW5kIChwYXJhbWV0ZXIgbmFtZTogImVuZCIpCisxNS4gYWRkZWRHcm91cE5hbWUgKHBhcmFtZXRlciBuYW1lOiAiZ3JvdXBfbmFtZSIpCisxNi4gcGFydGl0aW9uR3JvdXBOYW1lIChwYXJhbWV0ZXIgbmFtZTogInBhcnRpdGlvbl9uYW1lIikKKzE3LiBudW1TZWN0b3JzIChwYXJhbWV0ZXIgbmFtZTogIm51bV9zZWN0b3JzIikKKzE4LiBwaHlzaWNhbFNlY3RvciAocGFyYW1ldGVyIG5hbWU6ICJwaHlzaWNhbF9zZWN0b3IiKQorMTkuIHJlc2l6ZWRQYXJ0aXRpb25TaXplIChwYXJhbWV0ZXIgbmFtZTogInJlcXVlc3RlZF9zaXplIikKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8YGtBdHRyaWJ1dGVUeXBlc2B8IDEuYExQX1BBUlRJVElPTl9BVFRSX05PTkVgLDxici8+IDIuYExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZYCw8YnIvPiAzLmBMUF9QQVJUSVRJT05fQVRUUl9TTE9UX1NVRkZJWEVEYCw8YnIvPiA0LmBMUF9QQVJUSVRJT05fQVRUUl9VUERBVEVEYCw8YnIvPiA1LmBMUF9QQVJUSVRJT05fQVRUUl9ESVNBQkxFRGB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGJsb2NrRGV2U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwMGB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YG1ldGFkYXRhTWF4U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwYCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YG1ldGFkYXRhU2xvdENvdW50YHwgSW50ZWdlciB2YWx1ZSBmcm9tIGAwYCB0byBgMmAgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBwYXJ0aXRpb25OYW1lYHwgU3RyaW5nIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgc3VwZXJCbG9ja0RldmljZU5hbWVgfCBTdHJpbmcgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBibG9ja0RldmljZUluZm9TaXplYHwgSW50ZWdlciB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGFsaWdubWVudGB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBhbGlnbm1lbnRPZmZzZXRgfCBJbnRlZ2VyIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgbG9naWNhbEJsb2NrU2l6ZWB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBtYXhNZXRhZGF0YVNpemVgfCBJbnRlZ2VyIHZhbHVlIGZyb20gYDBgIHRvIGAxMDAwMGAgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBkZXZpY2VJbmRleGB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBzdGFydGB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBlbmRgfCBJbnRlZ2VyIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgcGFydGl0aW9uR3JvdXBOYW1lYHwgU3RyaW5nIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgbnVtU2VjdG9yc2B8IEludGVnZXIgdmFsdWUgZnJvbSBgMWAgdG8gYDEwMDAwMDBgIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgcGh5c2ljYWxTZWN0b3JgfCBJbnRlZ2VyIHZhbHVlIGZyb20gYDFgIHRvIGAxMDAwMDAwYCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YHJlc2l6ZWRQYXJ0aXRpb25TaXplYHwgSW50ZWdlciB2YWx1ZSBmcm9tIGAwYCB0byBgMTAwMDBgIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKKworIyMjIyBTdGVwcyB0byBydW4KKzEuIEJ1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbGlibHBfYnVpbGRlcl9mdXp6ZXIKK2BgYAorMi4gUnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2xpYmxwX2J1aWxkZXJfZnV6emVyL2xpYmxwX2J1aWxkZXJfZnV6emVyCitgYGAKKworIyA8YSAgbmFtZT0iU3VwZXJCdWlsZGVyIj48L2E+IEZ1enplciBmb3IgTGlibHBTdXBlckxheW91dEJ1aWxkZXIKKworU3VwZXJMYXlvdXRCdWlsZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIGtBdHRyaWJ1dGVUeXBlcyAocGFyYW1ldGVyIG5hbWU6ICJhdHRyaWJ1dGUiKQorMi4gYmxvY2tEZXZTaXplIChwYXJhbWV0ZXIgbmFtZTogImJsb2NrZGV2X3NpemUiKQorMy4gbWV0YWRhdGFNYXhTaXplIChwYXJhbWV0ZXIgbmFtZTogIm1ldGFkYXRhX21heF9zaXplIikKKzQuIHBhcnRpdGlvbk5hbWUgKHBhcmFtZXRlciBuYW1lOiAicGFydGl0aW9uX25hbWUiKQorNS4gZGF0YSAocGFyYW1ldGVyIG5hbWU6ICJkYXRhIikKKzYuIGltYWdlTmFtZSAocGFyYW1ldGVyIG5hbWU6ICJpbWFnZV9uYW1lIikKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8YGtBdHRyaWJ1dGVUeXBlc2B8IDEuYExQX1BBUlRJVElPTl9BVFRSX05PTkVgLDxici8+IDIuYExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZYCw8YnIvPiAzLmBMUF9QQVJUSVRJT05fQVRUUl9TTE9UX1NVRkZJWEVEYCw8YnIvPiA0LmBMUF9QQVJUSVRJT05fQVRUUl9VUERBVEVEYCw8YnIvPiA1LmBMUF9QQVJUSVRJT05fQVRUUl9ESVNBQkxFRGB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGJsb2NrRGV2U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwMGB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YG1ldGFkYXRhTWF4U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwYCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YHBhcnRpdGlvbk5hbWVgfCBTdHJpbmcgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBkYXRhYHwgU3RyaW5nIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgaW1hZ2VOYW1lYHwgU3RyaW5nIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKKworIyMjIyBTdGVwcyB0byBydW4KKzEuIEJ1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbGlibHBfc3VwZXJfbGF5b3V0X2J1aWxkZXJfZnV6emVyCitgYGAKKzIuIFJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9saWJscF9zdXBlcl9sYXlvdXRfYnVpbGRlcl9mdXp6ZXIvbGlibHBfc3VwZXJfbGF5b3V0X2J1aWxkZXJfZnV6emVyCitgYGAKKworIyA8YSAgbmFtZT0iQVBJcyI+PC9hPiBGdXp6ZXIgZm9yIExpYmxwQXBpcworCitMaWJscEFQSXMgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gYmxvY2tEZXZpY2VJbmZvU2l6ZSAocGFyYW1ldGVyIG5hbWU6ICJibG9ja19kZXZpY2VfaW5mb19zaXplIikKKzIuIGFsaWdubWVudCAocGFyYW1ldGVyIG5hbWU6ICJhbGlnbm1lbnQiKQorMy4gYWxpZ25tZW50T2Zmc2V0IChwYXJhbWV0ZXIgbmFtZTogImFsaWdubWVudF9vZmZzZXQiKQorNC4gbG9naWNhbEJsb2NrU2l6ZSAocGFyYW1ldGVyIG5hbWU6ICJsb2dpY2FsX2Jsb2NrX3NpemUiKQorNS4gYmxvY2tEZXZTaXplIChwYXJhbWV0ZXIgbmFtZTogImJsb2NrZGV2X3NpemUiKQorNi4gbWV0YWRhdGFNYXhTaXplIChwYXJhbWV0ZXIgbmFtZTogIm1ldGFkYXRhX21heF9zaXplIikKKzcuIGJsb2NrRGV2aWNlSW5mb05hbWUgKHBhcmFtZXRlciBuYW1lOiAiYmxvY2tfZGV2aWNlX2luZm9fbmFtZSIpCis4LiBudW1TZWN0b3JzIChwYXJhbWV0ZXIgbmFtZTogIm51bV9zZWN0b3JzIikKKzkuIHBoeXNpY2FsU2VjdG9yIChwYXJhbWV0ZXIgbmFtZTogInBoeXNpY2FsX3NlY3RvciIpCisxMC4gc3BhcnNpZnkgKHBhcmFtZXRlciBuYW1lOiAic3BhcnNpZnkiKQorMTEuIGJ1ZmZlciAocGFyYW1ldGVyIG5hbWU6ICJkYXRhIikKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8YGJsb2NrRGV2aWNlSW5mb1NpemVgfCBJbnRlZ2VyIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgYWxpZ25tZW50YHwgSW50ZWdlciB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGFsaWdubWVudE9mZnNldGB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBsb2dpY2FsQmxvY2tTaXplYHwgSW50ZWdlciB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGJsb2NrRGV2U2l6ZWB8IEludGVnZXIgdmFsdWUgaW4gbXVsdGlwbGVzIG9mIGBMUF9TRUNUT1JfU0laRWB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YG1ldGFkYXRhTWF4U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwYCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGJsb2NrRGV2aWNlSW5mb05hbWVgfCBTdHJpbmcgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBudW1TZWN0b3JzYHwgSW50ZWdlciB2YWx1ZSBmcm9tIGAxYCB0byBgMTAwMDAwMGAgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBwaHlzaWNhbFNlY3RvcmB8IEludGVnZXIgdmFsdWUgZnJvbSBgMWAgdG8gYDEwMDAwMDBgIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgYWxpZ25tZW50YHwgQm9vbCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGFsaWdubWVudGB8IFZlY3RvciB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8CisKKyMjIyMgU3RlcHMgdG8gcnVuCisxLiBCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGxpYmxwX2FwaXNfZnV6emVyCitgYGAKKzIuIFJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9saWJscF9hcGlzX2Z1enplci9saWJscF9hcGlzX2Z1enplcgorYGBgCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvZnV6emVyL2ltYWdlX2dlbl9yYW5kLnB5IGIvZnNfbWdyL2xpYmxwL2Z1enplci9pbWFnZV9nZW5fcmFuZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTg1NDcyCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmxwL2Z1enplci9pbWFnZV9nZW5fcmFuZC5weQpAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIgorV3JpdGUgZ2l2ZW4gbnVtYmVyIG9mIHJhbmRvbSBieXRlcywgZ2VuZXJhdGVkIHdpdGggb3B0aW9uYWwgc2VlZC4KKyIiIgorCitpbXBvcnQgcmFuZG9tLCBhcmdwYXJzZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNlZWQnLCBoZWxwPSdTZWVkIHRvIHJhbmRvbSBnZW5lcmF0b3InKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWxlbmd0aCcsIHR5cGU9aW50LCByZXF1aXJlZD1UcnVlLCBoZWxwPSdMZW5ndGggb2Ygb3V0cHV0JykKKyAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICBpZiBhcmdzLnNlZWQ6CisgICAgcmFuZG9tLnNlZWQoYXJncy5zZWVkKQorCisgIHByaW50KCcnLmpvaW4oY2hyKHJhbmRvbS5yYW5kcmFuZ2UoMCwweGZmKSkgZm9yIF8gaW4gcmFuZ2UoYXJncy5sZW5ndGgpKSkKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9mdXp6ZXIvbGlibHBfYXBpc19mdXp6ZXIuY3BwIGIvZnNfbWdyL2xpYmxwL2Z1enplci9saWJscF9hcGlzX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxOTJlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJscC9mdXp6ZXIvbGlibHBfYXBpc19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaWJscC9idWlsZGVyLmg+CisjaW5jbHVkZSA8bGlibHAvcGFydGl0aW9uX29wZW5lci5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWZkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDx3cml0ZXIuaD4KKyNpbmNsdWRlICJpbWFnZXMuaCIKKyNpbmNsdWRlICJ0ZXN0X3BhcnRpdGlvbl9vcGVuZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIHVuaXF1ZV9mZCA9IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0Rpc2tTaXplID0gMTMxMDcyOworc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01ldGFkYXRhU2l6ZSA9IDUxMjsKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNZXRhZGF0YVNsb3RzID0gMjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heEJ5dGVzID0gMjA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtWYWxpZEFsaWdubWVudCA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtWYWxpZEFsaWdubWVudE9mZnNldCA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtWYWxpZExvZ2ljYWxCbG9ja1NpemUgPSA0MDk2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluTWV0YWRhdGFTaXplID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heE1ldGFkYXRhU2l6ZSA9IDEwMDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluRmFjdG9yID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heEZhY3RvciA9IDEwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWV0YWRhdGFHZW9tZXRyeVNpemUgPSA0MDk2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVmFsaWROdW1TZWN0b3JzID0gMTkwMTU2ODsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1ZhbGlkUGh5c2ljYWxTZWN0b3IgPSAzNjA4NTc2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWluU2VjdG9yVmFsdWUgPSAxOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWF4U2VjdG9yVmFsdWUgPSAxMDAwMDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWF4QnVmZmVyU2l6ZSA9IDEwMDAwMDsKKworY29uc3Qgc3RyaW5nIGtJbWFnZUZpbGUgPSAiaW1hZ2VfZmlsZSI7Citjb25zdCBzdHJpbmcga1N1cGVyTmFtZSA9ICJzdXBlciI7Citjb25zdCBzdHJpbmcga1N5c3RlbVBhcnRpdGlvbk5hbWUgPSAic3lzdGVtIjsKK2NvbnN0IHN0cmluZyBrUGFydGl0aW9uTmFtZSA9ICJidWlsZGVyX3BhcnRpdGlvbiI7Citjb25zdCBzdHJpbmcga1N1cGVyUGFydGl0aW9uTmFtZSA9ICJzdXBlcl9wYXJ0aXRpb24iOworCitjb25zdCBzdHJpbmcga1N1ZmZpeFtdID0geyJfYSIsICJfYiIsICJhIiwgImIifTsKKworY2xhc3MgTGlwbHBBcGlzRnV6emVyIHsKKyAgcHVibGljOgorICAgIExpcGxwQXBpc0Z1enplcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgOiBtRmRwKGRhdGEsIHNpemUpe307CisgICAgdm9pZCBwcm9jZXNzKCk7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHNldHVwQnVpbGRlcigpOworICAgIEJsb2NrRGV2aWNlSW5mbyBnZXRCbG9ja0RldmljZSgpOworICAgIEZ1enplZERhdGFQcm92aWRlciBtRmRwOworICAgIHVuaXF1ZV9wdHI8TWV0YWRhdGFCdWlsZGVyPiBtQnVpbGRlcjsKKyAgICBzdHJpbmcgbUJsb2NrRGV2aWNlSW5mb05hbWU7CisgICAgc3RyaW5nIG1TdXBlclBhcnRpdGlvbk5hbWU7CisgICAgc3RyaW5nIG1QYXJ0aXRpb25OYW1lOworICAgIGNvbnN0IHN0cmluZyBtSW1hZ2VQYXRoc1sxMF0gPSB7CisgICAgICAgICAgICAiZGF0YS90ZXN0X2R0Yi5pbWciLAorICAgICAgICAgICAgImRhdGEvdGVzdF9ib290Y29uZmlnLmltZyIsCisgICAgICAgICAgICAiZGF0YS90ZXN0X3ZlbmRvcl9yYW1kaXNrX25vbmUuaW1nIiwKKyAgICAgICAgICAgICJkYXRhL3Rlc3RfdmVuZG9yX3JhbWRpc2tfcGxhdGZvcm0uaW1nIiwKKyAgICAgICAgICAgICJkYXRhL3Rlc3RfdmVuZG9yX3JhbWRpc2tfcmVwbGFjZS5pbWciLAorICAgICAgICAgICAgImRhdGEvdGVzdF92ZW5kb3JfYm9vdF92NF93aXRoX2ZyYWcuaW1nIiwKKyAgICAgICAgICAgICJkYXRhL3Rlc3RfdmVuZG9yX2Jvb3RfdjRfd2l0aG91dF9mcmFnLmltZyIsCisgICAgICAgICAgICAiZGF0YS90ZXN0X3ZlbmRvcl9ib290X3YzLmltZyIsCisgICAgICAgICAgICAiZGV2L251bGwiLAorICAgICAgICAgICAgbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyksCisgICAgfTsKK307CisKK0Jsb2NrRGV2aWNlSW5mbyBMaXBscEFwaXNGdXp6ZXI6OmdldEJsb2NrRGV2aWNlKCkgeworICAgIG1CbG9ja0RldmljZUluZm9OYW1lID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IGtTdXBlck5hbWUgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICB1aW50NjRfdCBibG9ja0RldmljZUluZm9TaXplID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIDoga0Rpc2tTaXplOworICAgIHVpbnQzMl90IGFsaWdubWVudCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpIDoga1ZhbGlkQWxpZ25tZW50OworICAgIHVpbnQzMl90IGFsaWdubWVudE9mZnNldCA9CisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSA6IGtWYWxpZEFsaWdubWVudE9mZnNldDsKKyAgICB1aW50MzJfdCBsb2dpY2FsQmxvY2tTaXplID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpIDoga1ZhbGlkTG9naWNhbEJsb2NrU2l6ZTsKKworICAgIEJsb2NrRGV2aWNlSW5mbyBzdXBlckluZm97bUJsb2NrRGV2aWNlSW5mb05hbWUsIGJsb2NrRGV2aWNlSW5mb1NpemUsIGFsaWdubWVudCwgYWxpZ25tZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbEJsb2NrU2l6ZX07CisgICAgcmV0dXJuIHN1cGVySW5mbzsKK30KKwordm9pZCBMaXBscEFwaXNGdXp6ZXI6OnNldHVwQnVpbGRlcigpIHsKKyAgICB1aW50NjRfdCByYW5kb21CbG9ja0RldlNpemUgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ2NF90PihrTWluRmFjdG9yLCBrTWF4RmFjdG9yKSAqIExQX1NFQ1RPUl9TSVpFOworICAgIHVpbnQ2NF90IGJsb2NrRGV2U2l6ZSA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IHJhbmRvbUJsb2NrRGV2U2l6ZSA6IGtEaXNrU2l6ZTsKKyAgICB1aW50MzJfdCByYW5kb21NZXRhZGF0YU1heFNpemUgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluTWV0YWRhdGFTaXplLCBrTWF4TWV0YWRhdGFTaXplKTsKKyAgICB1aW50MzJfdCBtZXRhZGF0YU1heFNpemUgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBrTWV0YWRhdGFTaXplIDogcmFuZG9tTWV0YWRhdGFNYXhTaXplOworICAgIHVpbnQzMl90IG1ldGFkYXRhU2xvdENvdW50ID0gbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDE7CisgICAgbUJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhibG9ja0RldlNpemUsIG1ldGFkYXRhTWF4U2l6ZSwgbWV0YWRhdGFTbG90Q291bnQpOworCisgICAgaWYgKG1CdWlsZGVyLmdldCgpKSB7CisgICAgICAgIG1CdWlsZGVyLT5BZGRQYXJ0aXRpb24oa1N5c3RlbVBhcnRpdGlvbk5hbWUsIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKworICAgICAgICBtUGFydGl0aW9uTmFtZSA9CisgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcykgOiBrUGFydGl0aW9uTmFtZTsKKyAgICAgICAgaWYgKCFtUGFydGl0aW9uTmFtZS5zaXplKCkpIHsKKyAgICAgICAgICAgIG1QYXJ0aXRpb25OYW1lID0ga1BhcnRpdGlvbk5hbWU7CisgICAgICAgIH0KKyAgICAgICAgbVN1cGVyUGFydGl0aW9uTmFtZSA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrU3VwZXJQYXJ0aXRpb25OYW1lOworICAgICAgICBpZiAoIW1TdXBlclBhcnRpdGlvbk5hbWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBtU3VwZXJQYXJ0aXRpb25OYW1lID0ga1N1cGVyUGFydGl0aW9uTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFBhcnRpdGlvbiogc3VwZXIgPSBtQnVpbGRlci0+QWRkUGFydGl0aW9uKG1TdXBlclBhcnRpdGlvbk5hbWUsIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKyAgICAgICAgbUJ1aWxkZXItPkFkZFBhcnRpdGlvbihtUGFydGl0aW9uTmFtZSwgTFBfUEFSVElUSU9OX0FUVFJfUkVBRE9OTFkpOworCisgICAgICAgIGlmIChzdXBlcikgeworICAgICAgICAgICAgaW50NjRfdCBudW1TZWN0b3JzID0gbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01pblNlY3RvclZhbHVlLCBrTWF4U2VjdG9yVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrVmFsaWROdW1TZWN0b3JzOworICAgICAgICAgICAgaW50NjRfdCBwaHlzaWNhbFNlY3RvciA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWluU2VjdG9yVmFsdWUsIGtNYXhTZWN0b3JWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrVmFsaWRQaHlzaWNhbFNlY3RvcjsKKyAgICAgICAgICAgIG1CdWlsZGVyLT5BZGRMaW5lYXJFeHRlbnQoc3VwZXIsIG1CbG9ja0RldmljZUluZm9OYW1lLCBudW1TZWN0b3JzLCBwaHlzaWNhbFNlY3Rvcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTGlwbHBBcGlzRnV6emVyOjpwcm9jZXNzKCkgeworICAgIEJsb2NrRGV2aWNlSW5mbyBzdXBlckluZm8gPSBnZXRCbG9ja0RldmljZSgpOworICAgIHVuaXF1ZV9mZCBmZChzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCAiaW1hZ2VfZmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKSk7CisgICAgc2V0dXBCdWlsZGVyKCk7CisKKyAgICBUZXN0UGFydGl0aW9uT3BlbmVyIG9wZW5lcigKKyAgICAgICAgICAgIHt7bUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcykgOiBrU3VwZXJOYW1lLCBmZH19LAorICAgICAgICAgICAge3ttRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSA6IGtTdXBlck5hbWUsCisgICAgICAgICAgICAgIHN1cGVySW5mb319KTsKKworICAgIGlmIChtQnVpbGRlci5nZXQoKSkgeworICAgICAgICB1bmlxdWVfcHRyPExwTWV0YWRhdGE+IG1ldGFkYXRhID0gbUJ1aWxkZXItPkV4cG9ydCgpOworICAgICAgICBjb25zdCBMcE1ldGFkYXRhJiBtZXRhZGF0YVZhbHVlID0gKm1ldGFkYXRhLmdldCgpOworCisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gaW1hZ2VzID0ge307CisgICAgICAgIGlmIChtRmRwLkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgICAgIGltYWdlc1ttU3VwZXJQYXJ0aXRpb25OYW1lXSA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheShtSW1hZ2VQYXRocyk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAobUZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICAgICAgYXV0byBpbnZva2VBUElzID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5PGNvbnN0IGZ1bmN0aW9uPHZvaWQoKT4+KHsKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBXcml0ZVRvSW1hZ2VGaWxlKGZkLCBtZXRhZGF0YVZhbHVlKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBXcml0ZVRvSW1hZ2VGaWxlKGtJbWFnZUZpbGUuY19zdHIoKSwgbWV0YWRhdGFWYWx1ZSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgRmxhc2hQYXJ0aXRpb25UYWJsZShvcGVuZXIsIGtTdXBlck5hbWUsIG1ldGFkYXRhVmFsdWUpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVQYXJ0aXRpb25UYWJsZShvcGVuZXIsIG1QYXJ0aXRpb25OYW1lLCBtZXRhZGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDEgLyogc2xvdF9udW1iZXIgKi8pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWFkTWV0YWRhdGEobVBhcnRpdGlvbk5hbWUsIG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxIC8qIHNsb3RfbnVtYmVyICovKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBGbGFzaFBhcnRpdGlvblRhYmxlKG1QYXJ0aXRpb25OYW1lLCBtZXRhZGF0YVZhbHVlKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlUGFydGl0aW9uVGFibGUobVBhcnRpdGlvbk5hbWUsIG1ldGFkYXRhVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyAwIDogMSAvKiBzbG90X251bWJlciAqLyk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlVG9JbWFnZUZpbGUoa0ltYWdlRmlsZS5jX3N0cigpLCBtZXRhZGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS0+Z2VvbWV0cnkubG9naWNhbF9ibG9ja19zaXplLCBpbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IHRydWUgOiBmYWxzZSAvKiBzcGFyc2lmeSAqLyk7CisgICAgICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTcGxpdEltYWdlRmlsZXMoa0ltYWdlRmlsZS5jX3N0cigpLCBtZXRhZGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEtPmdlb21ldHJ5LmxvZ2ljYWxfYmxvY2tfc2l6ZSwgaW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gdHJ1ZSA6IGZhbHNlIC8qIHNwYXJzaWZ5ICovKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBSZWFkRnJvbUltYWdlRmlsZShrSW1hZ2VGaWxlLmNfc3RyKCkpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IElzRW1wdHlTdXBlckltYWdlKGtJbWFnZUZpbGUuY19zdHIoKSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlclNpemUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICoga01ldGFkYXRhR2VvbWV0cnlTaXplLCBrTWF4QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gYnVmZmVyID0gbUZkcC5Db25zdW1lQnl0ZXM8dWludDhfdD4oa01heEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWFkRnJvbUltYWdlQmxvYihidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ3JvdXBWZWN0b3JTaXplID0gbWV0YWRhdGEtPmdyb3Vwcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5kb21Hcm91cEluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigwLCBncm91cFZlY3RvclNpemUgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcnRpdGlvbkdyb3VwTmFtZShtZXRhZGF0YS0+Z3JvdXBzW3JhbmRvbUdyb3VwSW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmxvY2tEZXZpY2VWZWN0b3JTaXplID0gbWV0YWRhdGEtPmJsb2NrX2RldmljZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZG9tQmxvY2tEZXZpY2VJbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMCwgYmxvY2tEZXZpY2VWZWN0b3JTaXplIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXRCbG9ja0RldmljZVBhcnRpdGlvbk5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLT5ibG9ja19kZXZpY2VzW3JhbmRvbUJsb2NrRGV2aWNlSW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBHZXRNZXRhZGF0YVN1cGVyQmxvY2tEZXZpY2UobWV0YWRhdGFWYWx1ZSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXggPSBtRmRwLkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbUZkcC5QaWNrVmFsdWVJbkFycmF5PHN0cmluZz4oa1N1ZmZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG90TnVtYmVyRm9yU2xvdFN1ZmZpeChzdWZmaXgpOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGVudHJ5ID0gRmluZFBhcnRpdGlvbihtZXRhZGF0YVZhbHVlLCBrU3lzdGVtUGFydGl0aW9uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJ0aXRpb25TaXplKG1ldGFkYXRhVmFsdWUsICplbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgR2V0UGFydGl0aW9uU2xvdFN1ZmZpeChtUGFydGl0aW9uTmFtZSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgRmluZFBhcnRpdGlvbihtZXRhZGF0YVZhbHVlLCBtUGFydGl0aW9uTmFtZSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcnRpdGlvblZlY3RvclNpemUgPSBtZXRhZGF0YS0+cGFydGl0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5kb21QYXJ0aXRpb25JbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMCwgcGFydGl0aW9uVmVjdG9yU2l6ZSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFydGl0aW9uTmFtZShtZXRhZGF0YS0+cGFydGl0aW9uc1tyYW5kb21QYXJ0aXRpb25JbmRleF0pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IEdldFRvdGFsU3VwZXJQYXJ0aXRpb25TaXplKG1ldGFkYXRhVmFsdWUpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IEdldEJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZXMobWV0YWRhdGFWYWx1ZSk7IH0sCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGludm9rZUFQSXMoKTsKKyAgICAgICAgfQorICAgICAgICByZW1vdmUoa0ltYWdlRmlsZS5jX3N0cigpKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBMaXBscEFwaXNGdXp6ZXIgbGlwbHBBcGlzRnV6emVyKGRhdGEsIHNpemUpOworICAgIGxpcGxwQXBpc0Z1enplci5wcm9jZXNzKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvZnV6emVyL2xpYmxwX2J1aWxkZXJfZnV6emVyLmNwcCBiL2ZzX21nci9saWJscC9mdXp6ZXIvbGlibHBfYnVpbGRlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDlhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlibHAvZnV6emVyL2xpYmxwX2J1aWxkZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGlibHAvYnVpbGRlci5oPgorI2luY2x1ZGUgPGxpYmxwL3Byb3BlcnR5X2ZldGNoZXIuaD4KKyNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVmFsaWRCbG9ja1NpemUgPSA0MDk2ICogNTA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtCbG9ja0RldmljZUluZm9TaXplID0gMTAyNCAqIDEwMjQ7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtWYWxpZEJsb2NrRGV2aWNlSW5mb1NpemUgPSA4X0dpQjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1ZhbGlkTWF4R3JvdXBTaXplID0gNDA5NjA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5CbG9ja0RldlZhbHVlID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga01heEJsb2NrRGV2VmFsdWUgPSAxMDAwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5TZWN0b3JWYWx1ZSA9IDE7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNYXhTZWN0b3JWYWx1ZSA9IDEwMDAwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5WYWx1ZSA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNYXhWYWx1ZSA9IDEwMDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVmFsaWROdW1TZWN0b3JzID0gMTkwMTU2ODsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1ZhbGlkUGh5c2ljYWxTZWN0b3IgPSAzNjA4NTc2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWluRWxlbWVudHMgPSAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWF4RWxlbWVudHMgPSAxMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1ZhbGlkQWxpZ25tZW50ID0gNzg2NDMyOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrVmFsaWRNZXRhZGF0YVNpemUgPSA0MDk2MDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1ZhbGlkQWxpZ25tZW50T2Zmc2V0ID0gMjI5Mzc2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrVmFsaWRMb2dpY2FsQmxvY2tTaXplID0gNDA5NjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1ZhbGlkTWF4TWV0YWRhdGFTaXplID0gNjU1MzY7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNaW5NZXRhZGF0YVZhbHVlID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heE1ldGFkYXRhVmFsdWUgPSAxMDAwMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1plcm9BbGlnbm1lbnQgPSAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrWmVyb0FsaWdubWVudE9mZnNldCA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhCeXRlcyA9IDIwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluQnVpbGRlciA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhCdWlsZGVyID0gNDsKKworY29uc3QgdWludDY0X3Qga0F0dHJpYnV0ZVR5cGVzW10gPSB7CisgICAgICAgIExQX1BBUlRJVElPTl9BVFRSX05PTkUsICAgIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZLCBMUF9QQVJUSVRJT05fQVRUUl9TTE9UX1NVRkZJWEVELAorICAgICAgICBMUF9QQVJUSVRJT05fQVRUUl9VUERBVEVELCBMUF9QQVJUSVRJT05fQVRUUl9ESVNBQkxFRCwKK307CisKK2NvbnN0IHN0cmluZyBrRnV6elBhcnRpdGlvbk5hbWUgPSAiZnV6el9wYXJ0aXRpb25fbmFtZSI7Citjb25zdCBzdHJpbmcga1N1cGVyUGFydGl0aW9uTmFtZSA9ICJzdXBlcl9wYXJ0aXRpb24iOworY29uc3Qgc3RyaW5nIGtEZXZpY2VJbmZvTmFtZSA9ICJzdXBlciI7Citjb25zdCBzdHJpbmcga0RlZmF1bHRHcm91cE5hbWUgPSAiZGVmYXVsdCI7CisKK2NsYXNzIEJ1aWxkZXJGdXp6ZXIgeworICBwdWJsaWM6CisgICAgQnVpbGRlckZ1enplcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgOiBtRmRwKGRhdGEsIHNpemUpe307CisgICAgdm9pZCBwcm9jZXNzKCk7CisKKyAgcHJpdmF0ZToKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgbUZkcDsKKyAgICB2b2lkIGludm9rZUJ1aWxkZXJBUElzKCk7CisgICAgdm9pZCBzZWxlY3RSYW5kb21CdWlsZGVyKGludDMyX3QgcmFuZG9tQnVpbGRlciwgc3RyaW5nIHN1cGVyQmxvY2tEZXZpY2VOYW1lKTsKKyAgICB2b2lkIHNldHVwQnVpbGRlcihzdHJpbmcgc3VwZXJCbG9ja0RldmljZU5hbWUpOworICAgIHZvaWQgY2FsbENoYW5nZVBhcnRpdGlvbkdyb3VwKCk7CisgICAgdm9pZCBjYWxsVmVyaWZ5RXh0ZW50c0FnYWluc3RTb3VyY2VNZXRhZGF0YSgpOworICAgIHZlY3RvcjxCbG9ja0RldmljZUluZm8+IG1CbG9ja0RldmljZXM7CisgICAgdW5pcXVlX3B0cjxNZXRhZGF0YUJ1aWxkZXI+IG1CdWlsZGVyOworICAgIHN0cmluZyBtUmVzaXplUGFydGl0aW9uTmFtZTsKKyAgICBzdHJpbmcgbUdyb3VwTmFtZXNbNF0gPSB7CisgICAgICAgICAgICAiZGVmYXVsdCIsCisgICAgICAgICAgICAiZ3JvdXBfYSIsCisgICAgICAgICAgICAiZ3JvdXBfYiIsCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSwKKyAgICB9OworICAgIHN0cmluZyBtUGFydGl0aW9uTmFtZXNbNV0gPSB7CisgICAgICAgICAgICAic3lzdGVtX2EiLAorICAgICAgICAgICAgInZlbmRvcl9hIiwKKyAgICAgICAgICAgICJzeXN0ZW1fYiIsCisgICAgICAgICAgICAidmVuZG9yX2IiLAorICAgICAgICAgICAgbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyksCisgICAgfTsKKyAgICBQYXJ0aXRpb24qIG1QYXJ0aXRpb247CisgICAgUGFydGl0aW9uKiBtRnV6elBhcnRpdGlvbjsKKyAgICBQYXJ0aXRpb24qIG1SZXNpemVQYXJ0aXRpb247CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgVCBnZXRQYXJhbVZhbHVlKFQgdmFsaWRWYWx1ZSkgeworICAgICAgICBUIHBhcmFtZXRlciA9IHZhbGlkVmFsdWU7CisgICAgICAgIGlmIChtRmRwLkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlciA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxUPihrTWluVmFsdWUsIGtNYXhWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICB9Cit9OworCit2b2lkIEJ1aWxkZXJGdXp6ZXI6OnNlbGVjdFJhbmRvbUJ1aWxkZXIoaW50MzJfdCByYW5kb21CdWlsZGVyLCBzdHJpbmcgc3VwZXJCbG9ja0RldmljZU5hbWUpIHsKKyAgICBzd2l0Y2ggKHJhbmRvbUJ1aWxkZXIpIHsKKyAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICB1aW50MzJfdCBtYXhNZXRhZGF0YVNpemUgPSBnZXRQYXJhbVZhbHVlKGtWYWxpZE1heE1ldGFkYXRhU2l6ZSk7CisgICAgICAgICAgICB1aW50MzJfdCBudW1TbG90cyA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxOworICAgICAgICAgICAgbUJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhtQmxvY2tEZXZpY2VzLCBzdXBlckJsb2NrRGV2aWNlTmFtZSwgbWF4TWV0YWRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TbG90cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrRGV2U2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oa01pbkJsb2NrRGV2VmFsdWUsIGtNYXhCbG9ja0RldlZhbHVlKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhTWF4U2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oa01pbk1ldGFkYXRhVmFsdWUsIGtNYXhNZXRhZGF0YVZhbHVlKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2xvdENvdW50ID0gbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDE7CisgICAgICAgICAgICBtQnVpbGRlciA9IE1ldGFkYXRhQnVpbGRlcjo6TmV3KGJsb2NrRGV2U2l6ZSwgbWV0YWRhdGFNYXhTaXplLCBtZXRhZGF0YVNsb3RDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrRGV2U2l6ZSA9IGdldFBhcmFtVmFsdWUoa1ZhbGlkQmxvY2tTaXplKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9IGdldFBhcmFtVmFsdWUoa1ZhbGlkTWV0YWRhdGFTaXplKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2xvdENvdW50ID0gbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDE7CisgICAgICAgICAgICBtQnVpbGRlciA9IE1ldGFkYXRhQnVpbGRlcjo6TmV3KGJsb2NrRGV2U2l6ZSwgbWV0YWRhdGFTaXplLCBtZXRhZGF0YVNsb3RDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgIHN0cmluZyBzdXBlclBhcnRpdGlvbk5hbWUgPSBtRmRwLkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ga1N1cGVyUGFydGl0aW9uTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICAgICAgICAgIG1CdWlsZGVyID0gTWV0YWRhdGFCdWlsZGVyOjpOZXcoUGFydGl0aW9uT3BlbmVyKCksIHN1cGVyUGFydGl0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDAsIDEpIC8qIHNsb3RfbnVtYmVyICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgNDogeworICAgICAgICAgICAgc3RyaW5nIHN1cGVyUGFydGl0aW9uTmFtZSA9IG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBrU3VwZXJQYXJ0aXRpb25OYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpOworICAgICAgICAgICAgbUJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldygKKyAgICAgICAgICAgICAgICAgICAgc3VwZXJQYXJ0aXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIDEpIC8qIHNsb3RfbnVtYmVyICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJ1aWxkZXJGdXp6ZXI6OnNldHVwQnVpbGRlcihzdHJpbmcgc3VwZXJCbG9ja0RldmljZU5hbWUpIHsKKyAgICB1aW50NjRfdCBibG9ja0RldmljZUluZm9TaXplID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIDoga1ZhbGlkQmxvY2tEZXZpY2VJbmZvU2l6ZTsKKyAgICB1aW50MzJfdCBhbGlnbm1lbnQgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSA6IGtWYWxpZEFsaWdubWVudDsKKyAgICB1aW50MzJfdCBhbGlnbm1lbnRPZmZzZXQgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkgOiBrVmFsaWRBbGlnbm1lbnRPZmZzZXQ7CisgICAgdWludDMyX3QgbG9naWNhbEJsb2NrU2l6ZSA9CisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSA6IGtWYWxpZExvZ2ljYWxCbG9ja1NpemU7CisgICAgQmxvY2tEZXZpY2VJbmZvIHN1cGVyKHN1cGVyQmxvY2tEZXZpY2VOYW1lLCBibG9ja0RldmljZUluZm9TaXplLCBhbGlnbm1lbnQsIGFsaWdubWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbEJsb2NrU2l6ZSk7CisgICAgbUJsb2NrRGV2aWNlcy5wdXNoX2JhY2soc3VwZXIpOworCisgICAgbUJ1aWxkZXItPkFkZEdyb3VwKGtEZWZhdWx0R3JvdXBOYW1lLCBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBtYXhfc2l6ZSAqLyk7CisgICAgbVBhcnRpdGlvbiA9IG1CdWlsZGVyLT5BZGRQYXJ0aXRpb24oa1N1cGVyUGFydGl0aW9uTmFtZSwgTFBfUEFSVElUSU9OX0FUVFJfUkVBRE9OTFkpOworCisgICAgbUZ1enpQYXJ0aXRpb24gPSBtQnVpbGRlci0+QWRkUGFydGl0aW9uKGtGdXp6UGFydGl0aW9uTmFtZSwga0RlZmF1bHRHcm91cE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKworICAgIHN0cmluZyBtUmVzaXplUGFydGl0aW9uTmFtZSA9IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpOworICAgIGlmICghbVJlc2l6ZVBhcnRpdGlvbk5hbWUuc2l6ZSgpKSB7CisgICAgICAgIG1SZXNpemVQYXJ0aXRpb25OYW1lID0gInJlc2l6ZV9wYXJ0aXRpb24iOworICAgIH0KKyAgICBtUmVzaXplUGFydGl0aW9uID0gbUJ1aWxkZXItPkFkZFBhcnRpdGlvbihtUmVzaXplUGFydGl0aW9uTmFtZSwga0RlZmF1bHRHcm91cE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBfUEFSVElUSU9OX0FUVFJfUkVBRE9OTFkpOworCisgICAgc3RyaW5nIGNoYW5nZVBhcnRpdGlvbkRldmljZUluZm9OYW1lID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IGtEZXZpY2VJbmZvTmFtZSA6IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpOworICAgIEJsb2NrRGV2aWNlSW5mbyBjaGFuZ2VQYXJ0aXRpb25EZXZpY2VJbmZvKAorICAgICAgICAgICAgY2hhbmdlUGFydGl0aW9uRGV2aWNlSW5mb05hbWUsCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSA6IGtCbG9ja0RldmljZUluZm9TaXplIC8qIHNpemUgKi8sCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga1plcm9BbGlnbm1lbnRPZmZzZXQgLyogYWxpZ25tZW50ICovLAorICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtaZXJvQWxpZ25tZW50T2Zmc2V0IC8qIGFsaWdubWVudF9vZmZzZXQgKi8sCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga1ZhbGlkTG9naWNhbEJsb2NrU2l6ZSAvKiBsb2dpY2FsX2Jsb2NrX3NpemUgKi8pOworICAgIG1CbG9ja0RldmljZXMucHVzaF9iYWNrKGNoYW5nZVBhcnRpdGlvbkRldmljZUluZm8pOworfQorCit2b2lkIEJ1aWxkZXJGdXp6ZXI6OmNhbGxDaGFuZ2VQYXJ0aXRpb25Hcm91cCgpIHsKKyAgICBzdHJpbmcgZ3JvdXAxID0gbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcykgOiAiZ3JvdXAxIjsKKyAgICB1aW50NjRfdCBncm91cDFTaXplID0gZ2V0UGFyYW1WYWx1ZSgwKTsKKworICAgIHN0cmluZyBncm91cDIgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSA6ICJncm91cDIiOworICAgIHVpbnQ2NF90IGdyb3VwMlNpemUgPSBnZXRQYXJhbVZhbHVlKDApOworCisgICAgYm9vbCBncm91cDFBZGRlZCA9IG1CdWlsZGVyLT5BZGRHcm91cChncm91cDEsIGdyb3VwMVNpemUpOworICAgIGJvb2wgZ3JvdXAyQWRkZWQgPSBtQnVpbGRlci0+QWRkR3JvdXAoZ3JvdXAyLCBncm91cDJTaXplKTsKKworICAgIHN0cmluZyBjaGFuZ2VHcm91cFBhcnRpdGlvbk5hbWUgPSBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICBpZiAoY2hhbmdlR3JvdXBQYXJ0aXRpb25OYW1lLnNpemUoKSAmJiBncm91cDFBZGRlZCAmJiBncm91cDJBZGRlZCkgeworICAgICAgICBQYXJ0aXRpb24qIGNoYW5nZUdyb3VwUGFydGl0aW9uID0gbUJ1aWxkZXItPkFkZFBhcnRpdGlvbihjaGFuZ2VHcm91cFBhcnRpdGlvbk5hbWUsIGdyb3VwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBfUEFSVElUSU9OX0FUVFJfUkVBRE9OTFkpOworICAgICAgICBpZiAoY2hhbmdlR3JvdXBQYXJ0aXRpb24pIHsKKyAgICAgICAgICAgIG1CdWlsZGVyLT5DaGFuZ2VQYXJ0aXRpb25Hcm91cChjaGFuZ2VHcm91cFBhcnRpdGlvbiwgZ3JvdXAyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCdWlsZGVyRnV6emVyOjpjYWxsVmVyaWZ5RXh0ZW50c0FnYWluc3RTb3VyY2VNZXRhZGF0YSgpIHsKKyAgICB1aW50NjRfdCBzb3VyY2VCbG9ja0RldlNpemUgPSBnZXRQYXJhbVZhbHVlKGtWYWxpZEJsb2NrU2l6ZSk7CisgICAgdWludDMyX3Qgc291cmNlTWV0YWRhdGFNYXhTaXplID0gZ2V0UGFyYW1WYWx1ZShrVmFsaWRNZXRhZGF0YVNpemUpOworICAgIHVpbnQzMl90IHNvdXJjZVNsb3RDb3VudCA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMCwgMSk7CisgICAgYXV0byBzb3VyY2VCdWlsZGVyID0KKyAgICAgICAgICAgIE1ldGFkYXRhQnVpbGRlcjo6TmV3KHNvdXJjZUJsb2NrRGV2U2l6ZSwgc291cmNlTWV0YWRhdGFNYXhTaXplLCBzb3VyY2VTbG90Q291bnQpOworCisgICAgdWludDY0X3QgdGFyZ2V0QmxvY2tEZXZTaXplID0gZ2V0UGFyYW1WYWx1ZShrVmFsaWRCbG9ja1NpemUpOworICAgIHVpbnQzMl90IHRhcmdldE1ldGFkYXRhTWF4U2l6ZSA9IGdldFBhcmFtVmFsdWUoa1ZhbGlkTWV0YWRhdGFTaXplKTsKKyAgICB1aW50MzJfdCB0YXJnZXRTbG90Q291bnQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIDEpOworICAgIGF1dG8gdGFyZ2V0QnVpbGRlciA9CisgICAgICAgICAgICBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyh0YXJnZXRCbG9ja0RldlNpemUsIHRhcmdldE1ldGFkYXRhTWF4U2l6ZSwgdGFyZ2V0U2xvdENvdW50KTsKKworICAgIGlmIChzb3VyY2VCdWlsZGVyICYmIHRhcmdldEJ1aWxkZXIpIHsKKyAgICAgICAgaW50NjRfdCBzb3VyY2VHcm91cHMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oa01pbkVsZW1lbnRzLCBrTWF4RWxlbWVudHMpOworICAgICAgICBmb3IgKGludDY0X3QgaWR4ID0gMDsgaWR4IDwgc291cmNlR3JvdXBzOyArK2lkeCkgeworICAgICAgICAgICAgc291cmNlQnVpbGRlci0+QWRkR3JvdXAoCisgICAgICAgICAgICAgICAgICAgIG1GZHAuUGlja1ZhbHVlSW5BcnJheShtR3JvdXBOYW1lcyksCisgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IGtWYWxpZE1heEdyb3VwU2l6ZSA6IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3Qgc291cmNlUGFydGl0aW9ucyA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PihrTWluRWxlbWVudHMsIGtNYXhFbGVtZW50cyk7CisgICAgICAgIGZvciAoaW50NjRfdCBpZHggPSAwOyBpZHggPCBzb3VyY2VQYXJ0aXRpb25zOyArK2lkeCkgeworICAgICAgICAgICAgc291cmNlQnVpbGRlci0+QWRkUGFydGl0aW9uKG1GZHAuUGlja1ZhbHVlSW5BcnJheShtUGFydGl0aW9uTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdGFyZ2V0R3JvdXBzID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDY0X3Q+KGtNaW5FbGVtZW50cywga01heEVsZW1lbnRzKTsKKyAgICAgICAgZm9yIChpbnQ2NF90IGlkeCA9IDA7IGlkeCA8IHRhcmdldEdyb3VwczsgKytpZHgpIHsKKyAgICAgICAgICAgIHRhcmdldEJ1aWxkZXItPkFkZEdyb3VwKAorICAgICAgICAgICAgICAgICAgICBtRmRwLlBpY2tWYWx1ZUluQXJyYXkobUdyb3VwTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBrVmFsaWRNYXhHcm91cFNpemUgOiBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IHRhcmdldFBhcnRpdGlvbnMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oa01pbkVsZW1lbnRzLCBrTWF4RWxlbWVudHMpOworICAgICAgICBmb3IgKGludDY0X3QgaWR4ID0gMDsgaWR4IDwgdGFyZ2V0UGFydGl0aW9uczsgKytpZHgpIHsKKyAgICAgICAgICAgIHRhcmdldEJ1aWxkZXItPkFkZFBhcnRpdGlvbihtRmRwLlBpY2tWYWx1ZUluQXJyYXkobVBhcnRpdGlvbk5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9QQVJUSVRJT05fQVRUUl9SRUFET05MWSk7CisgICAgICAgIH0KKworICAgICAgICBNZXRhZGF0YUJ1aWxkZXI6OlZlcmlmeUV4dGVudHNBZ2FpbnN0U291cmNlTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgKnNvdXJjZUJ1aWxkZXIsIG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxIC8qIHNvdXJjZV9zbG90X251bWJlciAqLywgKnRhcmdldEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDEgLyogdGFyZ2V0X3Nsb3RfbnVtYmVyICovLAorICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJzeXN0ZW0iLCAidmVuZG9yIiwgbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyl9KTsKKyAgICB9Cit9CisKK3ZvaWQgQnVpbGRlckZ1enplcjo6aW52b2tlQnVpbGRlckFQSXMoKSB7CisgICAgc3RyaW5nIHN1cGVyQmxvY2tEZXZpY2VOYW1lID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpIDoga0RldmljZUluZm9OYW1lOworICAgIHVpbnQzMl90IHJhbmRvbUJ1aWxkZXIgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KGtNaW5CdWlsZGVyLCBrTWF4QnVpbGRlcik7CisgICAgc2VsZWN0UmFuZG9tQnVpbGRlcihyYW5kb21CdWlsZGVyLCBzdXBlckJsb2NrRGV2aWNlTmFtZSk7CisKKyAgICBpZiAobUJ1aWxkZXIuZ2V0KCkpIHsKKyAgICAgICAgc2V0dXBCdWlsZGVyKHN1cGVyQmxvY2tEZXZpY2VOYW1lKTsKKworICAgICAgICB3aGlsZSAobUZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICAgICAgYXV0byBpbnZva2VBUElzID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5PGNvbnN0IGZ1bmN0aW9uPHZvaWQoKT4+KHsKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBjYWxsQ2hhbmdlUGFydGl0aW9uR3JvdXAoKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFkZGVkR3JvdXBOYW1lID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KG1Hcm91cE5hbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLT5BZGRHcm91cChhZGRlZEdyb3VwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01pblZhbHVlLCBrTWF4VmFsdWUpIC8qIG1heF9zaXplICovKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhcnRpdGlvbk5hbWUgPSBtRmRwLlBpY2tWYWx1ZUluQXJyYXkobVBhcnRpdGlvbk5hbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbiogYWRkZWRQYXJ0aXRpb24gPSBtQnVpbGRlci0+QWRkUGFydGl0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25OYW1lLCBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa0F0dHJpYnV0ZVR5cGVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbnVtU2VjdG9ycyA9IG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWluU2VjdG9yVmFsdWUsIGtNYXhTZWN0b3JWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrVmFsaWROdW1TZWN0b3JzOworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwaHlzaWNhbFNlY3RvciA9IG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNaW5TZWN0b3JWYWx1ZSwga01heFNlY3RvclZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrVmFsaWRQaHlzaWNhbFNlY3RvcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBudW1FeHRlbnRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDY0X3Q+KGtNaW5FbGVtZW50cywga01heEVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnV6elBhcnRpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZW50QWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPD0gbnVtRXh0ZW50czsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudEFkZGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci0+QWRkTGluZWFyRXh0ZW50KG1GdXp6UGFydGl0aW9uLCBrRGV2aWNlSW5mb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TZWN0b3JzLCBwaHlzaWNhbFNlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVudEFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9wdHI8THBNZXRhZGF0YT4gbWV0YWRhdGEgPSBtQnVpbGRlci0+RXhwb3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFsaWduZWRTaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KGtNaW5WYWx1ZSwga01heFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZ1enpQYXJ0aXRpb24tPkdldEJlZ2lubmluZ0V4dGVudHMoTFBfU0VDVE9SX1NJWkUgKiBudW1FeHRlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgY2FsbFZlcmlmeUV4dGVudHNBZ2FpbnN0U291cmNlTWV0YWRhdGEoKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBtQnVpbGRlci0+TGlzdFBhcnRpdGlvbnNJbkdyb3VwKG1GZHAuUGlja1ZhbHVlSW5BcnJheShtR3JvdXBOYW1lcykpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heFNpemUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLT5DaGFuZ2VHcm91cFNpemUobUZkcC5QaWNrVmFsdWVJbkFycmF5KG1Hcm91cE5hbWVzKSwgbWF4U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkZXZpY2VJbmZvTmFtZSA9IG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGtEZXZpY2VJbmZvTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXItPkdldEJsb2NrRGV2aWNlSW5mbyhkZXZpY2VJbmZvTmFtZSwgJm1CbG9ja0RldmljZXNbMV0pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGV2aWNlSW5mb05hbWUgPSBtRmRwLkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBrRGV2aWNlSW5mb05hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLT5VcGRhdGVCbG9ja0RldmljZUluZm8oZGV2aWNlSW5mb05hbWUsIG1CbG9ja0RldmljZXNbMV0pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVfcHRyPExwTWV0YWRhdGE+IG1ldGFkYXRhID0gbUJ1aWxkZXItPkV4cG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXItPkltcG9ydFBhcnRpdGlvbnMoKm1ldGFkYXRhLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21GZHAuUGlja1ZhbHVlSW5BcnJheShtUGFydGl0aW9uTmFtZXMpfSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgbUJ1aWxkZXItPkhhc0Jsb2NrRGV2aWNlKG1GZHAuUGlja1ZhbHVlSW5BcnJheShtUGFydGl0aW9uTmFtZXMpKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBtQnVpbGRlci0+U2V0VmlydHVhbEFCRGV2aWNlRmxhZygpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IG1CdWlsZGVyLT5TZXRBdXRvU2xvdFN1ZmZpeGluZygpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IG1CdWlsZGVyLT5MaXN0R3JvdXBzKCk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgbUJ1aWxkZXItPlVzZWRTcGFjZSgpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IG1CdWlsZGVyLT5SZXF1aXJlRXhwYW5kZWRNZXRhZGF0YUhlYWRlcigpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByZXNpemVkUGFydGl0aW9uU2l6ZSA9IGdldFBhcmFtVmFsdWUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci0+UmVzaXplUGFydGl0aW9uKG1SZXNpemVQYXJ0aXRpb24sIHJlc2l6ZWRQYXJ0aXRpb25TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc291cmNlU2xvdCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFyZ2V0U2xvdCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxOworICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uT3BlbmVyIHBhcnRpdGlvbk9wZW5lcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzb3VyY2VQYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBrRnV6elBhcnRpdGlvbk5hbWUgOiBrRGV2aWNlSW5mb05hbWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhQnVpbGRlcjo6TmV3Rm9yVXBkYXRlKHBhcnRpdGlvbk9wZW5lciwgc291cmNlUGFydGl0aW9uLCBzb3VyY2VTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2xvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25PcGVuZXIuR2V0RGV2aWNlU3RyaW5nKG1GZHAuUGlja1ZhbHVlSW5BcnJheShtUGFydGl0aW9uTmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX3B0cjxMcE1ldGFkYXRhPiBtZXRhZGF0YSA9IG1CdWlsZGVyLT5FeHBvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhQnVpbGRlcjo6TmV3KCptZXRhZGF0YS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgbUJ1aWxkZXItPkFsbG9jYXRhYmxlU3BhY2UoKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uT3BlbmVyIHBPcGVuZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VwZXJQYXJ0aXRpb25OYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8ga1N1cGVyUGFydGl0aW9uTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcGVuZXIuT3BlbihzdXBlclBhcnRpdGlvbk5hbWUsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcGVuZXIuR2V0SW5mbyhzdXBlclBhcnRpdGlvbk5hbWUsICZtQmxvY2tEZXZpY2VzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uT3BlbmVyIHBPcGVuZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VwZXJQYXJ0aXRpb25OYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8ga1N1cGVyUGFydGl0aW9uTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcGVuZXIuT3BlbihzdXBlclBhcnRpdGlvbk5hbWUsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcGVuZXIuR2V0RGV2aWNlU3RyaW5nKHN1cGVyUGFydGl0aW9uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsOjpJbnRlcnNlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsKG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIC8qIGRldmljZSBfaW5kZXggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIC8qIHN0YXJ0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSkgLyogZW5kICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbChtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBkZXZpY2UgX2luZGV4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBzdGFydCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkgLyogZW5kICovKSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxJbnRlcnZhbD4gaW50ZXJ2YWxWZWN0b3JBOworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbnRlcm5hbFZlY3RvckFFbGVtZW50cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PihrTWluRWxlbWVudHMsIGtNYXhFbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDY0X3QgaWR4ID0gMDsgaWR4IDwgaW50ZXJuYWxWZWN0b3JBRWxlbWVudHM7ICsraWR4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxWZWN0b3JBLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsKG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIC8qIGRldmljZSBfaW5kZXggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBzdGFydCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIC8qIGVuZCAqLykpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8SW50ZXJ2YWw+IGludGVydmFsVmVjdG9yQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaW50ZXJuYWxWZWN0b3JCRWxlbWVudHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oa01pbkVsZW1lbnRzLCBrTWF4RWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQ2NF90IGlkeCA9IDA7IGlkeCA8IGludGVybmFsVmVjdG9yQkVsZW1lbnRzOyArK2lkeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsVmVjdG9yQi5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbChtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBkZXZpY2UgX2luZGV4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkgLyogc3RhcnQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBlbmQgKi8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWw6OkludGVyc2VjdChpbnRlcnZhbFZlY3RvckEsIGludGVydmFsVmVjdG9yQik7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG51bVNlY3RvcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KGtNaW5WYWx1ZSwga01heFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZUluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluVmFsdWUsIGtNYXhWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwaHlzaWNhbFNlY3RvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oa01pblZhbHVlLCBrTWF4VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgTGluZWFyRXh0ZW50IGV4dGVudChudW1TZWN0b3JzLCBkZXZpY2VJbmRleCwgcGh5c2ljYWxTZWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50LkFzSW50ZXJ2YWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSVByb3BlcnR5RmV0Y2hlcjo6T3ZlcnJpZGVGb3JUZXN0aW5nKHN0ZDo6bWFrZV91bmlxdWU8UHJvcGVydHlGZXRjaGVyPigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaW52b2tlQVBJcygpOworICAgICAgICB9CisgICAgICAgIGlmIChtRmRwLkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgICAgIG1CdWlsZGVyLT5SZW1vdmVHcm91cEFuZFBhcnRpdGlvbnMobUZkcC5QaWNrVmFsdWVJbkFycmF5KG1Hcm91cE5hbWVzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpbmcgcmVtb3ZlUGFydGl0aW9uID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KG1QYXJ0aXRpb25OYW1lcyk7CisgICAgICAgICAgICBtQnVpbGRlci0+UmVtb3ZlUGFydGl0aW9uKHJlbW92ZVBhcnRpdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQnVpbGRlckZ1enplcjo6cHJvY2VzcygpIHsKKyAgICBpbnZva2VCdWlsZGVyQVBJcygpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQnVpbGRlckZ1enplciBidWlsZGVyRnV6emVyKGRhdGEsIHNpemUpOworICAgIGJ1aWxkZXJGdXp6ZXIucHJvY2VzcygpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2Z1enplci9saWJscF9zdXBlcl9sYXlvdXRfYnVpbGRlcl9mdXp6ZXIuY3BwIGIvZnNfbWdyL2xpYmxwL2Z1enplci9saWJscF9zdXBlcl9sYXlvdXRfYnVpbGRlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjQyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlibHAvZnV6emVyL2xpYmxwX3N1cGVyX2xheW91dF9idWlsZGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPGxpYmxwL21ldGFkYXRhX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGxpYmxwL3N1cGVyX2xheW91dF9idWlsZGVyLmg+CisjaW5jbHVkZSA8bGludXgvbWVtZmQuaD4KKyNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZnNfbWdyOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIHVuaXF1ZV9mZCA9IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOworCitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtTdXBlckxheW91dFZhbGlkQmxvY2tEZXZTaXplID0gNF9NaUI7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5CbG9ja0RldlZhbHVlID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga01heEJsb2NrRGV2VmFsdWUgPSAxMDAwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5FbGVtZW50cyA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNYXhFbGVtZW50cyA9IDEwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrU3VwZXJMYXlvdXRWYWxpZE1ldGFkYXRhU2l6ZSA9IDhfS2lCOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluTWV0YWRhdGFWYWx1ZSA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhNZXRhZGF0YVZhbHVlID0gMTAwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhCeXRlcyA9IDIwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluT3BlbiA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhPcGVuID0gMjsKKworY29uc3QgdWludDY0X3Qga0F0dHJpYnV0ZVR5cGVzW10gPSB7CisgICAgICAgIExQX1BBUlRJVElPTl9BVFRSX05PTkUsICAgIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZLCBMUF9QQVJUSVRJT05fQVRUUl9TTE9UX1NVRkZJWEVELAorICAgICAgICBMUF9QQVJUSVRJT05fQVRUUl9VUERBVEVELCBMUF9QQVJUSVRJT05fQVRUUl9ESVNBQkxFRCwKK307CisKK2NsYXNzIFN1cGVyTGF5b3V0QnVpbGRlckZ1enplciB7CisgIHB1YmxpYzoKKyAgICBTdXBlckxheW91dEJ1aWxkZXJGdXp6ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIDogbUZkcChkYXRhLCBzaXplKXt9OworICAgIHZvaWQgcHJvY2VzcygpOworCisgIHByaXZhdGU6CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIG1GZHA7CisgICAgdm9pZCBpbnZva2VTdXBlckxheW91dEJ1aWxkZXJBUElzKCk7CisgICAgdm9pZCBjYWxsUmFuZG9tT3BlbihpbnQzMl90IG9wZW4pOworICAgIHZvaWQgYWRkTXVsdGlwbGVQYXJ0aXRpb25zKGludDMyX3QgbnVtUGFydGl0aW9ucyk7CisgICAgdm9pZCBzZXR1cFN1cGVyTGF5b3V0QnVpbGRlcigpOworICAgIFN1cGVyTGF5b3V0QnVpbGRlciBtU3VwZXJMYXlvdXRCdWlsZGVyOworICAgIHVuaXF1ZV9wdHI8TWV0YWRhdGFCdWlsZGVyPiBtU3VwZXJCdWlsZGVyOworICAgIHVuaXF1ZV9wdHI8THBNZXRhZGF0YT4gbU1ldGFkYXRhOworICAgIGJvb2wgbU9wZW5TdWNjZXNzID0gZmFsc2U7Cit9OworCit2b2lkIFN1cGVyTGF5b3V0QnVpbGRlckZ1enplcjo6c2V0dXBTdXBlckxheW91dEJ1aWxkZXIoKSB7CisgICAgdWludDY0X3QgcmFuZG9tQmxvY2tEZXZTaXplID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oa01pbkJsb2NrRGV2VmFsdWUsIGtNYXhCbG9ja0RldlZhbHVlKTsKKyAgICB1aW50NjRfdCBibG9ja0RldlNpemUgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBrU3VwZXJMYXlvdXRWYWxpZEJsb2NrRGV2U2l6ZSA6IHJhbmRvbUJsb2NrRGV2U2l6ZTsKKyAgICB1aW50MzJfdCByYW5kb21NZXRhZGF0YU1heFNpemUgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluTWV0YWRhdGFWYWx1ZSwga01heE1ldGFkYXRhVmFsdWUpOworICAgIHVpbnQzMl90IG1ldGFkYXRhTWF4U2l6ZSA9CisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBrU3VwZXJMYXlvdXRWYWxpZE1ldGFkYXRhU2l6ZSA6IHJhbmRvbU1ldGFkYXRhTWF4U2l6ZTsKKyAgICB1aW50MzJfdCBtZXRhZGF0YVNsb3RDb3VudCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxOworICAgIG1TdXBlckJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhibG9ja0RldlNpemUsIG1ldGFkYXRhTWF4U2l6ZSwgbWV0YWRhdGFTbG90Q291bnQpOworCisgICAgaWYgKG1TdXBlckJ1aWxkZXIuZ2V0KCkpIHsKKyAgICAgICAgaWYgKG1GZHAuQ29uc3VtZUJvb2woKSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1QYXJ0aXRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5FbGVtZW50cywga01heEVsZW1lbnRzKTsKKyAgICAgICAgICAgIGFkZE11bHRpcGxlUGFydGl0aW9ucyhudW1QYXJ0aXRpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHJhbmRvbU9wZW4gPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KGtNaW5PcGVuLCBrTWF4T3Blbik7CisgICAgICAgIGNhbGxSYW5kb21PcGVuKHJhbmRvbU9wZW4pOworICAgIH0KK30KKwordm9pZCBTdXBlckxheW91dEJ1aWxkZXJGdXp6ZXI6OmFkZE11bHRpcGxlUGFydGl0aW9ucyhpbnQzMl90IG51bVBhcnRpdGlvbnMpIHsKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtUGFydGl0aW9uczsgKytpZHgpIHsKKyAgICAgICAgc3RyaW5nIHBhcnRpdGlvbk5hbWUgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJidWlsZGVyX3BhcnRpdGlvbiI7CisgICAgICAgIG1TdXBlckJ1aWxkZXItPkFkZFBhcnRpdGlvbihwYXJ0aXRpb25OYW1lLCBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa0F0dHJpYnV0ZVR5cGVzKSk7CisgICAgfQorfQorCit2b2lkIFN1cGVyTGF5b3V0QnVpbGRlckZ1enplcjo6Y2FsbFJhbmRvbU9wZW4oaW50MzJfdCBvcGVuKSB7CisgICAgbU1ldGFkYXRhID0gbVN1cGVyQnVpbGRlci0+RXhwb3J0KCk7CisgICAgc3dpdGNoIChvcGVuKSB7CisgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGltYWdlRGF0YSA9IG1GZHAuQ29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KGtNYXhCeXRlcyk7CisgICAgICAgICAgICBtT3BlblN1Y2Nlc3MgPSBtU3VwZXJMYXlvdXRCdWlsZGVyLk9wZW4oKHZvaWQqKShpbWFnZURhdGEuZGF0YSgpKSwgaW1hZ2VEYXRhLnNpemUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgIG1PcGVuU3VjY2VzcyA9IG1TdXBlckxheW91dEJ1aWxkZXIuT3BlbigqbU1ldGFkYXRhLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgdW5pcXVlX2ZkIGZkKHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsICJpbWFnZV9maWxlIiwgMCkpOworICAgICAgICAgICAgV3JpdGVUb0ltYWdlRmlsZShmZCwgKm1NZXRhZGF0YS5nZXQoKSk7CisgICAgICAgICAgICBtT3BlblN1Y2Nlc3MgPSBtU3VwZXJMYXlvdXRCdWlsZGVyLk9wZW4oZmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3VwZXJMYXlvdXRCdWlsZGVyRnV6emVyOjppbnZva2VTdXBlckxheW91dEJ1aWxkZXJBUElzKCkgeworICAgIHN0cmluZyBpbWFnZU5hbWUgPSBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICBzdHJpbmcgZnV6elBhcnRpdGlvbk5hbWUgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gImJ1aWxkZXJfcGFydGl0aW9uIiA6IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpOworICAgIGlmICghZnV6elBhcnRpdGlvbk5hbWUuc2l6ZSgpKSB7CisgICAgICAgIGZ1enpQYXJ0aXRpb25OYW1lID0gImJ1aWxkZXJfcGFydGl0aW9uIjsKKyAgICB9CisgICAgc2V0dXBTdXBlckxheW91dEJ1aWxkZXIoKTsKKyAgICBpZiAobU9wZW5TdWNjZXNzKSB7CisgICAgICAgIHdoaWxlIChtRmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgICAgICBhdXRvIGludm9rZVN1cGVyQVBJcyA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheTxjb25zdCBmdW5jdGlvbjx2b2lkKCk+Pih7CisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgbVN1cGVyTGF5b3V0QnVpbGRlci5HZXRJbWFnZUxheW91dCgpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VwZXJMYXlvdXRCdWlsZGVyLkFkZFBhcnRpdGlvbihmdXp6UGFydGl0aW9uTmFtZSwgaW1hZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkpOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpbnZva2VTdXBlckFQSXMoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTdXBlckxheW91dEJ1aWxkZXJGdXp6ZXI6OnByb2Nlc3MoKSB7CisgICAgaW52b2tlU3VwZXJMYXlvdXRCdWlsZGVyQVBJcygpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgU3VwZXJMYXlvdXRCdWlsZGVyRnV6emVyIHN1cGVyTGF5b3V0QnVpbGRlckZ1enplcihkYXRhLCBzaXplKTsKKyAgICBzdXBlckxheW91dEJ1aWxkZXJGdXp6ZXIucHJvY2VzcygpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2ltYWdlcy5jcHAgYi9mc19tZ3IvbGlibHAvaW1hZ2VzLmNwcAppbmRleCAwMmI2NGFjLi5hMmRiYjEwIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlibHAvaW1hZ2VzLmNwcAorKysgYi9mc19tZ3IvbGlibHAvaW1hZ2VzLmNwcApAQCAtMTIzLDEzICsxMjMsNDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBXcml0ZVRvSW1hZ2VGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlLCBjb25zdCBMcE1ldGFkYXRhJiBpbnB1dCkgewotICAgIHVuaXF1ZV9mZCBmZChvcGVuKGZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fUkRXUiB8IE9fVFJVTkMgfCBPX0NMT0VYRUMgfCBPX0JJTkFSWSwgMDY0NCkpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgUEVSUk9SIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIiBvcGVuIGZhaWxlZDogIiA8PCBmaWxlOworI2lmICFkZWZpbmVkKF9XSU4zMikKK2Jvb2wgRnN5bmNEaXJlY3RvcnkoY29uc3QgY2hhciogZGlybmFtZSkgeworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihkaXJuYW1lLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgZGlybmFtZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gV3JpdGVUb0ltYWdlRmlsZShmZCwgaW5wdXQpOworICAgIGlmIChmc3luYyhmZCkgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVST0ZTIHx8IGVycm5vID09IEVJTlZBTCkgeworICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiU2tpcCBmc3luYyAiIDw8IGRpcm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBvbiBhIGZpbGUgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgc3luY2hyb25pemF0aW9uIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZnN5bmMgIiA8PCBkaXJuYW1lOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKK2Jvb2wgV3JpdGVUb0ltYWdlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgY29uc3QgTHBNZXRhZGF0YSYgaW5wdXQpIHsKKyAgICBjb25zdCBhdXRvIHBhcmVudF9kaXIgPSBiYXNlOjpEaXJuYW1lKGZpbGUpOworICAgIFRlbXBvcmFyeUZpbGUgdG1wZmlsZShwYXJlbnRfZGlyKTsKKyAgICBpZiAoIVdyaXRlVG9JbWFnZUZpbGUodG1wZmlsZS5mZCwgaW5wdXQpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd3JpdGUgZ2VvbWV0cnkgZGF0YSB0byB0bXBmaWxlICIgPDwgdG1wZmlsZS5wYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgIWRlZmluZWQoX1dJTjMyKQorICAgIGZzeW5jKHRtcGZpbGUuZmQpOworI2VuZGlmCisgICAgY29uc3QgYXV0byBlcnIgPSByZW5hbWUodG1wZmlsZS5wYXRoLCBmaWxlLmNfc3RyKCkpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbmFtZSB0bXAgZ2VvbWV0cnkgZmlsZSAiIDw8IHRtcGZpbGUucGF0aCA8PCAiIHRvICIgPDwgZmlsZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNpZiAhZGVmaW5lZChfV0lOMzIpCisgICAgRnN5bmNEaXJlY3RvcnkocGFyZW50X2Rpci5jX3N0cigpKTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOwogfQogCiBJbWFnZUJ1aWxkZXI6OkltYWdlQnVpbGRlcihjb25zdCBMcE1ldGFkYXRhJiBtZXRhZGF0YSwgdWludDMyX3QgYmxvY2tfc2l6ZSwKQEAgLTIwOCw3ICsyNDEsOCBAQAogICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSAic3VwZXJfIiArIG5hbWUgKyAiLmltZyI7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aCA9IG91dHB1dF9kaXIgKyAiLyIgKyBmaWxlX25hbWU7CiAKLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrT3BlbkZsYWdzID0gT19DUkVBVCB8IE9fUkRXUiB8IE9fVFJVTkMgfCBPX0NMT0VYRUMgfCBPX05PRk9MTE9XIHwgT19CSU5BUlk7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga09wZW5GbGFncyA9CisgICAgICAgICAgICAgICAgT19DUkVBVCB8IE9fUkRXUiB8IE9fVFJVTkMgfCBPX0NMT0VYRUMgfCBPX05PRk9MTE9XIHwgT19CSU5BUlk7CiAgICAgICAgIHVuaXF1ZV9mZCBmZChvcGVuKGZpbGVfcGF0aC5jX3N0cigpLCBrT3BlbkZsYWdzLCAwNjQ0KSk7CiAgICAgICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgICAgIFBFUlJPUiA8PCAib3BlbiBmYWlsZWQ6ICIgPDwgZmlsZV9wYXRoOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvYnVpbGRlci5oIGIvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvYnVpbGRlci5oCmluZGV4IDU0ZjMxYmMuLjk1N2I5NmIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC9pbmNsdWRlL2xpYmxwL2J1aWxkZXIuaAorKysgYi9mc19tZ3IvbGlibHAvaW5jbHVkZS9saWJscC9idWlsZGVyLmgKQEAgLTM0Niw2ICszNDYsOCBAQAogICAgIHZvaWQgU2V0QXV0b1Nsb3RTdWZmaXhpbmcoKTsKICAgICAvLyBTZXQgdGhlIExQX0hFQURFUl9GTEFHX1ZJUlRVQUxfQUJfREVWSUNFIGZsYWcuCiAgICAgdm9pZCBTZXRWaXJ0dWFsQUJEZXZpY2VGbGFnKCk7CisgICAgLy8gU2V0IG9yIHVuc2V0IHRoZSBMUF9IRUFERVJfRkxBR19PVkVSTEFZU19BQ1RJVkUgZmxhZy4KKyAgICB2b2lkIFNldE92ZXJsYXlzQWN0aXZlRmxhZyhib29sIGZsYWcpOwogCiAgICAgYm9vbCBHZXRCbG9ja0RldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBCbG9ja0RldmljZUluZm8qIGluZm8pIGNvbnN0OwogICAgIGJvb2wgVXBkYXRlQmxvY2tEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3QgQmxvY2tEZXZpY2VJbmZvJiBpbmZvKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9pbmNsdWRlL2xpYmxwL21ldGFkYXRhX2Zvcm1hdC5oIGIvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvbWV0YWRhdGFfZm9ybWF0LmgKaW5kZXggNDFkOGIwYy4uOGQ3NzA5NyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvbWV0YWRhdGFfZm9ybWF0LmgKKysrIGIvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvbWV0YWRhdGFfZm9ybWF0LmgKQEAgLTI0MCw2ICsyNDAsOSBAQAogICovCiAjZGVmaW5lIExQX0hFQURFUl9GTEFHX1ZJUlRVQUxfQUJfREVWSUNFIDB4MQogCisvKiBUaGlzIGRldmljZSBoYXMgb3ZlcmxheXMgYWN0aXZhdGVkIHZpYSAiYWRiIHJlbW91bnQiLiAqLworI2RlZmluZSBMUF9IRUFERVJfRkxBR19PVkVSTEFZU19BQ1RJVkUgMHgyCisKIC8qIFRoaXMgc3RydWN0IGRlZmluZXMgYSBsb2dpY2FsIHBhcnRpdGlvbiBlbnRyeSwgc2ltaWxhciB0byB3aGF0IHdvdWxkIGJlCiAgKiBwcmVzZW50IGluIGEgR1VJRCBQYXJ0aXRpb24gVGFibGUuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9zdXBlcl9sYXlvdXRfYnVpbGRlci5jcHAgYi9mc19tZ3IvbGlibHAvc3VwZXJfbGF5b3V0X2J1aWxkZXIuY3BwCmluZGV4IDM3ZjI4ZTEuLmZkNzQxNmIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC9zdXBlcl9sYXlvdXRfYnVpbGRlci5jcHAKKysrIGIvZnNfbWdyL2xpYmxwL3N1cGVyX2xheW91dF9idWlsZGVyLmNwcApAQCAtMTcsNiArMTcsOCBAQAogCiAjaW5jbHVkZSA8bGlibHAvbGlibHAuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogI2luY2x1ZGUgImltYWdlcy5oIgogI2luY2x1ZGUgInV0aWxpdHkuaCIKICNpbmNsdWRlICJ3cml0ZXIuaCIKQEAgLTQ2LDIxICs0OCwyMSBAQAogYm9vbCBTdXBlckxheW91dEJ1aWxkZXI6Ok9wZW4oY29uc3QgTHBNZXRhZGF0YSYgbWV0YWRhdGEpIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcnRpdGlvbiA6IG1ldGFkYXRhLnBhcnRpdGlvbnMpIHsKICAgICAgICAgaWYgKHBhcnRpdGlvbi5hdHRyaWJ1dGVzICYgTFBfUEFSVElUSU9OX0FUVFJfU0xPVF9TVUZGSVhFRCkgewotICAgICAgICAgICAgLy8gUmV0cm9maXQgZGV2aWNlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJldHJvZml0IGRldmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQiOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICghKHBhcnRpdGlvbi5hdHRyaWJ1dGVzICYgTFBfUEFSVElUSU9OX0FUVFJfUkVBRE9OTFkpKSB7Ci0gICAgICAgICAgICAvLyBXcml0YWJsZSBwYXJ0aXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiV3JpdGFibGUgcGFydGl0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFtZXRhZGF0YS5leHRlbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gUGFydGl0aW9ucyB0aGF0IGFscmVhZHkgaGF2ZSBleHRlbnRzIGFyZSBub3Qgc3VwcG9ydGVkIChzaG91bGQKLSAgICAgICAgLy8gbmV2ZXIgYmUgdHJ1ZSBvZiBzdXBlcl9lbXB0eS5pbWcpLgorICAgICAgICBMT0coRVJST1IpIDw8ICJQYXJ0aXRpb25zIHRoYXQgYWxyZWFkeSBoYXZlIGV4dGVudHMgYXJlIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgYmUgdHJ1ZSBvZiBzdXBlcl9lbXB0eS5pbWcuCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1ldGFkYXRhLmJsb2NrX2RldmljZXMuc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgLy8gT25seSBvbmUgInN1cGVyIiBpcyBzdXBwb3J0ZWQuCisgICAgICAgIExPRyhFUlJPUikgPDwgIk9ubHkgb25lICdzdXBlcicgaXMgc3VwcG9ydGVkIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL3V0aWxpdHkuY3BwIGIvZnNfbWdyL2xpYmxwL3V0aWxpdHkuY3BwCmluZGV4IGQ4ZTE3MWIuLjcwYzdiNzkgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC91dGlsaXR5LmNwcAorKysgYi9mc19tZ3IvbGlibHAvdXRpbGl0eS5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNlbmRpZgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L0FuZHJvaWQuYnAgYi9mc19tZ3IvbGlic25hcHNob3QvQW5kcm9pZC5icAppbmRleCAzZGQxZjFhLi5hOGE3NzE2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvQW5kcm9pZC5icAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvQW5kcm9pZC5icApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAibGliZXh0Ml91dWlkIiwKICAgICAgICAgImxpYmV4dDRfdXRpbHMiLAogICAgICAgICAibGliZnN0YWIiLAotICAgICAgICAibGlic25hcHNob3Rfc25hcHVzZXJkIiwKKyAgICAgICAgImxpYnNuYXB1c2VyZF9jbGllbnQiLAogICAgICAgICAibGlieiIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWwpAQCAtODUsMTEgKzg1LDkgQEAKICAgICAgICAgImFuZHJvaWQvc25hcHNob3Qvc25hcHNob3QucHJvdG8iLAogICAgICAgICAiZGV2aWNlX2luZm8uY3BwIiwKICAgICAgICAgInNuYXBzaG90LmNwcCIsCi0gICAgICAgICJzbmFwc2hvdF9yZWFkZXIuY3BwIiwKICAgICAgICAgInNuYXBzaG90X3N0YXRzLmNwcCIsCiAgICAgICAgICJzbmFwc2hvdF9zdHViLmNwcCIsCiAgICAgICAgICJzbmFwc2hvdF9tZXRhZGF0YV91cGRhdGVyLmNwcCIsCi0gICAgICAgICJzbmFwc2hvdF93cml0ZXIuY3BwIiwKICAgICAgICAgInBhcnRpdGlvbl9jb3dfY3JlYXRvci5jcHAiLAogICAgICAgICAicmV0dXJuLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5LmNwcCIsCkBAIC0xMDMsNyArMTAxLDcgQEAKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzbmFwc2hvdCIsCisgICAgbmFtZTogImxpYnNuYXBzaG90X3N0YXRpYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYnNuYXBzaG90X2RlZmF1bHRzIiwKICAgICAgICAgImxpYnNuYXBzaG90X2hhbF9kZXBzIiwKQEAgLTExNCw2ICsxMTIsMjUgQEAKICAgICBdLAogfQogCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic25hcHNob3QiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJzbmFwc2hvdF9kZWZhdWx0cyIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3dfZGVmYXVsdHMiLAorICAgICAgICAibGlic25hcHNob3RfaGFsX2RlcHMiLAorICAgIF0sCisgICAgc3JjczogWyI6bGlic25hcHNob3Rfc291cmNlcyJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmc19tZ3JfYmluZGVyIiwKKyAgICAgICAgImxpYmxwIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjKytmcyIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3ciLAorICAgIF0KK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzbmFwc2hvdF9pbml0IiwKICAgICBuYXRpdmVfY292ZXJhZ2UgOiB0cnVlLApAQCAtMTYzLDggKzE4MCwxMSBAQAogICAgICAgICAibGliYnJvdGxpIiwKICAgICAgICAgImxpYnoiLAogICAgICAgICAibGlibHo0IiwKKyAgICAgICAgImxpYnpzdGQiLAogICAgIF0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnVwZGF0ZV9lbmdpbmVfaGVhZGVycyIsCisgICAgXSwKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewpAQCAtMTczLDEyICsxOTMsMTggQEAKICAgICAgICAgImxpYnNuYXBzaG90X2Nvd19kZWZhdWx0cyIsCiAgICAgXSwKICAgICBzcmNzOiBbCi0gICAgICAgICJsaWJzbmFwc2hvdF9jb3cvY293X2RlY29tcHJlc3MuY3BwIiwKLSAgICAgICAgImxpYnNuYXBzaG90X2Nvdy9jb3dfcmVhZGVyLmNwcCIsCi0gICAgICAgICJsaWJzbmFwc2hvdF9jb3cvY293X3dyaXRlci5jcHAiLAotICAgICAgICAibGlic25hcHNob3RfY293L2Nvd19mb3JtYXQuY3BwIiwKICAgICAgICAgImxpYnNuYXBzaG90X2Nvdy9jb3dfY29tcHJlc3MuY3BwIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2Nvdy9jb3dfZGVjb21wcmVzcy5jcHAiLAorICAgICAgICAibGlic25hcHNob3RfY293L2Nvd19mb3JtYXQuY3BwIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2Nvdy9jb3dfcmVhZGVyLmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YyLmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YzLmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyLmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvd3JpdGVyX2Jhc2UuY3BwIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjIuY3BwIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjMuY3BwIiwKICAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTIyMSw5ICsyNDcsNyBAQAogICAgIHNyY3M6IFsKICAgICAgICAgInBhcnRpdGlvbl9jb3dfY3JlYXRvcl90ZXN0LmNwcCIsCiAgICAgICAgICJzbmFwc2hvdF9tZXRhZGF0YV91cGRhdGVyX3Rlc3QuY3BwIiwKLSAgICAgICAgInNuYXBzaG90X3JlYWRlcl90ZXN0LmNwcCIsCiAgICAgICAgICJzbmFwc2hvdF90ZXN0LmNwcCIsCi0gICAgICAgICJzbmFwc2hvdF93cml0ZXJfdGVzdC5jcHAiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCkBAIC0yNDQsNyArMjY4LDcgQEAKICAgICAgICAgImxpYmdzaSIsCiAgICAgICAgICJsaWJnbW9jayIsCiAgICAgICAgICJsaWJscCIsCi0gICAgICAgICJsaWJzbmFwc2hvdCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9zdGF0aWMiLAogICAgICAgICAibGlic25hcHNob3RfY293IiwKICAgICAgICAgImxpYnNuYXBzaG90X3Rlc3RfaGVscGVycyIsCiAgICAgICAgICJsaWJzcGFyc2UiLApAQCAtMzI3LDggKzM1MSw2IEBACiAgICAgICAgICJsaWJicm90bGkiLAogICAgICAgICAibGliYysrZnMiLAogICAgICAgICAibGliZnN0YWIiLAotICAgICAgICAibGlic25hcHNob3QiLAotICAgICAgICAibGlic25hcHNob3RfY293IiwKICAgICAgICAgImxpYnoiLAogICAgICAgICAidXBkYXRlX21ldGFkYXRhLXByb3RvcyIsCiAgICAgXSwKQEAgLTM0MSw2ICszNjMsNyBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmxwIiwKICAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnNuYXBzaG90IiwKICAgICAgICAgImxpYnN0YXRzbG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLApAQCAtMzY5LDcgKzM5Miw5IEBACiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3dfZGVmYXVsdHMiLAogICAgIF0sCiAgICAgc3JjczogWwotICAgICAgICAibGlic25hcHNob3RfY293L2Nvd19hcGlfdGVzdC5jcHAiLAorICAgICAgICAibGlic25hcHNob3RfY293L3NuYXBzaG90X3JlYWRlcl90ZXN0LmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvdGVzdF92Mi5jcHAiLAorICAgICAgICAibGlic25hcHNob3RfY293L3Rlc3RfdjMuY3BwIiwKICAgICBdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLURfRklMRV9PRkZTRVRfQklUUz02NCIsCkBAIC0zOTMsNiArNDE4LDEwIEBACiAgICAgdGVzdF9vcHRpb25zOiB7CiAgICAgICAgIG1pbl9zaGlwcGluZ19hcGlfbGV2ZWw6IDMwLAogICAgIH0sCisgICAgZGF0YTogWworICAgICAgICAidG9vbHMvdGVzdGRhdGEvY293X3YyIiwKKyAgICAgICAgInRvb2xzL3Rlc3RkYXRhL2luY29tcHJlc3NpYmxlX2Jsb2NrIiwKKyAgICBdLAogICAgIGF1dG9fZ2VuX2NvbmZpZzogdHJ1ZSwKICAgICByZXF1aXJlX3Jvb3Q6IGZhbHNlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLApAQCAtNDEzLDYgKzQ0Miw3IEBACiAgICAgICAgICJsaWJicm90bGkiLAogICAgICAgICAibGliY3J5cHRvX3N0YXRpYyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZ2ZsYWdzIiwKICAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCiAgICAgICAgICJsaWJ6IiwKICAgICBdLApAQCAtNDIzLDYgKzQ1Myw1NCBAQAogICAgIF0sCiB9CiAKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImNyZWF0ZV9zbmFwc2hvdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZGV2aWNlX3N1cHBvcnRlZDogZmFsc2UsCisKKyAgICBzcmNzOiBbImxpYnNuYXBzaG90X2Nvdy9jcmVhdGVfY293LmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmV4dDRfdXRpbHMiLAorICAgICAgICAibGlic25hcHNob3RfY293IiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJicm90bGkiLAorICAgICAgICAibGlieiIsCisgICAgICAgICJsaWJsejQiLAorICAgICAgICAibGlienN0ZCIsCisgICAgICAgICJsaWJnZmxhZ3MiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0b3JhZ2VfbGl0ZXJhbHNfaGVhZGVycyIsCisgICAgXSwKKworICAgIGRpc3Q6IHsKKyAgICAgICAgdGFyZ2V0czogWworICAgICAgICAgICAgInNkayIsCisgICAgICAgICAgICAic2RrLXJlcG8tcGxhdGZvcm0tdG9vbHMiLAorICAgICAgICAgICAgInNka19yZXBvIiwKKyAgICAgICAgXSwKKyAgICB9LAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgICAgICB3aW5kb3dzOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCiBweXRob25fbGlicmFyeV9ob3N0IHsKICAgICBuYW1lOiAic25hcHNob3RfcHJvdG9fcHl0aG9uIiwKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvT1dORVJTIGIvZnNfbWdyL2xpYnNuYXBzaG90L09XTkVSUwppbmRleCA5ZDJiODc3Li5jOGIxMDAzIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvT1dORVJTCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9PV05FUlMKQEAgLTEsNSArMSw2IEBACi0jIEJ1ZyBjb21wb25lbnQ6IDMwNTQ1CisjIEJ1ZyBjb21wb25lbnQ6IDEwMTQ5NTEKIGJhbHNpbmlAZ29vZ2xlLmNvbQogZHZhbmRlckBnb29nbGUuY29tCiBlbHNrQGdvb2dsZS5jb20KIGFrYWlsYXNoQGdvb2dsZS5jb20KK3poYW5na2VsdmluQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9hbmRyb2lkL3NuYXBzaG90L3NuYXBzaG90LnByb3RvIGIvZnNfbWdyL2xpYnNuYXBzaG90L2FuZHJvaWQvc25hcHNob3Qvc25hcHNob3QucHJvdG8KaW5kZXggZmEwNGM0My4uN2U5N2RjMCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2FuZHJvaWQvc25hcHNob3Qvc25hcHNob3QucHJvdG8KKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2FuZHJvaWQvc25hcHNob3Qvc25hcHNob3QucHJvdG8KQEAgLTExNCw2ICsxMTQsOSBAQAogCiAgICAgLy8gRW5hYmxlIGJhdGNoaW5nIGZvciBDT1cgd3JpdGVzCiAgICAgYm9vbCBiYXRjaGVkX3dyaXRlcyA9IDE0OworCisgICAgLy8gU2l6ZSBvZiB2MyBvcGVyYXRpb24gYnVmZmVyLiBOZWVkcyB0byBiZSBkZXRlcm1pbmVkIGR1cmluZyB3cml0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICB1aW50NjQgZXN0aW1hdGVkX29wc19idWZmZXJfc2l6ZSA9IDE1OwogfQogCiAvLyBOZXh0OiA4CkBAIC0yNTAsNCArMjUzLDcgQEAKIAogICAgIC8vIFdoZXRoZXIgdGhpcyB1cGRhdGUgYXR0ZW1wdCB1c2VkIGlvX3VyaW5nLgogICAgIGJvb2wgaW91cmluZ191c2VkID0gMTM7CisKKyAgICAvLyBTaXplIG9mIHYzIG9wZXJhdGlvbiBidWZmZXIuIE5lZWRzIHRvIGJlIGRldGVybWluZWQgZHVyaW5nIHdyaXRlciBpbml0aWFsaXphdGlvbgorICAgIHVpbnQ2NCBlc3RpbWF0ZWRfb3BfY291bnRfbWF4ID0gMTQ7CiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9jb3dfY29tcHJlc3MuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTFkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9jb3dfY29tcHJlc3MuaApAQCAtMCwwICsxLDUxIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJsaWJzbmFwc2hvdC9jb3dfZm9ybWF0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIElDb21wcmVzc29yIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IElDb21wcmVzc29yKHVpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLCB1aW50MzJfdCBibG9ja19zaXplKQorICAgICAgICA6IGNvbXByZXNzaW9uX2xldmVsXyhjb21wcmVzc2lvbl9sZXZlbCksIGJsb2NrX3NpemVfKGJsb2NrX3NpemUpIHt9CisKKyAgICB2aXJ0dWFsIH5JQ29tcHJlc3NvcigpIHt9CisgICAgLy8gRmFjdG9yeSBtZXRob2RzIGZvciBjb21wcmVzc2lvbiBtZXRob2RzLgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IEd6KHVpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLCBjb25zdCBpbnQzMl90IGJsb2NrX3NpemUpOworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IEJyb3RsaSh1aW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBibG9ja19zaXplKTsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBMejQodWludDMyX3QgY29tcHJlc3Npb25fbGV2ZWwsIGNvbnN0IGludDMyX3QgYmxvY2tfc2l6ZSk7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxJQ29tcHJlc3Nvcj4gWnN0ZCh1aW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwgY29uc3QgaW50MzJfdCBibG9ja19zaXplKTsKKworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IENyZWF0ZShDb3dDb21wcmVzc2lvbiBjb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBibG9ja19zaXplKTsKKworICAgIHVpbnQzMl90IEdldENvbXByZXNzaW9uTGV2ZWwoKSBjb25zdCB7IHJldHVybiBjb21wcmVzc2lvbl9sZXZlbF87IH0KKyAgICB1aW50MzJfdCBHZXRCbG9ja1NpemUoKSBjb25zdCB7IHJldHVybiBibG9ja19zaXplXzsgfQorICAgIFtbbm9kaXNjYXJkXV0gdmlydHVhbCBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBDb21wcmVzcyhjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSBjb25zdCA9IDA7CisKKyAgcHJpdmF0ZToKKyAgICB1aW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbF87CisgICAgdWludDMyX3QgYmxvY2tfc2l6ZV87Cit9OworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19mb3JtYXQuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19mb3JtYXQuaAppbmRleCBiYTc1YThkLi45NDAxYzY2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9jb3dfZm9ybWF0LmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X2Zvcm1hdC5oCkBAIC0xNSwxOSArMTUsMzAgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZ192aWV3PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCitzdHJ1Y3QgQ293T3BlcmF0aW9uVjM7Cit0eXBlZGVmIENvd09wZXJhdGlvblYzIENvd09wZXJhdGlvbjsKKwogc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293TWFnaWNOdW1iZXIgPSAweDQzNmY3NzYzNGY1NzIxMjFVTEw7CiBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtDb3dWZXJzaW9uTWFqb3IgPSAyOwogc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrQ293VmVyc2lvbk1pbm9yID0gMDsKIAogc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrQ293VmVyc2lvbk1hbmlmZXN0ID0gMjsKIAotc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQkxPQ0tfU1ogPSA0MDk2Owotc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQkxPQ0tfU0hJRlQgPSAoX19idWlsdGluX2ZmcyhCTE9DS19TWikgLSAxKTsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01pbkNvd1ZlcnNpb24gPSAxOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4Q293VmVyc2lvbiA9IDM7CisKKy8vIE5vcm1hbGx5LCB0aGlzIHNob3VsZCBiZSBrTWF4Q293VmVyc2lvbi4gV2hlbiBhIG5ldyB2ZXJzaW9uIGlzIHVuZGVyIHRlc3RpbmcKKy8vIGl0IG1heSBiZSB0aGUgcHJldmlvdXMgdmFsdWUgb2Yga01heENvd1ZlcnNpb24uCitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtEZWZhdWx0Q293VmVyc2lvbiA9IDI7CiAKIC8vIFRoaXMgaGVhZGVyIGFwcGVhcnMgYXMgdGhlIGZpcnN0IHNlcXVlbmNlIG9mIGJ5dGVzIGluIHRoZSBDT1cuIEFsbCBmaWVsZHMKIC8vIGluIHRoZSBsYXlvdXQgYXJlIGxpdHRsZS1lbmRpYW4gZW5jb2RlZC4gVGhlIG9uLWRpc2sgbGF5b3V0IGlzOgpAQCAtNDMsNyArNTQsOSBAQAogLy8gICAgICB8ICAgIEZvb3RlciAoZml4ZWQpICAgICB8CiAvLyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIC8vCi0vLyBUaGUgb3BlcmF0aW9ucyBiZWdpbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgaGVhZGVyLCBhbmQgdGhlICJyYXcgZGF0YSIKKy8vIEFmdGVyIHRoZSBoZWFkZXIgaXMgYSAybWIgc2NyYXRjaCBzcGFjZSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhaGVhZCBkYXRhIGR1cmluZyBtZXJnZSBvcGVyYXRpb25zCisvLworLy8gVGhlIG9wZXJhdGlvbnMgYmVnaW4gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNjcmF0Y2ggc3BhY2UsIGFuZCB0aGUgInJhdyBkYXRhIgogLy8gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgb3BlcmF0aW9uIHdoaWNoIHJlZmVycyB0byBpdC4gV2hpbGUgc3RyZWFtaW5nCiAvLyBhbiBPVEEsIHdlIGNhbiBpbW1lZGlhdGVseSB3cml0ZSB0aGUgb3AgYW5kIGRhdGEsIHN5bmNpbmcgYWZ0ZXIgZWFjaCBwYWlyLAogLy8gd2hpbGUgc3RvcmluZyBvcGVyYXRpb24gbWV0YWRhdGEgaW4gbWVtb3J5LiBBdCB0aGUgZW5kLCB3ZSBjb21wdXRlIGRhdGEgYW5kCkBAIC01MywxMyArNjYsMTUgQEAKIC8vIGJldHdlZW4gd3JpdGluZyB0aGUgbGFzdCBvcGVyYXRpb24vZGF0YSBwYWlyLCBvciB0aGUgZm9vdGVyIGl0c2VsZi4gSW4gdGhpcwogLy8gY2FzZSwgdGhlIHNhZmVzdCB3YXkgdG8gcHJvY2VlZCBpcyB0byBhc3N1bWUgdGhlIGxhc3Qgb3BlcmF0aW9uIGlzIGZhdWx0eS4KIAotc3RydWN0IENvd0hlYWRlciB7CitzdHJ1Y3QgQ293SGVhZGVyUHJlZml4IHsKICAgICB1aW50NjRfdCBtYWdpYzsKICAgICB1aW50MTZfdCBtYWpvcl92ZXJzaW9uOwogICAgIHVpbnQxNl90IG1pbm9yX3ZlcnNpb247CisgICAgdWludDE2X3QgaGVhZGVyX3NpemU7ICAvLyBzaXplIG9mIENvd0hlYWRlci4KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKLSAgICAvLyBTaXplIG9mIHRoaXMgc3RydWN0LgotICAgIHVpbnQxNl90IGhlYWRlcl9zaXplOworc3RydWN0IENvd0hlYWRlciB7CisgICAgQ293SGVhZGVyUHJlZml4IHByZWZpeDsKIAogICAgIC8vIFNpemUgb2YgZm9vdGVyIHN0cnVjdAogICAgIHVpbnQxNl90IGZvb3Rlcl9zaXplOwpAQCAtNzgsMTggKzkzLDY0IEBACiAKICAgICAvLyBTY3JhdGNoIHNwYWNlIHVzZWQgZHVyaW5nIG1lcmdlCiAgICAgdWludDMyX3QgYnVmZmVyX3NpemU7CisKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKKy8vIFJlc3VtZSBwb2ludCBzdHJ1Y3R1cmUgdXNlZCBmb3IgcmVzdW1lIGJ1ZmZlcgorc3RydWN0IFJlc3VtZVBvaW50IHsKKyAgICAvLyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdmFsdWUgdXNlZCBieSB1cGRhdGVfZW5naW5lCisgICAgdWludDY0X3QgbGFiZWw7CisgICAgLy8gSW5kZXggb2YgbGFzdCBDb3dPcGVyYXRpb24gZ3VhcmFudGVlZCB0byBiZSByZXN1bWFibGUKKyAgICB1aW50MzJfdCBvcF9pbmRleDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTnVtUmVzdW1lUG9pbnRzID0gNDsKKworc3RydWN0IENvd0hlYWRlclYzIDogcHVibGljIENvd0hlYWRlciB7CisgICAgLy8gTnVtYmVyIG9mIHNlcXVlbmNlIGRhdGEgc3RvcmVkIChlYWNoIG9mIHdoaWNoIGlzIGEgMzIgYml0IGludGVnZXIpCisgICAgdWludDY0X3Qgc2VxdWVuY2VfZGF0YV9jb3VudDsKKyAgICAvLyBOdW1iZXIgb2YgY3VycmVudGx5IHdyaXR0ZW4gcmVzdW1lIHBvaW50cyAmJgorICAgIHVpbnQzMl90IHJlc3VtZV9wb2ludF9jb3VudDsKKyAgICAvLyBOdW1iZXIgb2YgbWF4IHJlc3VtZSBwb2ludHMgdGhhdCBjYW4gYmUgd3JpdHRlbgorICAgIHVpbnQzMl90IHJlc3VtZV9wb2ludF9tYXg7CisgICAgLy8gTnVtYmVyIG9mIENvd09wZXJhdGlvblYzIHN0cnVjdHMgaW4gdGhlIG9wZXJhdGlvbiBidWZmZXIsIGN1cnJlbnRseSBhbmQgdG90YWwKKyAgICAvLyByZWdpb24gc2l6ZS4KKyAgICB1aW50MzJfdCBvcF9jb3VudDsKKyAgICB1aW50MzJfdCBvcF9jb3VudF9tYXg7CisgICAgLy8gQ29tcHJlc3Npb24gQWxnb3JpdGhtCisgICAgdWludDMyX3QgY29tcHJlc3Npb25fYWxnb3JpdGhtOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSBjbGFzcyBDb3dPcGVyYXRpb25UeXBlIDogdWludDhfdCB7CisgICAga0Nvd0NvcHlPcCA9IDEsCisgICAga0Nvd1JlcGxhY2VPcCA9IDIsCisgICAga0Nvd1plcm9PcCA9IDMsCisgICAga0Nvd0xhYmVsT3AgPSA0LAorICAgIGtDb3dDbHVzdGVyT3AgPSA1LAorICAgIGtDb3dYb3JPcCA9IDYsCisgICAga0Nvd1NlcXVlbmNlT3AgPSA3LAorICAgIGtDb3dGb290ZXJPcCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpLAorfTsKKworc3RhdGljIGNvbnN0ZXhwciBDb3dPcGVyYXRpb25UeXBlIGtDb3dDb3B5T3AgPSBDb3dPcGVyYXRpb25UeXBlOjprQ293Q29weU9wOworc3RhdGljIGNvbnN0ZXhwciBDb3dPcGVyYXRpb25UeXBlIGtDb3dSZXBsYWNlT3AgPSBDb3dPcGVyYXRpb25UeXBlOjprQ293UmVwbGFjZU9wOworc3RhdGljIGNvbnN0ZXhwciBDb3dPcGVyYXRpb25UeXBlIGtDb3daZXJvT3AgPSBDb3dPcGVyYXRpb25UeXBlOjprQ293WmVyb09wOworc3RhdGljIGNvbnN0ZXhwciBDb3dPcGVyYXRpb25UeXBlIGtDb3dMYWJlbE9wID0gQ293T3BlcmF0aW9uVHlwZTo6a0Nvd0xhYmVsT3A7CitzdGF0aWMgY29uc3RleHByIENvd09wZXJhdGlvblR5cGUga0Nvd0NsdXN0ZXJPcCA9IENvd09wZXJhdGlvblR5cGU6OmtDb3dDbHVzdGVyT3A7CitzdGF0aWMgY29uc3RleHByIENvd09wZXJhdGlvblR5cGUga0Nvd1hvck9wID0gQ293T3BlcmF0aW9uVHlwZTo6a0Nvd1hvck9wOworc3RhdGljIGNvbnN0ZXhwciBDb3dPcGVyYXRpb25UeXBlIGtDb3dTZXF1ZW5jZU9wID0gQ293T3BlcmF0aW9uVHlwZTo6a0Nvd1NlcXVlbmNlT3A7CitzdGF0aWMgY29uc3RleHByIENvd09wZXJhdGlvblR5cGUga0Nvd0Zvb3Rlck9wID0gQ293T3BlcmF0aW9uVHlwZTo6a0Nvd0Zvb3Rlck9wOworCiAvLyBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgc2FtZSBzaXplIG9mIGEgbm9ybWFsIE9wZXJhdGlvbiwgYnV0IGlzIHJlcHVycG9zZWQgZm9yIHRoZSBmb290ZXIuCiBzdHJ1Y3QgQ293Rm9vdGVyT3BlcmF0aW9uIHsKICAgICAvLyBUaGUgb3BlcmF0aW9uIGNvZGUgKGFsd2F5cyBrQ293Rm9vdGVyT3ApLgotICAgIHVpbnQ4X3QgdHlwZTsKKyAgICBDb3dPcGVyYXRpb25UeXBlIHR5cGU7CiAKICAgICAvLyBJZiB0aGlzIG9wZXJhdGlvbiByZWFkcyBmcm9tIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIENPVywgdGhpcyBjb250YWlucwogICAgIC8vIHRoZSBjb21wcmVzc2lvbiB0eXBlIG9mIHRoYXQgZGF0YSAoc2VlIGNvbnN0YW50cyBiZWxvdykuCiAgICAgdWludDhfdCBjb21wcmVzc2lvbjsKIAotICAgIC8vIExlbmd0aCBvZiBGb290ZXIgRGF0YS4gQ3VycmVudGx5IDY0IGZvciBib3RoIGNoZWNrc3VtcworICAgIC8vIExlbmd0aCBvZiBGb290ZXIgRGF0YS4gQ3VycmVudGx5IDY0LgogICAgIHVpbnQxNl90IGRhdGFfbGVuZ3RoOwogCiAgICAgLy8gVGhlIGFtb3VudCBvZiBmaWxlIHNwYWNlIHVzZWQgYnkgQ293IG9wZXJhdGlvbnMKQEAgLTk5LDE5ICsxNjAsMTAgQEAKICAgICB1aW50NjRfdCBudW1fb3BzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotc3RydWN0IENvd0Zvb3RlckRhdGEgewotICAgIC8vIFNIQTI1NiBjaGVja3N1bXMgb2YgRm9vdGVyIG9wCi0gICAgdWludDhfdCBmb290ZXJfY2hlY2tzdW1bMzJdOwotCi0gICAgLy8gU0hBMjU2IG9mIHRoZSBvcGVyYXRpb24gc2VxdWVuY2UuCi0gICAgdWludDhfdCBvcHNfY2hlY2tzdW1bMzJdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLy8gQ293IG9wZXJhdGlvbnMgYXJlIGN1cnJlbnRseSBmaXhlZC1zaXplIGVudHJpZXMsIGJ1dCB0aGlzIG1heSBjaGFuZ2UgaWYKLS8vIG5lZWRlZC4KLXN0cnVjdCBDb3dPcGVyYXRpb24geworLy8gVjIgdmVyc2lvbiBvZiBDT1cuIE9uIGRpc2sgZm9ybWF0IGZvciBvbGRlciBkZXZpY2VzCitzdHJ1Y3QgQ293T3BlcmF0aW9uVjIgewogICAgIC8vIFRoZSBvcGVyYXRpb24gY29kZSAoc2VlIHRoZSBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgYmVsb3cpLgotICAgIHVpbnQ4X3QgdHlwZTsKKyAgICBDb3dPcGVyYXRpb25UeXBlIHR5cGU7CiAKICAgICAvLyBJZiB0aGlzIG9wZXJhdGlvbiByZWFkcyBmcm9tIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIENPVywgdGhpcyBjb250YWlucwogICAgIC8vIHRoZSBjb21wcmVzc2lvbiB0eXBlIG9mIHRoYXQgZGF0YSAoc2VlIGNvbnN0YW50cyBiZWxvdykuCkBAIC0xNDMsMzEgKzE5NSw5OCBAQAogICAgIHVpbnQ2NF90IHNvdXJjZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKLXN0YXRpY19hc3NlcnQoc2l6ZW9mKENvd09wZXJhdGlvbikgPT0gc2l6ZW9mKENvd0Zvb3Rlck9wZXJhdGlvbikpOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvRGF0YU1hc2sgPSAoMVVMTCA8PCA0OCkgLSAxOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvVHlwZUJpdCA9IDYwOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvVHlwZU51bUJpdHMgPSA0Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvVHlwZU1hc2sgPSAoMVVMTCA8PCBrQ293T3BTb3VyY2VJbmZvVHlwZU51bUJpdHMpIC0gMTsKKy8vIFRoZSBvbiBkaXNrIGZvcm1hdCBvZiBjb3cgKGN1cnJlbnRseSA9PSAgQ293T3BlcmF0aW9uKQorc3RydWN0IENvd09wZXJhdGlvblYzIHsKKyAgICAvLyBJZiB0aGlzIG9wZXJhdGlvbiByZWFkcyBmcm9tIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIENPVywgdGhpcyBjb250YWlucworICAgIC8vIHRoZSBsZW5ndGguCisgICAgdWludDE2X3QgZGF0YV9sZW5ndGg7CiAKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293Q29weU9wID0gMTsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293UmVwbGFjZU9wID0gMjsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293WmVyb09wID0gMzsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293TGFiZWxPcCA9IDQ7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0Nvd0NsdXN0ZXJPcCA9IDU7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0Nvd1hvck9wID0gNjsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293U2VxdWVuY2VPcCA9IDc7Ci1zdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0Nvd0Zvb3Rlck9wID0gLTE7CisgICAgLy8gVGhlIGJsb2NrIG9mIGRhdGEgaW4gdGhlIG5ldyBpbWFnZSB0aGF0IHRoaXMgb3BlcmF0aW9uIG1vZGlmaWVzLgorICAgIHVpbnQzMl90IG5ld19ibG9jazsKKworICAgIC8vIHNvdXJjZV9pbmZvIHdpdGggaGF2ZSB0aGUgZm9sbG93aW5nIGxheW91dAorICAgIC8vIHwtLS00IGJpdHMgLS0tfCAtLS0xMiBiaXRzLS0tfCAtLS0gNDggYml0cyAtLS18CisgICAgLy8gfC0tLSB0eXBlIC0tLSB8IC0tIHVudXNlZCAtLSB8IC0tLSBzb3VyY2UgLS0tIHwKKyAgICAvLworICAgIC8vIFRoZSB2YWx1ZSBvZiB8c291cmNlfCBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpb24gY29kZS4KKyAgICAvLworICAgIC8vIENvcHlPcDogYSAzMi1iaXQgYmxvY2sgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAvLyBSZXBsYWNlT3A6IGFuIGFic29sdXRlIGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgQ09XJ3MgZGF0YSBzZWN0aW9uLgorICAgIC8vIFhvck9wOiBhbiBhYnNvbHV0ZSBieXRlIG9mZnNldCBpbiB0aGUgc291cmNlIGltYWdlLgorICAgIC8vIFplcm9PcDogdW51c2VkCisgICAgLy8gTGFiZWxPcDogYSA2NC1iaXQgb3BhcXVlIGlkZW50aWZpZXIuCisgICAgLy8KKyAgICAvLyBGb3Igb3BzIG90aGVyIHRoYW4gTGFiZWw6CisgICAgLy8gIEJpdHMgNDctNjIgYXJlIHJlc2VydmVkIGFuZCBtdXN0IGJlIHplcm8uCisgICAgLy8gQSBibG9jayBpcyBjb21wcmVzc2VkIGlmIGl04oCZcyBkYXRhIGlzIDwgYmxvY2tfc3oKKyAgICB1aW50NjRfdCBzb3VyY2VfaW5mb187CisgICAgY29uc3RleHByIHVpbnQ2NF90IHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIHNvdXJjZV9pbmZvXyAmIGtDb3dPcFNvdXJjZUluZm9EYXRhTWFzazsgfQorICAgIGNvbnN0ZXhwciB2b2lkIHNldF9zb3VyY2UodWludDY0X3Qgc291cmNlKSB7CisgICAgICAgIC8vIENsZWFyIHRoZSBmaXJzdCA0OCBiaXQgZmlyc3QKKyAgICAgICAgc291cmNlX2luZm9fICY9IH5rQ293T3BTb3VyY2VJbmZvRGF0YU1hc2s7CisgICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIHNvdXJjZSBmaWVsZAorICAgICAgICBzb3VyY2VfaW5mb18gfD0gc291cmNlICYga0Nvd09wU291cmNlSW5mb0RhdGFNYXNrOworICAgIH0KKyAgICBjb25zdGV4cHIgQ293T3BlcmF0aW9uVHlwZSB0eXBlKCkgY29uc3QgeworICAgICAgICAvLyB0aGlzIGlzIGEgbWFzayB0byBncmFiIHRoZSBmaXJzdCA0IGJpdHMgb2YgYSA2NCBiaXQgaW50ZWdlcgorICAgICAgICBjb25zdCBhdXRvIHR5cGUgPSAoc291cmNlX2luZm9fID4+IGtDb3dPcFNvdXJjZUluZm9UeXBlQml0KSAmIGtDb3dPcFNvdXJjZUluZm9UeXBlTWFzazsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENvd09wZXJhdGlvblR5cGU+KHR5cGUpOworICAgIH0KKyAgICBjb25zdGV4cHIgdm9pZCBzZXRfdHlwZShDb3dPcGVyYXRpb25UeXBlIHR5cGUpIHsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIHRvcCA0IGJpdHMgZmlyc3QKKyAgICAgICAgc291cmNlX2luZm9fICY9ICgoMVVMTCA8PCBrQ293T3BTb3VyY2VJbmZvVHlwZUJpdCkgLSAxKTsKKyAgICAgICAgLy8gc2V0IHRoZSBhY3R1YWwgdHlwZSBiaXRzCisgICAgICAgIHNvdXJjZV9pbmZvXyB8PSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHR5cGUpICYga0Nvd09wU291cmNlSW5mb1R5cGVNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwga0Nvd09wU291cmNlSW5mb1R5cGVCaXQ7CisgICAgfQorfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLy8gRW5zdXJlIHRoYXQgZ2V0dGVycy9zZXR0ZXJzIGFkZGVkIHRvIENvd09wZXJhdGlvblYzIGRvZXMgbm90IGluY3JlYXNlcyBzaXplCisvLyBvZiBDb3dPcGVyYXRpb25WMyBzdHJ1Y3Qobm8gdmlydHVhbCBtZXRob2QgdGFibGVzIGFkZGVkKS4KK3N0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGVfdjxDb3dPcGVyYXRpb25WMz4pOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3N0YW5kYXJkX2xheW91dF92PENvd09wZXJhdGlvblYzPik7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihDb3dPcGVyYXRpb25WMikgPT0gc2l6ZW9mKENvd0Zvb3Rlck9wZXJhdGlvbikpOwogCiBlbnVtIENvd0NvbXByZXNzaW9uQWxnb3JpdGhtIDogdWludDhfdCB7CiAgICAga0Nvd0NvbXByZXNzTm9uZSA9IDAsCiAgICAga0Nvd0NvbXByZXNzR3ogPSAxLAogICAgIGtDb3dDb21wcmVzc0Jyb3RsaSA9IDIsCi0gICAga0Nvd0NvbXByZXNzTHo0ID0gMworICAgIGtDb3dDb21wcmVzc0x6NCA9IDMsCisgICAga0Nvd0NvbXByZXNzWnN0ZCA9IDQsCit9Oworc3RydWN0IENvd0NvbXByZXNzaW9uIHsKKyAgICBDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBhbGdvcml0aG0gPSBrQ293Q29tcHJlc3NOb25lOworICAgIHVpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsID0gMDsKIH07CiAKIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293UmVhZEFoZWFkTm90U3RhcnRlZCA9IDA7CiBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0Nvd1JlYWRBaGVhZEluUHJvZ3Jlc3MgPSAxOwogc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb3dSZWFkQWhlYWREb25lID0gMjsKIAorc3RhdGljIGNvbnN0ZXhwciBvZmZfdCBHZXRTZXF1ZW5jZU9mZnNldChjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyKSB7CisgICAgcmV0dXJuIGhlYWRlci5wcmVmaXguaGVhZGVyX3NpemUgKyBoZWFkZXIuYnVmZmVyX3NpemU7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgb2ZmX3QgR2V0UmVzdW1lT2Zmc2V0KGNvbnN0IENvd0hlYWRlclYzJiBoZWFkZXIpIHsKKyAgICByZXR1cm4gR2V0U2VxdWVuY2VPZmZzZXQoaGVhZGVyKSArIChoZWFkZXIuc2VxdWVuY2VfZGF0YV9jb3VudCAqIHNpemVvZih1aW50MzJfdCkpOworfQorCitzdGF0aWMgY29uc3RleHByIG9mZl90IEdldE9wT2Zmc2V0KHVpbnQzMl90IG9wX2luZGV4LCBjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyKSB7CisgICAgcmV0dXJuIEdldFJlc3VtZU9mZnNldChoZWFkZXIpICsgKGhlYWRlci5yZXN1bWVfcG9pbnRfbWF4ICogc2l6ZW9mKFJlc3VtZVBvaW50KSkgKworICAgICAgICAgICAob3BfaW5kZXggKiBzaXplb2YoQ293T3BlcmF0aW9uVjMpKTsKK30KKworc3RhdGljIGNvbnN0ZXhwciBvZmZfdCBHZXREYXRhT2Zmc2V0KGNvbnN0IENvd0hlYWRlclYzJiBoZWFkZXIpIHsKKyAgICByZXR1cm4gR2V0T3BPZmZzZXQoaGVhZGVyLm9wX2NvdW50X21heCwgaGVhZGVyKTsKK30KKwogc3RydWN0IENvd0Zvb3RlciB7CiAgICAgQ293Rm9vdGVyT3BlcmF0aW9uIG9wOwotICAgIENvd0Zvb3RlckRhdGEgZGF0YTsKKyAgICB1aW50OF90IHVudXNlZFs2NF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgU2NyYXRjaE1ldGFkYXRhIHsKQEAgLTE4NiwxNSArMzA1LDI0IEBACiAvLyAyTUIgU2NyYXRjaCBzcGFjZSB1c2VkIGZvciByZWFkLWFoZWFkCiBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IEJVRkZFUl9SRUdJT05fREVGQVVMVF9TSVpFID0gKDFVTEwgPDwgMjEpOwogCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgQ293T3BlcmF0aW9uIGNvbnN0JiBhcmcpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIENvd09wZXJhdGlvblYyIGNvbnN0JiBhcmcpOwogCi1pbnQ2NF90IEdldE5leHRPcE9mZnNldChjb25zdCBDb3dPcGVyYXRpb24mIG9wLCB1aW50MzJfdCBjbHVzdGVyX3NpemUpOwotaW50NjRfdCBHZXROZXh0RGF0YU9mZnNldChjb25zdCBDb3dPcGVyYXRpb24mIG9wLCB1aW50MzJfdCBjbHVzdGVyX3NpemUpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIENvd09wZXJhdGlvblYzIGNvbnN0JiBhcmcpOworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgUmVzdW1lUG9pbnQgY29uc3QmIGFyZyk7CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBDb3dPcGVyYXRpb25UeXBlIGNvd190eXBlKTsKKworaW50NjRfdCBHZXROZXh0T3BPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uVjImIG9wLCB1aW50MzJfdCBjbHVzdGVyX3NpemUpOworaW50NjRfdCBHZXROZXh0RGF0YU9mZnNldChjb25zdCBDb3dPcGVyYXRpb25WMiYgb3AsIHVpbnQzMl90IGNsdXN0ZXJfc2l6ZSk7CiAKIC8vIE9wcyB0aGF0IGFyZSBpbnRlcm5hbCB0byB0aGUgQ293IEZvcm1hdCBhbmQgbm90IE9UQSBkYXRhCiBib29sIElzTWV0YWRhdGFPcChjb25zdCBDb3dPcGVyYXRpb24mIG9wKTsKIC8vIE9wcyB0aGF0IGhhdmUgZGVwZW5kZW5jaWVzIG9uIG9sZCBibG9ja3MsIGFuZCBtdXN0IHRha2UgY2FyZSBpbiB0aGVpciBtZXJnZSBvcmRlcgogYm9vbCBJc09yZGVyZWRPcChjb25zdCBDb3dPcGVyYXRpb24mIG9wKTsKIAorLy8gQ29udmVydCBjb21wcmVzc2lvbiBuYW1lIHRvIGludGVybmFsIHZhbHVlLgorc3RkOjpvcHRpb25hbDxDb3dDb21wcmVzc2lvbkFsZ29yaXRobT4gQ29tcHJlc3Npb25BbGdvcml0aG1Gcm9tU3RyaW5nKHN0ZDo6c3RyaW5nX3ZpZXcgbmFtZSk7CisKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19yZWFkZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19yZWFkZXIuaAppbmRleCBlOGU0ZDcyLi5iZjRjNzlmIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9jb3dfcmVhZGVyLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X3JlYWRlci5oCkBAIC0xNiw3ICsxNiw2IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CkBAIC0yNCw0NyArMjMsMjQgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgogCituYW1lc3BhY2UgY2hyb21lb3NfdXBkYXRlX2VuZ2luZSB7CitjbGFzcyBGaWxlRGVzY3JpcHRvcjsKK30gIC8vIG5hbWVzcGFjZSBjaHJvbWVvc191cGRhdGVfZW5naW5lCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKIGNsYXNzIElDb3dPcEl0ZXI7CiAKLS8vIEEgQnl0ZVNpbmsgb2JqZWN0IGhhbmRsZXMgcmVxdWVzdHMgZm9yIGEgYnVmZmVyIG9mIGEgc3BlY2lmaWMgc2l6ZS4gSXQKLS8vIGFsd2F5cyBvd25zIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4gSXQncyBkZXNpZ25lZCB0byBtaW5pbWl6ZSBwb3RlbnRpYWwKLS8vIGNvcHlpbmcgYXMgd2UgcGFyc2Ugb3IgZGVjb21wcmVzcyB0aGUgQ09XLgotY2xhc3MgSUJ5dGVTaW5rIHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgfklCeXRlU2luaygpIHt9Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgcmVhZGVyIGhhcyBkYXRhLiBUaGUgc2l6ZSBvZiB0aGUgcmVxdWVzdCBpcyBnaXZlbi4gVGhlCi0gICAgLy8gc2luayBtdXN0IHJldHVybiBhIHZhbGlkIHBvaW50ZXIgKG9yIG51bGwgb24gZmFpbHVyZSksIGFuZCByZXR1cm4gdGhlCi0gICAgLy8gbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byB0aGUgcmV0dXJuZWQgYnVmZmVyLgotICAgIC8vCi0gICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciBpcyBvd25lZCBieSBJQnl0ZVNpbmssIGJ1dCBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbAotICAgIC8vIHRoZSByZWFkIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkIChvciB0aGUgZW50aXJlIGJ1ZmZlciBoYXMgYmVlbgotICAgIC8vIGNvdmVyZWQgYnkgY2FsbHMgdG8gUmV0dXJuRGF0YSkuCi0gICAgLy8KLSAgICAvLyBBZnRlciBjYWxsaW5nIEdldEJ1ZmZlcigpLCBhbGwgcHJldmlvdXMgYnVmZmVycyByZXR1cm5lZCBhcmUgbm8gbG9uZ2VyCi0gICAgLy8gdmFsaWQuCi0gICAgLy8KLSAgICAvLyBHZXRCdWZmZXIoKSBpcyBpbnRlbmRlZCB0byBiZSBzZXF1ZW50aWFsLiBBIHJldHVybmVkIHNpemUgb2YgTiBpbmRpY2F0ZXMKLSAgICAvLyB0aGF0IHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgYWR2YW5jZSBieSBOIGJ5dGVzLCBhbmQgdGhlIFJldHVybkRhdGEgY2FsbAotICAgIC8vIGluZGljYXRlcyB0aGF0IHRob3NlIGJ5dGVzIGhhdmUgYmVlbiBmdWxmaWxsZWQuIFRoZXJlZm9yZSwgaXQgaXMKLSAgICAvLyBwb3NzaWJsZSB0byBoYXZlIFJldHVybkJ1ZmZlciBkbyBub3RoaW5nLCBpZiB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndAotICAgIC8vIGNhcmUgYWJvdXQgaW5jcmVtZW50YWwgd3JpdGVzLgotICAgIHZpcnR1YWwgdm9pZCogR2V0QnVmZmVyKHNpemVfdCByZXF1ZXN0ZWQsIHNpemVfdCogYWN0dWFsKSA9IDA7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiBhIHNlY3Rpb24gcmV0dXJuZWQgYnkgfEdldEJ1ZmZlcnwgaGFzIGJlZW4gZmlsbGVkIHdpdGggZGF0YS4KLSAgICB2aXJ0dWFsIGJvb2wgUmV0dXJuRGF0YSh2b2lkKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpID0gMDsKLX07Ci0KIC8vIEludGVyZmFjZSBmb3IgcmVhZGluZyBmcm9tIGEgc25hcHVzZXJkIENPVy4KIGNsYXNzIElDb3dSZWFkZXIgewogICBwdWJsaWM6CisgICAgdXNpbmcgRmlsZURlc2NyaXB0b3IgPSBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpGaWxlRGVzY3JpcHRvcjsKKwogICAgIHZpcnR1YWwgfklDb3dSZWFkZXIoKSB7fQogCiAgICAgLy8gUmV0dXJuIHRoZSBmaWxlIGhlYWRlci4KLSAgICB2aXJ0dWFsIGJvb2wgR2V0SGVhZGVyKENvd0hlYWRlciogaGVhZGVyKSA9IDA7CisgICAgdmlydHVhbCBDb3dIZWFkZXImIEdldEhlYWRlcigpID0gMDsKIAogICAgIC8vIFJldHVybiB0aGUgZmlsZSBmb290ZXIuCiAgICAgdmlydHVhbCBib29sIEdldEZvb3RlcihDb3dGb290ZXIqIGZvb3RlcikgPSAwOwpAQCAtODMsMjkgKzU5LDU1IEBACiAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SUNvd09wSXRlcj4gR2V0TWVyZ2VPcEl0ZXIoYm9vbCBpZ25vcmVfcHJvZ3Jlc3MpID0gMDsKIAogICAgIC8vIEdldCBkZWNvZGVkIGJ5dGVzIGZyb20gdGhlIGRhdGEgc2VjdGlvbiwgaGFuZGxpbmcgYW55IGRlY29tcHJlc3Npb24uCi0gICAgLy8gQWxsIHJldHJpZXZlZCBkYXRhIGlzIHBhc3NlZCB0byB0aGUgc2luay4KLSAgICB2aXJ0dWFsIGJvb2wgUmVhZERhdGEoY29uc3QgQ293T3BlcmF0aW9uJiBvcCwgSUJ5dGVTaW5rKiBzaW5rKSA9IDA7CisgICAgLy8KKyAgICAvLyBJZiBpZ25vcmVfYnl0ZXMgaXMgbm9uLXplcm8sIGl0IHNwZWNpZmllcyB0aGUgaW5pdGlhbCBudW1iZXIgb2YgYnl0ZXMKKyAgICAvLyB0byBza2lwIHdyaXRpbmcgdG8gfGJ1ZmZlcnwuCisgICAgLy8KKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB8YnVmZmVyfCwgb3IgLTEgb24gZmFpbHVyZS4KKyAgICAvLyBlcnJubyBpcyBOT1Qgc2V0LgorICAgIC8vCisgICAgLy8gUGFydGlhbCByZWFkcyBhcmUgbm90IHBvc3NpYmxlIHVubGVzcyB8YnVmZmVyX3NpemV8IGlzIGxlc3MgdGhhbiB0aGUKKyAgICAvLyBvcGVyYXRpb24gYmxvY2sgc2l6ZS4KKyAgICAvLworICAgIC8vIFRoZSBvcGVyYXRpb24gcG9pbnRlciBtdXN0IGRlcml2ZSBmcm9tIElDb3dPcEl0ZXI6OkdldCgpLgorICAgIHZpcnR1YWwgc3NpemVfdCBSZWFkRGF0YShjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGlnbm9yZV9ieXRlcyA9IDApID0gMDsKKworICAgIC8vIEdldCB0aGUgYWJzb2x1dGUgc291cmNlIG9mZnNldCwgaW4gYnl0ZXMsIG9mIGEgQ293T3BlcmF0aW9uLiBSZXR1cm5zCisgICAgLy8gZmFsc2UgaWYgdGhlIG9wZXJhdGlvbiBkb2VzIG5vdCByZWFkIGZyb20gc291cmNlIHBhcnRpdGlvbnMuCisgICAgdmlydHVhbCBib29sIEdldFNvdXJjZU9mZnNldChjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB1aW50NjRfdCogc291cmNlX29mZnNldCkgPSAwOwogfTsKIAotLy8gSXRlcmF0ZSBvdmVyIGEgc2VxdWVuY2Ugb2YgQ09XIG9wZXJhdGlvbnMuCitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IEdldEJsb2NrRnJvbU9mZnNldChjb25zdCBDb3dIZWFkZXImIGhlYWRlciwgdWludDY0X3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIG9mZnNldCAvIGhlYWRlci5ibG9ja19zaXplOworfQorCitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IEdldEJsb2NrUmVsYXRpdmVPZmZzZXQoY29uc3QgQ293SGVhZGVyJiBoZWFkZXIsIHVpbnQ2NF90IG9mZnNldCkgeworICAgIHJldHVybiBvZmZzZXQgJSBoZWFkZXIuYmxvY2tfc2l6ZTsKK30KKworLy8gSXRlcmF0ZSBvdmVyIGEgc2VxdWVuY2Ugb2YgQ09XIG9wZXJhdGlvbnMuIFRoZSBpdGVyYXRvciBpcyBiaWRpcmVjdGlvbmFsLgogY2xhc3MgSUNvd09wSXRlciB7CiAgIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5JQ293T3BJdGVyKCkge30KIAotICAgIC8vIFRydWUgaWYgdGhlcmUgYXJlIG5vIG1vcmUgaXRlbXMgdG8gcmVhZCBmb3J3YXJkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgdmlydHVhbCBib29sIERvbmUoKSA9IDA7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb24gbGlzdC4KKyAgICAvLyBJZiB0cnVlLCBHZXQoKSBhbmQgTmV4dCgpIG11c3Qgbm90IGJlIGNhbGxlZC4KKyAgICB2aXJ0dWFsIGJvb2wgQXRFbmQoKSA9IDA7CiAKICAgICAvLyBSZWFkIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLSAgICB2aXJ0dWFsIGNvbnN0IENvd09wZXJhdGlvbiYgR2V0KCkgPSAwOworICAgIHZpcnR1YWwgY29uc3QgQ293T3BlcmF0aW9uKiBHZXQoKSA9IDA7CiAKICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IGl0ZW0uCiAgICAgdmlydHVhbCB2b2lkIE5leHQoKSA9IDA7CiAKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGl0ZXJhdG9yIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wZXJhdGlvbiBsaXN0LgorICAgIC8vIElmIHRydWUsIFByZXYoKSBtdXN0IG5vdCBiZSBjYWxsZWQ7IEdldCgpIGhvd2V2ZXIgd2lsbCBiZSB2YWxpZCBpZgorICAgIC8vIEF0RW5kKCkgaXMgbm90IHRydWUuCisgICAgdmlydHVhbCBib29sIEF0QmVnaW4oKSA9IDA7CisKICAgICAvLyBBZHZhbmNlIHRvIHRoZSBwcmV2aW91cyBpdGVtLgogICAgIHZpcnR1YWwgdm9pZCBQcmV2KCkgPSAwOwotCi0gICAgLy8gVHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcyB0byByZWFkIGJhY2t3YXJkcywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgdmlydHVhbCBib29sIFJEb25lKCkgPSAwOwogfTsKIAogY2xhc3MgQ293UmVhZGVyIGZpbmFsIDogcHVibGljIElDb3dSZWFkZXIgewpAQCAtMTI0LDEyICsxMjYsMTEgQEAKICAgICBib29sIFBhcnNlKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCA9IHt9KTsKIAogICAgIGJvb2wgSW5pdEZvck1lcmdlKGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYmIGZkKTsKKwogICAgIGJvb2wgVmVyaWZ5TWVyZ2VPcHMoKSBvdmVycmlkZTsKLQotICAgIGJvb2wgR2V0SGVhZGVyKENvd0hlYWRlciogaGVhZGVyKSBvdmVycmlkZTsKICAgICBib29sIEdldEZvb3RlcihDb3dGb290ZXIqIGZvb3Rlcikgb3ZlcnJpZGU7Ci0KICAgICBib29sIEdldExhc3RMYWJlbCh1aW50NjRfdCogbGFiZWwpIG92ZXJyaWRlOworICAgIGJvb2wgR2V0U291cmNlT2Zmc2V0KGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHVpbnQ2NF90KiBzb3VyY2Vfb2Zmc2V0KSBvdmVycmlkZTsKIAogICAgIC8vIENyZWF0ZSBhIENvd09wSXRlciBvYmplY3Qgd2hpY2ggY29udGFpbnMgZm9vdGVyXy5udW1fb3BzCiAgICAgLy8gQ293T3BlcmF0aW9uIG9iamVjdHMuIEdldCgpIHJldHVybnMgYSB1bmlxdWUgQ293T3BlcmF0aW9uIG9iamVjdApAQCAtMTM5LDggKzE0MCwxMyBAQAogICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBHZXRSZXZNZXJnZU9wSXRlcihib29sIGlnbm9yZV9wcm9ncmVzcyA9IGZhbHNlKSBvdmVycmlkZTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd09wSXRlcj4gR2V0TWVyZ2VPcEl0ZXIoYm9vbCBpZ25vcmVfcHJvZ3Jlc3MgPSBmYWxzZSkgb3ZlcnJpZGU7CiAKLSAgICBib29sIFJlYWREYXRhKGNvbnN0IENvd09wZXJhdGlvbiYgb3AsIElCeXRlU2luayogc2luaykgb3ZlcnJpZGU7CisgICAgc3NpemVfdCBSZWFkRGF0YShjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpZ25vcmVfYnl0ZXMgPSAwKSBvdmVycmlkZTsKIAorICAgIENvd0hlYWRlciYgR2V0SGVhZGVyKCkgb3ZlcnJpZGUgeyByZXR1cm4gaGVhZGVyXzsgfQorICAgIGNvbnN0IENvd0hlYWRlclYzJiBoZWFkZXJfdjMoKSBjb25zdCB7IHJldHVybiBoZWFkZXJfOyB9CisKKyAgICBib29sIEdldFJhd0J5dGVzKGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbiwgc2l6ZV90KiByZWFkKTsKICAgICBib29sIEdldFJhd0J5dGVzKHVpbnQ2NF90IG9mZnNldCwgdm9pZCogYnVmZmVyLCBzaXplX3QgbGVuLCBzaXplX3QqIHJlYWQpOwogCiAgICAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgb3BzIHRoYXQgc2hvdWxkIGJlIG1lcmdlZC4gVGhpcyBpcyB0aGUKQEAgLTE1OSwxMyArMTY1LDIwIEBACiAgICAgdm9pZCBVcGRhdGVNZXJnZU9wc0NvbXBsZXRlZChpbnQgbnVtX21lcmdlX29wcykgeyBoZWFkZXJfLm51bV9tZXJnZV9vcHMgKz0gbnVtX21lcmdlX29wczsgfQogCiAgIHByaXZhdGU6Ci0gICAgYm9vbCBQYXJzZU9wcyhzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCk7CisgICAgYm9vbCBQYXJzZVYyKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCk7CiAgICAgYm9vbCBQcmVwTWVyZ2VPcHMoKTsKKyAgICAvLyBzZXF1ZW5jZSBkYXRhIGlzIHN0b3JlZCBhcyBhbiBvcGVyYXRpb24gd2l0aCBhY3R1YWwgZGF0YSByZXNpZGluZyBpbiB0aGUgZGF0YSBvZmZzZXQuCisgICAgYm9vbCBHZXRTZXF1ZW5jZURhdGFWMihzdGQ6OnZlY3Rvcjx1aW50MzJfdD4qIG1lcmdlX29wX2Jsb2Nrcywgc3RkOjp2ZWN0b3I8aW50Piogb3RoZXJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBpbnQ+KiBibG9ja19tYXApOworICAgIC8vIHYzIG9mIHRoZSBjb3cgd3JpdGVzIHNlcXVlbmNlIGRhdGEgd2l0aGluIGl0cyBvd24gc2VwYXJhdGUgc2VxdWVuY2UgYnVmZmVyLgorICAgIGJvb2wgR2V0U2VxdWVuY2VEYXRhKHN0ZDo6dmVjdG9yPHVpbnQzMl90PiogbWVyZ2Vfb3BfYmxvY2tzLCBzdGQ6OnZlY3RvcjxpbnQ+KiBvdGhlcl9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBpbnQ+KiBibG9ja19tYXApOwogICAgIHVpbnQ2NF90IEZpbmROdW1Db3B5b3BzKCk7CisgICAgdWludDhfdCBHZXRDb21wcmVzc2lvblR5cGUoKTsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBvd25lZF9mZF87CiAgICAgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmRfOwotICAgIENvd0hlYWRlciBoZWFkZXJfOworICAgIENvd0hlYWRlclYzIGhlYWRlcl87CiAgICAgc3RkOjpvcHRpb25hbDxDb3dGb290ZXI+IGZvb3Rlcl87CiAgICAgdWludDY0X3QgZmRfc2l6ZV87CiAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFzdF9sYWJlbF87CkBAIC0xNzUsMTAgKzE4OCwxNCBAQAogICAgIHVpbnQ2NF90IG51bV90b3RhbF9kYXRhX29wc197fTsKICAgICB1aW50NjRfdCBudW1fb3JkZXJlZF9vcHNfdG9fbWVyZ2Vfe307CiAgICAgYm9vbCBoYXNfc2VxX29wc197fTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4+IGRhdGFfbG9jXzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4+IHhvcl9kYXRhX2xvY187CiAgICAgUmVhZGVyRmxhZ3MgcmVhZGVyX2ZsYWdfOwogICAgIGJvb2wgaXNfbWVyZ2Vfe307CiB9OwogCisvLyBUaG91Z2ggdGhpcyBmdW5jdGlvbiB0YWtlcyBpbiBhIENvd0hlYWRlclYzLCB0aGUgc3RydWN0IGNvdWxkIGJlIHBvcHVsYXRlZCBhcyBhIHYxL3YyIENvd0hlYWRlci4KKy8vIFRoZSBleHRyYSBmaWVsZHMgd2lsbCBqdXN0IGJlIGZpbGxlZCBhcyAwLiBWMyBoZWFkZXIgaXMgc3RyaWN0bHkgYSBzdXBlcnNldCBvZiB2MS92MiBoZWFkZXIgYW5kCisvLyBjb250YWlucyBhbGwgb2YgdGhlIGxhdHRlcidzIGZpZWxkCitib29sIFJlYWRDb3dIZWFkZXIoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIENvd0hlYWRlclYzKiBoZWFkZXIpOwogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X3dyaXRlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X3dyaXRlci5oCmluZGV4IGM3YjgzYTguLjdkZjk3NmQgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd193cml0ZXIuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9jb3dfd3JpdGVyLmgKQEAgLTEsMzEgKzEsMzAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBjb3B5cmlnaHQgKGMpIDIwMTkgdGhlIGFuZHJvaWQgb3BlbiBzb3VyY2UgcHJvamVjdAogLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyBsaWNlbnNlZCB1bmRlciB0aGUgYXBhY2hlIGxpY2Vuc2UsIHZlcnNpb24gMi4wICh0aGUgImxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgbGljZW5zZS4KKy8vIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBhdAogLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9saWNlbnNlLTIuMAogLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gImFzIGlzIiBiYXNpcywKKy8vIHdpdGhvdXQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gc2VlIHRoZSBsaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIGxpY2Vuc2UuCiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2NvbXByZXNzLmg+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KICNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1dHVyZT4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KQEAgLTM0LDcgKzMzLDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KK3N0cnVjdCBDb3dTaXplSW5mbyB7CisgICAgdWludDY0X3QgY293X3NpemU7CisgICAgdWludDY0X3Qgb3BfY291bnRfbWF4OworfTsKIHN0cnVjdCBDb3dPcHRpb25zIHsKICAgICB1aW50MzJfdCBibG9ja19zaXplID0gNDA5NjsKICAgICBzdGQ6OnN0cmluZyBjb21wcmVzc2lvbjsKQEAgLTU1LDc2ICs1Nyw3NCBAQAogCiAgICAgLy8gQmF0Y2ggd3JpdGUgY2x1c3RlciBvcHMKICAgICBib29sIGJhdGNoX3dyaXRlID0gZmFsc2U7CisKKyAgICAvLyBTaXplIG9mIHRoZSBjb3cgb3BlcmF0aW9uIGJ1ZmZlcjsgdXNlZCBpbiB2MyBvbmx5LgorICAgIHVpbnQ2NF90IG9wX2NvdW50X21heCA9IDA7CiB9OwogCiAvLyBJbnRlcmZhY2UgZm9yIHdyaXRpbmcgdG8gYSBzbmFwdXNlcmQgQ09XLiBBbGwgb3BlcmF0aW9ucyBhcmUgb3JkZXJlZDsgbWVyZ2VzCiAvLyB3aWxsIG9jY3VyIGluIHRoZSBzZXF1ZW5jZSB0aGV5IHdlcmUgYWRkZWQgdG8gdGhlIENPVy4KIGNsYXNzIElDb3dXcml0ZXIgewogICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSUNvd1dyaXRlcihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKSA6IG9wdGlvbnNfKG9wdGlvbnMpIHt9CisgICAgdXNpbmcgRmlsZURlc2NyaXB0b3IgPSBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpGaWxlRGVzY3JpcHRvcjsKIAogICAgIHZpcnR1YWwgfklDb3dXcml0ZXIoKSB7fQogCiAgICAgLy8gRW5jb2RlIGFuIG9wZXJhdGlvbiB0aGF0IGNvcGllcyB0aGUgY29udGVudHMgb2YgfG9sZF9ibG9ja3wgdG8gdGhlCiAgICAgLy8gbG9jYXRpb24gb2YgfG5ld19ibG9ja3wuICdudW1fYmxvY2tzJyBpcyB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMKICAgICAvLyBDT1BZIG9wZXJhdGlvbnMgZnJvbSB8b2xkX2Jsb2NrfCB0byB8bmV3X2Jsb2NrfC4KLSAgICBib29sIEFkZENvcHkodWludDY0X3QgbmV3X2Jsb2NrLCB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQ2NF90IG51bV9ibG9ja3MgPSAxKTsKKyAgICB2aXJ0dWFsIGJvb2wgQWRkQ29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpID0gMDsKIAogICAgIC8vIEVuY29kZSBhIHNlcXVlbmNlIG9mIHJhdyBibG9ja3MuIHxzaXplfCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCi0gICAgYm9vbCBBZGRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdmlydHVhbCBib29sIEFkZFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSA9IDA7CiAKICAgICAvLyBBZGQgYSBzZXF1ZW5jZSBvZiB4b3InZCBibG9ja3MuIHxzaXplfCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCi0gICAgYm9vbCBBZGRYb3JCbG9ja3ModWludDMyX3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgb2xkX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCk7CisgICAgdmlydHVhbCBib29sIEFkZFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQpID0gMDsKIAogICAgIC8vIEVuY29kZSBhIHNlcXVlbmNlIG9mIHplcm9lZCBibG9ja3MuIHxzaXplfCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCi0gICAgYm9vbCBBZGRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2Nrcyk7CisgICAgdmlydHVhbCBib29sIEFkZFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCB1aW50NjRfdCBudW1fYmxvY2tzKSA9IDA7CiAKICAgICAvLyBBZGQgYSBsYWJlbCB0byB0aGUgb3Agc2VxdWVuY2UuCi0gICAgYm9vbCBBZGRMYWJlbCh1aW50NjRfdCBsYWJlbCk7CisgICAgdmlydHVhbCBib29sIEFkZExhYmVsKHVpbnQ2NF90IGxhYmVsKSA9IDA7CiAKICAgICAvLyBBZGQgc2VxdWVuY2UgZGF0YSBmb3Igb3AgbWVyZ2luZy4gRGF0YSBpcyBhIGxpc3Qgb2YgdGhlIGRlc3RpbmF0aW9uIGJsb2NrIG51bWJlcnMuCi0gICAgYm9vbCBBZGRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKTsKKyAgICB2aXJ0dWFsIGJvb2wgQWRkU2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgPSAwOwogCiAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgd3JpdGVzLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjbG9zaW5nIHRoZSB3cml0ZXIKICAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBoZWFkZXJzIGFuZCBmb290ZXJzIGFyZSB3cml0dGVuLgogICAgIHZpcnR1YWwgYm9vbCBGaW5hbGl6ZSgpID0gMDsKIAotICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgdGhlIGNvdyBpbWFnZSBvY2N1cGllcyBvbiBkaXNrLgotICAgIHZpcnR1YWwgdWludDY0X3QgR2V0Q293U2l6ZSgpID0gMDsKKyAgICAvLyBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHRoZSBjb3cgaW1hZ2Ugb2NjdXBpZXMgb24gZGlzayArIHRoZSBzaXplIG9mIHNlcXVlbmNlICYmIG9wcyBidWZmZXIKKyAgICAvLyBUaGUgbGF0dGVyIHR3byBmaWVsZHMgYXJlIHVzZWQgaW4gdjMgY293IGZvcm1hdCBhbmQgbGVmdCBhcyAwIGZvciB2MiBjb3cgZm9ybWF0CisgICAgdmlydHVhbCBDb3dTaXplSW5mbyBHZXRDb3dTaXplSW5mbygpIGNvbnN0ID0gMDsKIAotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBBZGRDb3B5KCkgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0NvcHlPcGVyYXRpb24oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCB1aW50MzJfdCBHZXRCbG9ja1NpemUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBHZXRNYXhCbG9ja3MoKSBjb25zdCA9IDA7CiAKLSAgICBjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKCkgeyByZXR1cm4gb3B0aW9uc187IH0KKyAgICAvLyBPcGVuIGFuIElDb3dSZWFkZXIgZm9yIHRoaXMgd3JpdGVyLiBUaGUgcmVhZGVyIHdpbGwgYmUgYSBzbmFwc2hvdCBvZiB0aGUKKyAgICAvLyBjdXJyZW50IG9wZXJhdGlvbnMgaW4gdGhlIHdyaXRlcjsgbmV3IHdyaXRlcyBhZnRlciBPcGVuUmVhZGVyKCkgd2lsbCBub3QKKyAgICAvLyBiZSByZWZsZWN0ZWQuCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1JlYWRlcj4gT3BlblJlYWRlcigpID0gMDsKIAotICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIEVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzID0gMSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSA9IDA7Ci0gICAgdmlydHVhbCBib29sIEVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2NrcykgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpID0gMDsKLQotICAgIGJvb2wgVmFsaWRhdGVOZXdCbG9jayh1aW50NjRfdCBuZXdfYmxvY2spOwotCi0gIHByb3RlY3RlZDoKLSAgICBDb3dPcHRpb25zIG9wdGlvbnNfOworICAgIC8vIE9wZW4gYSBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgYWxsb3dzIHJlYWRpbmcgYW5kIHNlZWluZyB0aHJvdWdoIHRoZSBjb3cKKyAgICAvLyBhcyBpZiBpdCB3ZXJlIGEgbm9ybWFsIGZpbGUuIFRoZSBvcHRpb25hbCBzb3VyY2VfZGV2aWNlIG11c3QgYmUgYSB2YWxpZAorICAgIC8vIHBhdGggaWYgdGhlIENvd1JlYWRlciBjb250YWlucyBhbnkgY29weSBvciB4b3Igb3BlcmF0aW9ucy4KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxGaWxlRGVzY3JpcHRvcj4gT3BlbkZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UpID0gMDsKIH07CiAKIGNsYXNzIENvbXByZXNzV29ya2VyIHsKICAgcHVibGljOgotICAgIENvbXByZXNzV29ya2VyKENvd0NvbXByZXNzaW9uQWxnb3JpdGhtIGNvbXByZXNzaW9uLCB1aW50MzJfdCBibG9ja19zaXplKTsKKyAgICBDb21wcmVzc1dvcmtlcihzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+JiYgY29tcHJlc3NvciwgdWludDMyX3QgYmxvY2tfc2l6ZSk7CiAgICAgYm9vbCBSdW5UaHJlYWQoKTsKICAgICB2b2lkIEVucXVldWVDb21wcmVzc0Jsb2Nrcyhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBudW1fYmxvY2tzKTsKICAgICBib29sIEdldENvbXByZXNzZWRCdWZmZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+PiogY29tcHJlc3NlZF9idWYpOwogICAgIHZvaWQgRmluYWxpemUoKTsKLSAgICBzdGF0aWMgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4gQ29tcHJlc3MoQ293Q29tcHJlc3Npb25BbGdvcml0aG0gY29tcHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpOworICAgIHN0YXRpYyB1aW50MzJfdCBHZXREZWZhdWx0Q29tcHJlc3Npb25MZXZlbChDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbik7CiAKLSAgICBzdGF0aWMgYm9vbCBDb21wcmVzc0Jsb2NrcyhDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbiwgc2l6ZV90IGJsb2NrX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgbnVtX2Jsb2NrcywKKyAgICBzdGF0aWMgYm9vbCBDb21wcmVzc0Jsb2NrcyhJQ29tcHJlc3NvciogY29tcHJlc3Nvciwgc2l6ZV90IGJsb2NrX3NpemUsIGNvbnN0IHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2Jsb2NrcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4qIGNvbXByZXNzZWRfZGF0YSk7CiAKICAgcHJpdmF0ZToKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4gY29tcHJlc3NlZF9kYXRhOwogICAgIH07CiAKLSAgICBDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbl87CisgICAgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBjb21wcmVzc29yXzsKICAgICB1aW50MzJfdCBibG9ja19zaXplXzsKIAogICAgIHN0ZDo6cXVldWU8Q29tcHJlc3NXb3JrPiB3b3JrX3F1ZXVlXzsKQEAgLTE0NCwxMDMgKzE0NCwxOSBAQAogICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGN2XzsKICAgICBib29sIHN0b3BwZWRfID0gZmFsc2U7CiAKLSAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBDb21wcmVzcyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKTsKICAgICBib29sIENvbXByZXNzQmxvY2tzKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IG51bV9ibG9ja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4qIGNvbXByZXNzZWRfZGF0YSk7CiB9OwogCi1jbGFzcyBDb3dXcml0ZXIgOiBwdWJsaWMgSUNvd1dyaXRlciB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBDb3dXcml0ZXIoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucyk7Ci0gICAgfkNvd1dyaXRlcigpOworLy8gQ3JlYXRlIGFuIElDb3dXcml0ZXIgbm90IGJhY2tlZCBieSBhbnkgZmlsZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGVzdGltYXRpbmcKKy8vIHRoZSBmaW5hbCBzaXplIG9mIGEgY293IGZpbGUuCitzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gQ3JlYXRlQ293RXN0aW1hdG9yKHVpbnQzMl90IHZlcnNpb24sIGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMpOwogCi0gICAgLy8gU2V0IHVwIHRoZSB3cml0ZXIuCi0gICAgLy8gVGhlIGZpbGUgc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZy4KLSAgICAvLwotICAgIC8vIElmIGZkIGlzIDwgMCwgdGhlIENvd1dyaXRlciB3aWxsIGJlIG9wZW5lZCBhZ2FpbnN0IC9kZXYvbnVsbC4gVGhpcyBpcyBmb3IKLSAgICAvLyBjb21wdXRpbmcgQ09XIHNpemVzIHdpdGhvdXQgdXNpbmcgc3RvcmFnZSBzcGFjZS4KLSAgICBib29sIEluaXRpYWxpemUoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgZmQpOwotICAgIGJvb2wgSW5pdGlhbGl6ZShhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCk7Ci0gICAgLy8gU2V0IHVwIGEgd3JpdGVyLCBhc3N1bWluZyB0aGF0IHRoZSBnaXZlbiBsYWJlbCBpcyB0aGUgbGFzdCB2YWxpZCBsYWJlbC4KLSAgICAvLyBUaGlzIHdpbGwgcmVzdWx0IGluIGRyb3BwaW5nIGFueSBsYWJlbHMgdGhhdCBvY2N1ciBhZnRlciB0aGUgZ2l2ZW4gb24sIGFuZCB3aWxsIGZhaWwKLSAgICAvLyBpZiB0aGUgZ2l2ZW4gbGFiZWwgZG9lcyBub3QgYXBwZWFyLgotICAgIGJvb2wgSW5pdGlhbGl6ZUFwcGVuZChhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiwgdWludDY0X3QgbGFiZWwpOwotICAgIGJvb2wgSW5pdGlhbGl6ZUFwcGVuZChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgdWludDY0X3QgbGFiZWwpOwotCi0gICAgYm9vbCBGaW5hbGl6ZSgpIG92ZXJyaWRlOwotCi0gICAgdWludDY0X3QgR2V0Q293U2l6ZSgpIG92ZXJyaWRlOwotCi0gICAgdWludDMyX3QgR2V0Q293VmVyc2lvbigpIHsgcmV0dXJuIGhlYWRlcl8ubWFqb3JfdmVyc2lvbjsgfQotCi0gIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdENvcHkodWludDY0X3QgbmV3X2Jsb2NrLCB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQ2NF90IG51bV9ibG9ja3MgPSAxKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCB1aW50NjRfdCBudW1fYmxvY2tzKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdExhYmVsKHVpbnQ2NF90IGxhYmVsKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYm9vbCBFbWl0Q2x1c3RlcigpOwotICAgIGJvb2wgRW1pdENsdXN0ZXJJZk5lZWRlZCgpOwotICAgIGJvb2wgRW1pdEJsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCB1aW50NjRfdCBvbGRfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwgdWludDhfdCB0eXBlKTsKLSAgICB2b2lkIFNldHVwSGVhZGVycygpOwotICAgIHZvaWQgU2V0dXBXcml0ZU9wdGlvbnMoKTsKLSAgICBib29sIFBhcnNlT3B0aW9ucygpOwotICAgIGJvb2wgT3BlbkZvcldyaXRlKCk7Ci0gICAgYm9vbCBPcGVuRm9yQXBwZW5kKHVpbnQ2NF90IGxhYmVsKTsKLSAgICBib29sIEdldERhdGFQb3ModWludDY0X3QqIHBvcyk7Ci0gICAgYm9vbCBXcml0ZVJhd0RhdGEoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgV3JpdGVPcGVyYXRpb24oY29uc3QgQ293T3BlcmF0aW9uJiBvcCwgY29uc3Qgdm9pZCogZGF0YSA9IG51bGxwdHIsIHNpemVfdCBzaXplID0gMCk7Ci0gICAgdm9pZCBBZGRPcGVyYXRpb24oY29uc3QgQ293T3BlcmF0aW9uJiBvcCk7Ci0gICAgdm9pZCBJbml0UG9zKCk7Ci0gICAgdm9pZCBJbml0QmF0Y2hXcml0ZXMoKTsKLSAgICB2b2lkIEluaXRXb3JrZXJzKCk7Ci0gICAgYm9vbCBGbHVzaENsdXN0ZXIoKTsKLQotICAgIGJvb2wgQ29tcHJlc3NCbG9ja3Moc2l6ZV90IG51bV9ibG9ja3MsIGNvbnN0IHZvaWQqIGRhdGEpOwotICAgIGJvb2wgU2V0RmQoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQpOwotICAgIGJvb2wgU3luYygpOwotICAgIGJvb2wgVHJ1bmNhdGUob2ZmX3QgbGVuZ3RoKTsKLSAgICBib29sIEVuc3VyZVNwYWNlQXZhaWxhYmxlKGNvbnN0IHVpbnQ2NF90IGJ5dGVzX25lZWRlZCkgY29uc3Q7Ci0KLSAgcHJpdmF0ZToKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgb3duZWRfZmRfOwotICAgIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkXzsKLSAgICBDb3dIZWFkZXIgaGVhZGVyX3t9OwotICAgIENvd0Zvb3RlciBmb290ZXJfe307Ci0gICAgQ293Q29tcHJlc3Npb25BbGdvcml0aG0gY29tcHJlc3Npb25fID0ga0Nvd0NvbXByZXNzTm9uZTsKLSAgICB1aW50NjRfdCBjdXJyZW50X29wX3Bvc18gPSAwOwotICAgIHVpbnQ2NF90IG5leHRfb3BfcG9zXyA9IDA7Ci0gICAgdWludDY0X3QgbmV4dF9kYXRhX3Bvc18gPSAwOwotICAgIHVpbnQ2NF90IGN1cnJlbnRfZGF0YV9wb3NfID0gMDsKLSAgICBzc2l6ZV90IHRvdGFsX2RhdGFfd3JpdHRlbl8gPSAwOwotICAgIHVpbnQzMl90IGNsdXN0ZXJfc2l6ZV8gPSAwOwotICAgIHVpbnQzMl90IGN1cnJlbnRfY2x1c3Rlcl9zaXplXyA9IDA7Ci0gICAgdWludDY0X3QgY3VycmVudF9kYXRhX3NpemVfID0gMDsKLSAgICBib29sIGlzX2Rldl9udWxsXyA9IGZhbHNlOwotICAgIGJvb2wgbWVyZ2VfaW5fcHJvZ3Jlc3NfID0gZmFsc2U7Ci0gICAgYm9vbCBpc19ibG9ja19kZXZpY2VfID0gZmFsc2U7Ci0gICAgdWludDY0X3QgY293X2ltYWdlX3NpemVfID0gSU5UNjRfTUFYOwotCi0gICAgaW50IG51bV9jb21wcmVzc190aHJlYWRzXyA9IDE7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENvbXByZXNzV29ya2VyPj4gY29tcHJlc3NfdGhyZWFkc187Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpmdXR1cmU8Ym9vbD4+IHRocmVhZHNfOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+PiBjb21wcmVzc2VkX2J1Zl87Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4+OjppdGVyYXRvciBidWZfaXRlcl87Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q293T3BlcmF0aW9uPj4gb3BidWZmZXJfdmVjXzsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPj4gZGF0YWJ1ZmZlcl92ZWNfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgaW92ZWNbXT4gY293b3BfdmVjXzsKLSAgICBpbnQgb3BfdmVjX2luZGV4XyA9IDA7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGlvdmVjW10+IGRhdGFfdmVjXzsKLSAgICBpbnQgZGF0YV92ZWNfaW5kZXhfID0gMDsKLSAgICBib29sIGJhdGNoX3dyaXRlXyA9IGZhbHNlOwotfTsKKy8vIENyZWF0ZSBhbiBJQ293V3JpdGVyIG9mIHRoZSBnaXZlbiB2ZXJzaW9uIGFuZCBvcHRpb25zLiBJZiBhIGxhYmVsIGlzIGdpdmVuLAorLy8gdGhlIHdyaXRlciBpcyBvcGVuZWQgaW4gYXBwZW5kIG1vZGUuCitzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gQ3JlYXRlQ293V3JpdGVyKHVpbnQzMl90IHZlcnNpb24sIGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYmIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCA9IHt9KTsKIAogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvbW9ja19jb3dfd3JpdGVyLmggYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9tb2NrX2Nvd193cml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDkxZmIwCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvbW9ja19jb3dfd3JpdGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3dyaXRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6c25hcHNob3QgeworCitjbGFzcyBNb2NrQ293V3JpdGVyIDogcHVibGljIElDb3dXcml0ZXIgeworICBwdWJsaWM6CisgICAgdXNpbmcgRmlsZURlc2NyaXB0b3IgPSBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpGaWxlRGVzY3JpcHRvcjsKKworICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEZpbmFsaXplLCAoKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0QoQ293U2l6ZUluZm8sIEdldENvd1NpemVJbmZvLCAoKSwgKGNvbnN0LCBvdmVycmlkZSkpOworCisgICAgTU9DS19NRVRIT0QoYm9vbCwgQWRkQ29weSwgKHVpbnQ2NF90LCB1aW50NjRfdCwgdWludDY0X3QpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChib29sLCBBZGRSYXdCbG9ja3MsICh1aW50NjRfdCwgY29uc3Qgdm9pZCosIHNpemVfdCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEFkZFhvckJsb2NrcywgKHVpbnQzMl90LCBjb25zdCB2b2lkKiwgc2l6ZV90LCB1aW50MzJfdCwgdWludDE2X3QpLAorICAgICAgICAgICAgICAgIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEFkZFplcm9CbG9ja3MsICh1aW50NjRfdCwgdWludDY0X3QpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChib29sLCBBZGRMYWJlbCwgKHVpbnQ2NF90KSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0QoYm9vbCwgQWRkU2VxdWVuY2VEYXRhLCAoc2l6ZV90LCBjb25zdCB1aW50MzJfdCopLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh1aW50MzJfdCwgR2V0QmxvY2tTaXplLCAoKSwgKG92ZXJyaWRlLCBjb25zdCkpOworICAgIE1PQ0tfTUVUSE9EKHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+LCBHZXRNYXhCbG9ja3MsICgpLCAob3ZlcnJpZGUsIGNvbnN0KSk7CisKKyAgICBNT0NLX01FVEhPRChzdGQ6OnVuaXF1ZV9wdHI8SUNvd1JlYWRlcj4sIE9wZW5SZWFkZXIsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChzdGQ6OnVuaXF1ZV9wdHI8RmlsZURlc2NyaXB0b3I+LCBPcGVuRmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiksIChvdmVycmlkZSkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OnNuYXBzaG90CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9tb2NrX3NuYXBzaG90LmggYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9tb2NrX3NuYXBzaG90LmgKaW5kZXggZDQ1OGI4Ny4uY2E0NWQyZiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvbW9ja19zbmFwc2hvdC5oCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfc25hcHNob3QuaApAQCAtNDIsOSArNDIsOSBAQAogICAgICAgICAgICAgICAgIChjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHNuYXBzaG90X3BhdGgpLAogICAgICAgICAgICAgICAgIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+LCBPcGVuU25hcHNob3RXcml0ZXIsCisgICAgTU9DS19NRVRIT0Qoc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+LCBPcGVuU25hcHNob3RXcml0ZXIsCiAgICAgICAgICAgICAgICAgKGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYpLAorICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiksCiAgICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7CiAgICAgTU9DS19NRVRIT0QoYm9vbCwgVW5tYXBVcGRhdGVTbmFwc2hvdCwgKGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXRfcGFydGl0aW9uX25hbWUpLCAob3ZlcnJpZGUpKTsKICAgICBNT0NLX01FVEhPRChib29sLCBOZWVkU25hcHNob3RzSW5GaXJzdFN0YWdlTW91bnQsICgpLCAob3ZlcnJpZGUpKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfc25hcHNob3Rfd3JpdGVyLmggYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9tb2NrX3NuYXBzaG90X3dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTgyOGJjLi4wMDAwMDAwCi0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfc25hcHNob3Rfd3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KLSNpbmNsdWRlIDxsaWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQ6OnNuYXBzaG90IHsKLQotY2xhc3MgTW9ja1NuYXBzaG90V3JpdGVyIDogcHVibGljIElTbmFwc2hvdFdyaXRlciB7Ci0gIHB1YmxpYzoKLSAgICB1c2luZyBGaWxlRGVzY3JpcHRvciA9IElTbmFwc2hvdFdyaXRlcjo6RmlsZURlc2NyaXB0b3I7Ci0KLSAgICBleHBsaWNpdCBNb2NrU25hcHNob3RXcml0ZXIoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucykgOiBJU25hcHNob3RXcml0ZXIob3B0aW9ucykge30KLSAgICBNb2NrU25hcHNob3RXcml0ZXIoKSA6IElTbmFwc2hvdFdyaXRlcih7fSkge30KLQotICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEZpbmFsaXplLCAoKSwgKG92ZXJyaWRlKSk7Ci0KLSAgICAvLyBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHRoZSBjb3cgaW1hZ2Ugb2NjdXBpZXMgb24gZGlzay4KLSAgICBNT0NLX01FVEhPRCh1aW50NjRfdCwgR2V0Q293U2l6ZSwgKCksIChvdmVycmlkZSkpOwotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIEFkZENvcHkoKSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgTU9DS19NRVRIT0QoYm9vbCwgU3VwcG9ydHNDb3B5T3BlcmF0aW9uLCAoKSwgKGNvbnN0IG92ZXJyaWRlKSk7Ci0KLSAgICBNT0NLX01FVEhPRChib29sLCBFbWl0Q29weSwgKHVpbnQ2NF90LCB1aW50NjRfdCwgdWludDY0X3QpLCAob3ZlcnJpZGUpKTsKLSAgICBNT0NLX01FVEhPRChib29sLCBFbWl0UmF3QmxvY2tzLCAodWludDY0X3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpLCAob3ZlcnJpZGUpKTsKLSAgICBNT0NLX01FVEhPRChib29sLCBFbWl0WG9yQmxvY2tzLCAodWludDMyX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QsIHVpbnQzMl90LCB1aW50MTZfdCksCi0gICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gICAgTU9DS19NRVRIT0QoYm9vbCwgRW1pdFplcm9CbG9ja3MsICh1aW50NjRfdCwgdWludDY0X3QpLCAob3ZlcnJpZGUpKTsKLSAgICBNT0NLX01FVEhPRChib29sLCBFbWl0TGFiZWwsICh1aW50NjRfdCksIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEVtaXRTZXF1ZW5jZURhdGEsIChzaXplX3QsIGNvbnN0IHVpbnQzMl90KiksIChvdmVycmlkZSkpOwotCi0gICAgLy8gT3BlbiB0aGUgd3JpdGVyIGluIHdyaXRlIG1vZGUgKG5vIGFwcGVuZCkuCi0gICAgTU9DS19NRVRIT0QoYm9vbCwgSW5pdGlhbGl6ZSwgKCksIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKGJvb2wsIFZlcmlmeU1lcmdlT3BzLCAoKSwgKG92ZXJyaWRlLCBjb25zdCwgbm9leGNlcHQpKTsKLQotICAgIC8vIE9wZW4gdGhlIHdyaXRlciBpbiBhcHBlbmQgbW9kZSwgd2l0aCB0aGUgbGFzdCBsYWJlbCB0byByZXN1bWUKLSAgICAvLyBmcm9tLiBTZWUgQ293V3JpdGVyOjpJbml0aWFsaXplQXBwZW5kLgotICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEluaXRpYWxpemVBcHBlbmQsICh1aW50NjRfdCBsYWJlbCksIChvdmVycmlkZSkpOwotCi0gICAgTU9DS19NRVRIT0Qoc3RkOjp1bmlxdWVfcHRyPEZpbGVEZXNjcmlwdG9yPiwgT3BlblJlYWRlciwgKCksIChvdmVycmlkZSkpOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjpzbmFwc2hvdApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3QuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90LmgKaW5kZXggOWViODliNi4uZDEwMjg2MyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3QuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9zbmFwc2hvdC5oCkBAIC0zMywxMiArMzMsMTEgQEAKICNpbmNsdWRlIDxsaWJmaWVtYXAvaW1hZ2VfbWFuYWdlci5oPgogI2luY2x1ZGUgPGxpYmxwL2J1aWxkZXIuaD4KICNpbmNsdWRlIDxsaWJscC9saWJscC5oPgotI2luY2x1ZGUgPHVwZGF0ZV9lbmdpbmUvdXBkYXRlX21ldGFkYXRhLnBiLmg+Ci0KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9hdXRvX2RldmljZS5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9yZXR1cm4uaD4KLSNpbmNsdWRlIDxsaWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXIuaD4KICNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5oPgorI2luY2x1ZGUgPHVwZGF0ZV9lbmdpbmUvdXBkYXRlX21ldGFkYXRhLnBiLmg+CiAKICNpZm5kZWYgRlJJRU5EX1RFU1QKICNkZWZpbmUgRlJJRU5EX1RFU1QodGVzdF9zZXRfbmFtZSwgaW5kaXZpZHVhbF90ZXN0KSBcCkBAIC03NCw2ICs3Myw5IEBACiBjbGFzcyBTbmFwc2hvdE1lcmdlU3RhdHM7CiBjbGFzcyBTbmFwc2hvdFN0YXR1czsKIAordXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKIHN0YXRpYyBjb25zdGV4cHIgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBrQ293R3JvdXBOYW1lID0gImNvdyI7CiBzdGF0aWMgY29uc3RleHByIGNoYXIga1ZpcnR1YWxBYkNvbXByZXNzaW9uUHJvcFtdID0gInJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24uZW5hYmxlZCI7CiAKQEAgLTIxMSwxNiArMjEzLDEzIEBACiAgICAgdmlydHVhbCBib29sIE1hcFVwZGF0ZVNuYXBzaG90KGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc25hcHNob3RfcGF0aCkgPSAwOwogCi0gICAgLy8gQ3JlYXRlIGFuIElTbmFwc2hvdFdyaXRlciB0byBidWlsZCBhIHNuYXBzaG90IGFnYWluc3QgYSB0YXJnZXQgcGFydGl0aW9uLiBUaGUgcGFydGl0aW9uIG5hbWUKKyAgICAvLyBDcmVhdGUgYW4gSUNvd1dyaXRlciB0byBidWlsZCBhIHNuYXBzaG90IGFnYWluc3QgYSB0YXJnZXQgcGFydGl0aW9uLiBUaGUgcGFydGl0aW9uIG5hbWUKICAgICAvLyBtdXN0IGJlIHN1ZmZpeGVkLiBJZiBhIHNvdXJjZSBwYXJ0aXRpb24gZXhpc3RzLCBpdCBtdXN0IGJlIHNwZWNpZmllZCBhcyB3ZWxsLiBUaGUgc291cmNlCiAgICAgLy8gcGFydGl0aW9uIHdpbGwgb25seSBiZSB1c2VkIGlmIHJhdyBieXRlcyBhcmUgbmVlZGVkLiBUaGUgc291cmNlIHBhcnRpdGlvbiBzaG91bGQgYmUgYW4KICAgICAvLyBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXZpY2UsIG5vdCBhIHBhcnRpdGlvbiBuYW1lLgotICAgIC8vCi0gICAgLy8gQWZ0ZXIgY2FsbGluZyBPcGVuU25hcHNob3RXcml0ZXIsIHRoZSBjYWxsZXIgbXVzdCBpbnZva2UgSW5pdGlhbGl6ZSBvciBJbml0aWFsaXplRm9yQXBwZW5kCi0gICAgLy8gYmVmb3JlIGludm9raW5nIHdyaXRlIG9wZXJhdGlvbnMuCi0gICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBPcGVuU25hcHNob3RXcml0ZXIoCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gT3BlblNuYXBzaG90V3JpdGVyKAogICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zJiBwYXJhbXMsCi0gICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc291cmNlX2RldmljZSkgPSAwOworICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwgPSB7fSkgPSAwOwogCiAgICAgLy8gVW5tYXAgYSBzbmFwc2hvdCBkZXZpY2Ugb3IgQ293V3JpdGVyIHRoYXQgd2FzIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggTWFwVXBkYXRlU25hcHNob3QsCiAgICAgLy8gT3BlblNuYXBzaG90V3JpdGVyLiBBbGwgb3V0c3RhbmRpbmcgb3BlbiBkZXNjcmlwdG9ycywgd3JpdGVycywgb3IKQEAgLTM2Miw5ICszNjEsOSBAQAogICAgIFJldHVybiBDcmVhdGVVcGRhdGVTbmFwc2hvdHMoY29uc3QgRGVsdGFBcmNoaXZlTWFuaWZlc3QmIG1hbmlmZXN0KSBvdmVycmlkZTsKICAgICBib29sIE1hcFVwZGF0ZVNuYXBzaG90KGNvbnN0IENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBzbmFwc2hvdF9wYXRoKSBvdmVycmlkZTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBPcGVuU25hcHNob3RXcml0ZXIoCisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IE9wZW5TbmFwc2hvdFdyaXRlcigKICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyYgcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UpIG92ZXJyaWRlOworICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpIG92ZXJyaWRlOwogICAgIGJvb2wgVW5tYXBVcGRhdGVTbmFwc2hvdChjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X3BhcnRpdGlvbl9uYW1lKSBvdmVycmlkZTsKICAgICBib29sIE5lZWRTbmFwc2hvdHNJbkZpcnN0U3RhZ2VNb3VudCgpIG92ZXJyaWRlOwogICAgIGJvb2wgQ3JlYXRlTG9naWNhbEFuZFNuYXBzaG90UGFydGl0aW9ucygKQEAgLTQwNiwxNSArNDA1LDYgQEAKIAogICAgIC8vIEFkZCBuZXcgcHVibGljIGVudHJpZXMgYWJvdmUgdGhpcyBsaW5lLgogCi0gICAgLy8gSGVscGVycyBmb3IgZmFpbHVyZSBpbmplY3Rpb24uCi0gICAgdXNpbmcgTWVyZ2VDb25zaXN0ZW5jeUNoZWNrZXIgPQotICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxNZXJnZUZhaWx1cmVDb2RlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzKT47Ci0KLSAgICB2b2lkIHNldF9tZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyKE1lcmdlQ29uc2lzdGVuY3lDaGVja2VyIGNoZWNrZXIpIHsKLSAgICAgICAgbWVyZ2VfY29uc2lzdGVuY3lfY2hlY2tlcl8gPSBjaGVja2VyOwotICAgIH0KLSAgICBNZXJnZUNvbnNpc3RlbmN5Q2hlY2tlciBtZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyKCkgY29uc3QgeyByZXR1cm4gbWVyZ2VfY29uc2lzdGVuY3lfY2hlY2tlcl87IH0KLQogICBwcml2YXRlOgogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VGVzdCwgQ2xlYW5GaXJzdFN0YWdlTW91bnQpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VGVzdCwgQ3JlYXRlU25hcHNob3QpOwpAQCAtNDI4LDYgKzQxOCw3IEBACiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBNZXJnZUZhaWx1cmVDb2RlKTsKICAgICBGUklFTkRfVEVTVChTbmFwc2hvdFRlc3QsIE5vTWVyZ2VCZWZvcmVSZWJvb3QpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VGVzdCwgVXBkYXRlQm9vdENvbnRyb2xIYWwpOworICAgIEZSSUVORF9URVNUKFNuYXBzaG90VGVzdCwgQm9vdFNuYXBzaG90V2l0aG91dFNsb3RTd2l0Y2gpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgQWRkUGFydGl0aW9uKTsKICAgICBGUklFTkRfVEVTVChTbmFwc2hvdFVwZGF0ZVRlc3QsIENvbnNpc3RlbmN5Q2hlY2tSZXN1bWUpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgRGFlbW9uVHJhbnNpdGlvbik7CkBAIC00NDAsMTEgKzQzMSwxMyBAQAogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgUXVlcnlTdGF0dXNFcnJvcik7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBTbmFwc2hvdFN0YXR1c0ZpbGVXaXRob3V0Q293KTsKICAgICBGUklFTkRfVEVTVChTbmFwc2hvdFVwZGF0ZVRlc3QsIFNwYWNlU3dhcFVwZGF0ZSk7CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBNYXBBbGxTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCk7CiAgICAgZnJpZW5kIGNsYXNzIFNuYXBzaG90VGVzdDsKICAgICBmcmllbmQgY2xhc3MgU25hcHNob3RVcGRhdGVUZXN0OwogICAgIGZyaWVuZCBjbGFzcyBGbGFzaEFmdGVyVXBkYXRlVGVzdDsKICAgICBmcmllbmQgY2xhc3MgTG9ja1Rlc3RDb25zdW1lcjsKICAgICBmcmllbmQgY2xhc3MgU25hcHNob3RGdXp6RW52OworICAgIGZyaWVuZCBjbGFzcyBNYXBTbmFwc2hvdHM7CiAgICAgZnJpZW5kIHN0cnVjdCBBdXRvRGVsZXRlQ293SW1hZ2U7CiAgICAgZnJpZW5kIHN0cnVjdCBBdXRvRGVsZXRlU25hcHNob3Q7CiAgICAgZnJpZW5kIHN0cnVjdCBQYXJ0aXRpb25Db3dDcmVhdG9yOwpAQCAtNDU5LDcgKzQ1Miw3IEBACiAgICAgYm9vbCBFbnN1cmVJbWFnZU1hbmFnZXIoKTsKIAogICAgIC8vIEVuc3VyZSB3ZSdyZSBjb25uZWN0ZWQgdG8gc25hcHVzZXJkLgotICAgIGJvb2wgRW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCk7CisgICAgYm9vbCBFbnN1cmVTbmFwdXNlcmRDb25uZWN0ZWQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0X21zID0gMTBzKTsKIAogICAgIC8vIEhlbHBlcnMgZm9yIGZpcnN0LXN0YWdlIGluaXQuCiAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPElEZXZpY2VJbmZvPiYgZGV2aWNlKCkgY29uc3QgeyByZXR1cm4gZGV2aWNlXzsgfQpAQCAtNTUyLDYgKzU0NSwxNiBAQAogICAgIC8vIFVubWFwIGFuZCByZW1vdmUgYWxsIGtub3duIHNuYXBzaG90cy4KICAgICBib29sIFJlbW92ZUFsbFNuYXBzaG90cyhMb2NrZWRGaWxlKiBsb2NrKTsKIAorICAgIC8vIEJvb3QgZGV2aWNlIG9mZiBzbmFwc2hvdHMgd2l0aG91dCBzbG90IHN3aXRjaAorICAgIGJvb2wgQm9vdEZyb21TbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCgpOworCisgICAgLy8gUmVtb3ZlIGtCb290U25hcHNob3RzV2l0aG91dFNsb3RTd2l0Y2ggc28gdGhhdCBkZXZpY2UgY2FuIGJvb3QKKyAgICAvLyB3aXRob3V0IHNuYXBzaG90cyBvbiB0aGUgY3VycmVudCBzbG90CisgICAgYm9vbCBQcmVwYXJlRGV2aWNlVG9Cb290V2l0aG91dFNuYXBzaG90KCk7CisKKyAgICAvLyBJcyB0aGUga0Jvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCBwcmVzZW50CisgICAgYm9vbCBJc1NuYXBzaG90V2l0aG91dFNsb3RTd2l0Y2goKTsKKwogICAgIC8vIExpc3QgdGhlIGtub3duIHNuYXBzaG90IG5hbWVzLgogICAgIGJvb2wgTGlzdFNuYXBzaG90cyhMb2NrZWRGaWxlKiBsb2NrLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHNuYXBzaG90cywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCA9ICIiKTsKQEAgLTYyOCw3ICs2MzEsNyBAQAogICAgIGJvb2wgQ29sbGFwc2VTbmFwc2hvdERldmljZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cyk7CiAKLSAgICBzdHJ1Y3QgTWVyZ2VSZXN1bHQgeworICAgIHN0cnVjdCBbW25vZGlzY2FyZF1dIE1lcmdlUmVzdWx0IHsKICAgICAgICAgZXhwbGljaXQgTWVyZ2VSZXN1bHQoVXBkYXRlU3RhdGUgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlRmFpbHVyZUNvZGUgZmFpbHVyZV9jb2RlID0gTWVyZ2VGYWlsdXJlQ29kZTo6T2spCiAgICAgICAgICAgICA6IHN0YXRlKHN0YXRlKSwgZmFpbHVyZV9jb2RlKGZhaWx1cmVfY29kZSkge30KQEAgLTY0NSw4ICs2NDgsNiBAQAogICAgIE1lcmdlUmVzdWx0IENoZWNrTWVyZ2VTdGF0ZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4mIGJlZm9yZV9jYW5jZWwpOwogICAgIE1lcmdlUmVzdWx0IENoZWNrVGFyZ2V0TWVyZ2VTdGF0ZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU25hcHNob3RVcGRhdGVTdGF0dXMmIHVwZGF0ZV9zdGF0dXMpOwotICAgIE1lcmdlRmFpbHVyZUNvZGUgQ2hlY2tNZXJnZUNvbnNpc3RlbmN5KExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90U3RhdHVzJiB1cGRhdGVfc3RhdHVzKTsKIAogICAgIGF1dG8gVXBkYXRlU3RhdGVUb1N0cihlbnVtIFVwZGF0ZVN0YXRlIHN0YXRlKTsKICAgICAvLyBHZXQgc3RhdHVzIG9yIHRhYmxlIGluZm9ybWF0aW9uIGFib3V0IGEgZGV2aWNlLW1hcHBlciBub2RlIHdpdGggYSBzaW5nbGUgdGFyZ2V0LgpAQCAtNjY2LDYgKzY2Nyw3IEBACiAgICAgc3RkOjpzdHJpbmcgR2V0Um9sbGJhY2tJbmRpY2F0b3JQYXRoKCk7CiAgICAgc3RkOjpzdHJpbmcgR2V0Rm9yd2FyZE1lcmdlSW5kaWNhdG9yUGF0aCgpOwogICAgIHN0ZDo6c3RyaW5nIEdldE9sZFBhcnRpdGlvbk1ldGFkYXRhUGF0aCgpOworICAgIHN0ZDo6c3RyaW5nIEdldEJvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaFBhdGgoKTsKIAogICAgIGNvbnN0IExwTWV0YWRhdGEqIFJlYWRPbGRQYXJ0aXRpb25NZXRhZGF0YShMb2NrZWRGaWxlKiBsb2NrKTsKIApAQCAtNjkzLDE0ICs2OTUsMTAgQEAKICAgICB9OwogCiAgICAgLy8gSGVscGVycyBmb3IgT3BlblNuYXBzaG90V3JpdGVyLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+IE9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXIoCi0gICAgICAgICAgICBMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc291cmNlX2RldmljZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cywKLSAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90UGF0aHMmIHBhdGhzKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBPcGVuS2VybmVsU25hcHNob3RXcml0ZXIoCi0gICAgICAgICAgICBMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc291cmNlX2RldmljZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cywKLSAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90UGF0aHMmIHBhdGhzKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gT3BlbkNvbXByZXNzZWRTbmFwc2hvdFdyaXRlcihMb2NrZWRGaWxlKiBsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU25hcHNob3RQYXRocyYgcGF0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpOwogCiAgICAgLy8gTWFwIHRoZSBiYXNlIGRldmljZSwgQ09XIGRldmljZXMsIGFuZCBzbmFwc2hvdCBkZXZpY2UuCiAgICAgYm9vbCBNYXBQYXJ0aXRpb25XaXRoU25hcHNob3QoTG9ja2VkRmlsZSogbG9jaywgQ3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyBwYXJhbXMsCkBAIC03NDcsNyArNzQ1LDcgQEAKICAgICAvLyBJbml0aWFsaXplIHNuYXBzaG90cyBzbyB0aGF0IHRoZXkgY2FuIGJlIG1hcHBlZCBsYXRlci4KICAgICAvLyBNYXAgdGhlIENPVyBwYXJ0aXRpb24gYW5kIHplcm8taW5pdGlhbGl6ZSB0aGUgaGVhZGVyLgogICAgIFJldHVybiBJbml0aWFsaXplVXBkYXRlU25hcHNob3RzKAotICAgICAgICAgICAgTG9ja2VkRmlsZSogbG9jaywgTWV0YWRhdGFCdWlsZGVyKiB0YXJnZXRfbWV0YWRhdGEsCisgICAgICAgICAgICBMb2NrZWRGaWxlKiBsb2NrLCB1aW50MzJfdCBjb3dfdmVyc2lvbiwgTWV0YWRhdGFCdWlsZGVyKiB0YXJnZXRfbWV0YWRhdGEsCiAgICAgICAgICAgICBjb25zdCBMcE1ldGFkYXRhKiBleHBvcnRlZF90YXJnZXRfbWV0YWRhdGEsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXRfc3VmZml4LAogICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFNuYXBzaG90U3RhdHVzPiYgYWxsX3NuYXBzaG90X3N0YXR1cyk7CiAKQEAgLTgyOCw2ICs4MjYsOSBAQAogICAgIGJvb2wgRGVsZXRlRGV2aWNlSWZFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzJiB0aW1lb3V0X21zID0ge30pOwogCisgICAgLy8gU2V0IHJlYWQtYWhlYWQgc2l6ZSBkdXJpbmcgT1RBCisgICAgdm9pZCBTZXRSZWFkQWhlYWRTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbnRyeV9ibG9ja19kZXZpY2UsIG9mZjY0X3Qgc2l6ZV9rYik7CisKICAgICBhbmRyb2lkOjpkbTo6SURldmljZU1hcHBlciYgZG1fOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxJRGV2aWNlSW5mbz4gZGV2aWNlXzsKICAgICBzdGQ6OnN0cmluZyBtZXRhZGF0YV9kaXJfOwpAQCAtODM4LDcgKzgzOSw2IEBACiAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXB1c2VyZENsaWVudD4gc25hcHVzZXJkX2NsaWVudF87CiAgICAgc3RkOjp1bmlxdWVfcHRyPExwTWV0YWRhdGE+IG9sZF9wYXJ0aXRpb25fbWV0YWRhdGFfOwogICAgIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gaXNfc25hcHNob3RfdXNlcnNwYWNlXzsKLSAgICBNZXJnZUNvbnNpc3RlbmN5Q2hlY2tlciBtZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3Rfc3R1Yi5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3Rfc3R1Yi5oCmluZGV4IDE3MWM3YzYuLjFjOWI0MDMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90X3N0dWIuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9zbmFwc2hvdF9zdHViLmgKQEAgLTQwLDkgKzQwLDkgQEAKICAgICAgICAgICAgIGNvbnN0IGNocm9tZW9zX3VwZGF0ZV9lbmdpbmU6OkRlbHRhQXJjaGl2ZU1hbmlmZXN0JiBtYW5pZmVzdCkgb3ZlcnJpZGU7CiAgICAgYm9vbCBNYXBVcGRhdGVTbmFwc2hvdChjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBzbmFwc2hvdF9wYXRoKSBvdmVycmlkZTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBPcGVuU25hcHNob3RXcml0ZXIoCisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IE9wZW5TbmFwc2hvdFdyaXRlcigKICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyYgcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UpIG92ZXJyaWRlOworICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpIG92ZXJyaWRlOwogICAgIGJvb2wgVW5tYXBVcGRhdGVTbmFwc2hvdChjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X3BhcnRpdGlvbl9uYW1lKSBvdmVycmlkZTsKICAgICBib29sIE5lZWRTbmFwc2hvdHNJbkZpcnN0U3RhZ2VNb3VudCgpIG92ZXJyaWRlOwogICAgIGJvb2wgQ3JlYXRlTG9naWNhbEFuZFNuYXBzaG90UGFydGl0aW9ucygKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3Rfd3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlM2IxZGIuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3Rfd3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8b3B0aW9uYWw+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+Ci0KLSNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+Ci0KLW5hbWVzcGFjZSBjaHJvbWVvc191cGRhdGVfZW5naW5lIHsKLWNsYXNzIEZpbGVEZXNjcmlwdG9yOwotfSAgLy8gbmFtZXNwYWNlIGNocm9tZW9zX3VwZGF0ZV9lbmdpbmUKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHNuYXBzaG90IHsKLQotY2xhc3MgSVNuYXBzaG90V3JpdGVyIDogcHVibGljIElDb3dXcml0ZXIgewotICBwdWJsaWM6Ci0gICAgdXNpbmcgRmlsZURlc2NyaXB0b3IgPSBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpGaWxlRGVzY3JpcHRvcjsKLQotICAgIGV4cGxpY2l0IElTbmFwc2hvdFdyaXRlcihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKTsKLQotICAgIC8vIFNldCB0aGUgc291cmNlIGRldmljZS4gVGhpcyBpcyB1c2VkIGZvciBBZGRDb3B5KCkgb3BlcmF0aW9ucywgaWYgdGhlCi0gICAgLy8gdW5kZXJseWluZyB3cml0ZXIgbmVlZHMgdGhlIG9yaWdpbmFsIGJ5dGVzIChmb3IgZXhhbXBsZSBpZiBiYWNrZWQgYnkKLSAgICAvLyBkbS1zbmFwc2hvdCBvciBpZiB3cml0aW5nIGRpcmVjdGx5IHRvIGFuIHVuc25hcHNob3R0ZWQgcmVnaW9uKS4gVGhlCi0gICAgLy8gZGV2aWNlIGlzIG9ubHkgb3BlbmVkIG9uIHRoZSBmaXJzdCBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyBpdC4KLSAgICB2b2lkIFNldFNvdXJjZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2RldmljZSk7Ci0KLSAgICAvLyBPcGVuIHRoZSB3cml0ZXIgaW4gd3JpdGUgbW9kZSAobm8gYXBwZW5kKS4KLSAgICB2aXJ0dWFsIGJvb2wgSW5pdGlhbGl6ZSgpID0gMDsKLQotICAgIC8vIE9wZW4gdGhlIHdyaXRlciBpbiBhcHBlbmQgbW9kZSwgd2l0aCB0aGUgbGFzdCBsYWJlbCB0byByZXN1bWUKLSAgICAvLyBmcm9tLiBTZWUgQ293V3JpdGVyOjpJbml0aWFsaXplQXBwZW5kLgotICAgIHZpcnR1YWwgYm9vbCBJbml0aWFsaXplQXBwZW5kKHVpbnQ2NF90IGxhYmVsKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxGaWxlRGVzY3JpcHRvcj4gT3BlblJlYWRlcigpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgVmVyaWZ5TWVyZ2VPcHMoKSBjb25zdCBub2V4Y2VwdCA9IDA7Ci0KLSAgcHJvdGVjdGVkOgotICAgIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIEdldFNvdXJjZUZkKCk7Ci0KLSAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBzb3VyY2VfZGV2aWNlXzsKLQotICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBzb3VyY2VfZmRfOwotfTsKLQotLy8gU2VuZCB3cml0ZXMgdG8gYSBDT1cgb3IgYSByYXcgZGV2aWNlIGRpcmVjdGx5LCBiYXNlZCBvbiBhIHRocmVzaG9sZC4KLWNsYXNzIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlciBmaW5hbCA6IHB1YmxpYyBJU25hcHNob3RXcml0ZXIgewotICBwdWJsaWM6Ci0gICAgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMpOwotCi0gICAgLy8gU2V0cyB0aGUgQ09XIGRldmljZTsgdGhpcyBpcyByZXF1aXJlZC4KLSAgICBib29sIFNldENvd0RldmljZShhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBjb3dfZGV2aWNlKTsKLQotICAgIGJvb2wgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOwotICAgIGJvb2wgSW5pdGlhbGl6ZUFwcGVuZCh1aW50NjRfdCBsYWJlbCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBGaW5hbGl6ZSgpIG92ZXJyaWRlOwotICAgIHVpbnQ2NF90IEdldENvd1NpemUoKSBvdmVycmlkZTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZURlc2NyaXB0b3I+IE9wZW5SZWFkZXIoKSBvdmVycmlkZTsKLSAgICBib29sIFZlcmlmeU1lcmdlT3BzKCkgY29uc3Qgbm9leGNlcHQ7Ci0KLSAgcHJvdGVjdGVkOgotICAgIGJvb2wgRW1pdENvcHkodWludDY0X3QgbmV3X2Jsb2NrLCB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQ2NF90IG51bV9ibG9ja3MgPSAxKSBvdmVycmlkZTsKLSAgICBib29sIEVtaXRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIHVpbnQzMl90IG9sZF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0KSBvdmVycmlkZTsKLSAgICBib29sIEVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2Nrcykgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIG92ZXJyaWRlOwotICAgIGJvb2wgRW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4gT3BlbkNvd1JlYWRlcigpIGNvbnN0OwotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBjb3dfZGV2aWNlXzsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dXcml0ZXI+IGNvd187Ci19OwotCi0vLyBXcml0ZSBkaXJlY3RseSB0byBhIGRtLXNuYXBzaG90IGRldmljZS4KLWNsYXNzIE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyIGZpbmFsIDogcHVibGljIElTbmFwc2hvdFdyaXRlciB7Ci0gIHB1YmxpYzoKLSAgICBPbmxpbmVLZXJuZWxTbmFwc2hvdFdyaXRlcihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKTsKLQotICAgIC8vIFNldCB0aGUgZGV2aWNlIHVzZWQgZm9yIGFsbCB3cml0ZXMuCi0gICAgdm9pZCBTZXRTbmFwc2hvdERldmljZShhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBzbmFwc2hvdF9mZCwgdWludDY0X3QgY293X3NpemUpOwotCi0gICAgYm9vbCBJbml0aWFsaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGJvb2wgSW5pdGlhbGl6ZUFwcGVuZCh1aW50NjRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgYm9vbCBGaW5hbGl6ZSgpIG92ZXJyaWRlOwotICAgIHVpbnQ2NF90IEdldENvd1NpemUoKSBvdmVycmlkZSB7IHJldHVybiBjb3dfc2l6ZV87IH0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZURlc2NyaXB0b3I+IE9wZW5SZWFkZXIoKSBvdmVycmlkZTsKLQotICAgIC8vIE9ubGluZSBrZXJuZWwgc25hcHNob3Qgd3JpdGVyIGRvZXNuJ3QgY2FyZSBhYm91dCBtZXJnZSBzZXF1ZW5jZXMuCi0gICAgLy8gU28gaWdub3JlLgotICAgIGJvb2wgVmVyaWZ5TWVyZ2VPcHMoKSBjb25zdCBub2V4Y2VwdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIGJvb2wgRW1pdFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLSAgICBib29sIEVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2Nrcykgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIHVpbnQzMl90IG9sZF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0KSBvdmVycmlkZTsKLSAgICBib29sIEVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzID0gMSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIG92ZXJyaWRlOwotICAgIGJvb2wgRW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIHNuYXBzaG90X2ZkXzsKLSAgICB1aW50NjRfdCBjb3dfc2l6ZV8gPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGVfdGVzdC9saWJzbmFwc2hvdC90ZXN0X2hlbHBlcnMuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlX3Rlc3QvbGlic25hcHNob3QvdGVzdF9oZWxwZXJzLmgKaW5kZXggMjRjOTFhOC4uNWU5ZjA0OSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGVfdGVzdC9saWJzbmFwc2hvdC90ZXN0X2hlbHBlcnMuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZV90ZXN0L2xpYnNuYXBzaG90L3Rlc3RfaGVscGVycy5oCkBAIC0xOTgsNyArMTk4LDcgQEAKIC8vIEV4cGVjdCBzcGFjZSBvZiB8cGF0aHwgaXMgbXVsdGlwbGUgb2YgNEsuCiBib29sIFdyaXRlUmFuZG9tRGF0YShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpvcHRpb25hbDxzaXplX3Q+IGV4cGVjdF9zaXplID0gc3RkOjpudWxsb3B0LAogICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGhhc2ggPSBudWxscHRyKTsKLXN0ZDo6c3RyaW5nIEhhc2hTbmFwc2hvdChJU25hcHNob3RXcml0ZXIqIHdyaXRlcik7CitzdGQ6OnN0cmluZyBIYXNoU25hcHNob3QoSUNvd1dyaXRlcjo6RmlsZURlc2NyaXB0b3IqIHdyaXRlcik7CiAKIHN0ZDo6c3RyaW5nIFRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IGxlbik7CiAKQEAgLTIxNCwyOSArMjE0LDYgQEAKIC8vIEdldCBwYXJ0aXRpb24gc2l6ZSBmcm9tIHVwZGF0ZSBwYWNrYWdlIG1ldGFkYXRhLgogdWludDY0X3QgR2V0U2l6ZShQYXJ0aXRpb25VcGRhdGUqIHBhcnRpdGlvbl91cGRhdGUpOwogCi0vLyBVdGlsIGNsYXNzIGZvciB0ZXN0IGNhc2VzIG9uIGxvdyBzcGFjZSBzY2VuYXJpby4gVGhlc2UgdGVzdHMgYXNzdW1lcyBpbWFnZSBtYW5hZ2VyCi0vLyB1c2VzIC9kYXRhIGFzIGJhY2t1cCBkZXZpY2UuCi1jbGFzcyBMb3dTcGFjZVVzZXJkYXRhIHsKLSAgcHVibGljOgotICAgIC8vIFNldCB0aGUgbWF4aW11bSBmcmVlIHNwYWNlIGFsbG93ZWQgZm9yIHRoaXMgdGVzdC4gSWYgL3VzZXJkYXRhIGhhcyBtb3JlIHNwYWNlIHRoYW4gdGhlIGdpdmVuCi0gICAgLy8gbnVtYmVyLCBhIGZpbGUgaXMgYWxsb2NhdGVkIHRvIGNvbnN1bWUgc3BhY2UuCi0gICAgQXNzZXJ0aW9uUmVzdWx0IEluaXQodWludDY0X3QgbWF4X2ZyZWVfc3BhY2UpOwotCi0gICAgdWludDY0X3QgZnJlZV9zcGFjZSgpIGNvbnN0OwotICAgIHVpbnQ2NF90IGF2YWlsYWJsZV9zcGFjZSgpIGNvbnN0OwotICAgIHVpbnQ2NF90IGJzaXplKCkgY29uc3Q7Ci0KLSAgcHJpdmF0ZToKLSAgICBBc3NlcnRpb25SZXN1bHQgUmVhZFVzZXJkYXRhU3RhdHMoKTsKLQotICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga1VzZXJEYXRhRGV2aWNlID0gIi9kYXRhIjsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVtcG9yYXJ5RmlsZT4gYmlnX2ZpbGVfOwotICAgIGJvb2wgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgdWludDY0X3QgZnJlZV9zcGFjZV8gPSAwOwotICAgIHVpbnQ2NF90IGF2YWlsYWJsZV9zcGFjZV8gPSAwOwotICAgIHVpbnQ2NF90IGJzaXplXyA9IDA7Ci19OwotCiBib29sIElzVmlydHVhbEFiRW5hYmxlZCgpOwogCiAjZGVmaW5lIFNLSVBfSUZfTk9OX1ZJUlRVQUxfQUIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfYXBpX3Rlc3QuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfYXBpX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJjZTU1Li4wMDAwMDAwCi0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2FwaV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0ODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmdfdmlldz4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KLSNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+Ci0KLXVzaW5nIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmU7Ci11c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQ7Ci11c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2Ugc25hcHNob3QgewotCi1jbGFzcyBDb3dUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgICAgIGNvd18gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KCk7Ci0gICAgICAgIEFTU0VSVF9HRShjb3dfLT5mZCwgMCkgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgY293XyA9IG51bGxwdHI7IH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW1wb3JhcnlGaWxlPiBjb3dfOwotfTsKLQotLy8gU2luayB0aGF0IGFsd2F5cyBhcHBlbmRzIHRvIHRoZSBlbmQgb2YgYSBzdHJpbmcuCi1jbGFzcyBTdHJpbmdTaW5rIDogcHVibGljIElCeXRlU2luayB7Ci0gIHB1YmxpYzoKLSAgICB2b2lkKiBHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpIG92ZXJyaWRlIHsKLSAgICAgICAgc2l6ZV90IG9sZF9zaXplID0gc3RyZWFtXy5zaXplKCk7Ci0gICAgICAgIHN0cmVhbV8ucmVzaXplKG9sZF9zaXplICsgcmVxdWVzdGVkLCAnXDAnKTsKLSAgICAgICAgKmFjdHVhbCA9IHJlcXVlc3RlZDsKLSAgICAgICAgcmV0dXJuIHN0cmVhbV8uZGF0YSgpICsgb2xkX3NpemU7Ci0gICAgfQotICAgIGJvb2wgUmV0dXJuRGF0YSh2b2lkKiwgc2l6ZV90KSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0gICAgdm9pZCBSZXNldCgpIHsgc3RyZWFtXy5jbGVhcigpOyB9Ci0KLSAgICBzdGQ6OnN0cmluZyYgc3RyZWFtKCkgeyByZXR1cm4gc3RyZWFtXzsgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjpzdHJpbmcgc3RyZWFtXzsKLX07Ci0KLVRFU1RfRihDb3dUZXN0LCBDb3B5Q29udGlndW91cykgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwLCAxMDAwLCAxMDApKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICBDb3dIZWFkZXIgaGVhZGVyOwotICAgIENvd0Zvb3RlciBmb290ZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldEhlYWRlcigmaGVhZGVyKSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldEZvb3RlcigmZm9vdGVyKSk7Ci0gICAgQVNTRVJUX0VRKGhlYWRlci5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKLSAgICBBU1NFUlRfRVEoaGVhZGVyLm1ham9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWFqb3IpOwotICAgIEFTU0VSVF9FUShoZWFkZXIubWlub3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NaW5vcik7Ci0gICAgQVNTRVJUX0VRKGhlYWRlci5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpOwotICAgIEFTU0VSVF9FUShmb290ZXIub3AubnVtX29wcywgMTAwKTsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293Q29weU9wKTsKLSAgICAgICAgQVNTRVJUX0VRKG9wLT5jb21wcmVzc2lvbiwga0Nvd0NvbXByZXNzTm9uZSk7Ci0gICAgICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOwotICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTAgKyBpKTsKLSAgICAgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDEwMDAgKyBpKTsKLSAgICAgICAgaXRlci0+TmV4dCgpOwotICAgICAgICBpICs9IDE7Ci0gICAgfQotCi0gICAgQVNTRVJUX0VRKGksIDEwMCk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBSZWFkV3JpdGUpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDIwKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoNTEsIDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgQ293Rm9vdGVyIGZvb3RlcjsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0SGVhZGVyKCZoZWFkZXIpKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0Rm9vdGVyKCZmb290ZXIpKTsKLSAgICBBU1NFUlRfRVEoaGVhZGVyLm1hZ2ljLCBrQ293TWFnaWNOdW1iZXIpOwotICAgIEFTU0VSVF9FUShoZWFkZXIubWFqb3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NYWpvcik7Ci0gICAgQVNTRVJUX0VRKGhlYWRlci5taW5vcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1pbm9yKTsKLSAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7Ci0gICAgQVNTRVJUX0VRKGZvb3Rlci5vcC5udW1fb3BzLCA0KTsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLQotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd0NvcHlPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5jb21wcmVzc2lvbiwga0Nvd0NvbXByZXNzTm9uZSk7Ci0gICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDEwKTsKLSAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSwgMjApOwotCi0gICAgU3RyaW5nU2luayBzaW5rOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293UmVwbGFjZU9wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NOb25lKTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MDk2KTsKLSAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTApOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgLy8gTm90ZTogdGhlIHplcm8gb3BlcmF0aW9uIGdldHMgc3BsaXQgaW50byB0d28gYmxvY2tzLgotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1plcm9PcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5jb21wcmVzc2lvbiwga0Nvd0NvbXByZXNzTm9uZSk7Ci0gICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUxKTsKLSAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSwgMCk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3daZXJvT3ApOwotICAgIEFTU0VSVF9FUShvcC0+Y29tcHJlc3Npb24sIGtDb3dDb21wcmVzc05vbmUpOwotICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOwotICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1Mik7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDApOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBSZWFkV3JpdGVYb3IpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDIwKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCAyNCwgMTApKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg1MSwgMikpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICBDb3dGb290ZXIgZm9vdGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5HZXRIZWFkZXIoJmhlYWRlcikpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5HZXRGb290ZXIoJmZvb3RlcikpOwotICAgIEFTU0VSVF9FUShoZWFkZXIubWFnaWMsIGtDb3dNYWdpY051bWJlcik7Ci0gICAgQVNTRVJUX0VRKGhlYWRlci5tYWpvcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1ham9yKTsKLSAgICBBU1NFUlRfRVEoaGVhZGVyLm1pbm9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWlub3IpOwotICAgIEFTU0VSVF9FUShoZWFkZXIuYmxvY2tfc2l6ZSwgb3B0aW9ucy5ibG9ja19zaXplKTsKLSAgICBBU1NFUlRfRVEoZm9vdGVyLm9wLm51bV9vcHMsIDQpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBhdXRvIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293Q29weU9wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NOb25lKTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKLSAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTApOwotICAgIEFTU0VSVF9FUShvcC0+c291cmNlLCAyMCk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dYb3JPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5jb21wcmVzc2lvbiwga0Nvd0NvbXByZXNzTm9uZSk7Ci0gICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgNDA5Nik7Ci0gICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKLSAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSwgOTgzMTQpOyAgLy8gNDA5NiAqIDI0ICsgMTAKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBvcCA9ICZpdGVyLT5HZXQoKTsKLQotICAgIC8vIE5vdGU6IHRoZSB6ZXJvIG9wZXJhdGlvbiBnZXRzIHNwbGl0IGludG8gdHdvIGJsb2Nrcy4KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3daZXJvT3ApOwotICAgIEFTU0VSVF9FUShvcC0+Y29tcHJlc3Npb24sIGtDb3dDb21wcmVzc05vbmUpOwotICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOwotICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MSk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDApOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293WmVyb09wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NOb25lKTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKLSAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTIpOwotICAgIEFTU0VSVF9FUShvcC0+c291cmNlLCAwKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLSAgICBBU1NFUlRfVFJVRShpdGVyLT5Eb25lKCkpOwotfQotCi1URVNUX0YoQ293VGVzdCwgQ29tcHJlc3NHeikgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBhdXRvIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgU3RyaW5nU2luayBzaW5rOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293UmVwbGFjZU9wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NHeik7Ci0gICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgNTYpOyAgLy8gY29tcHJlc3NlZCEKLSAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTApOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLWNsYXNzIENvbXByZXNzaW9uUldUZXN0IDogcHVibGljIENvd1Rlc3QsIHB1YmxpYyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Y29uc3QgY2hhcio+IHt9OwotCi1URVNUX1AoQ29tcHJlc3Npb25SV1Rlc3QsIFRocmVhZGVkQmF0Y2hXcml0ZXMpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IEdldFBhcmFtKCk7Ci0gICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IDI7Ci0KLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIHN0ZDo6c3RyaW5nIHhvcl9kYXRhID0gIlRoaXMgaXMgdGVzdCBkYXRhLTEuIFRlc3RpbmcgeG9yIjsKLSAgICB4b3JfZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWG9yQmxvY2tzKDUwLCB4b3JfZGF0YS5kYXRhKCksIHhvcl9kYXRhLnNpemUoKSwgMjQsIDEwKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgdGVzdCBkYXRhLTIuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDIwNDgsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMTAwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEyID0gIlRoaXMgaXMgdGVzdCBkYXRhLTMuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOwotICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyNTksICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNjAwMCwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEzID0gIlRoaXMgaXMgdGVzdCBkYXRhLTQuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOwotICAgIGRhdGEzLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoOTAwMCwgZGF0YTMuZGF0YSgpLCBkYXRhMy5zaXplKCkpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIGludCBleHBlY3RlZF9ibG9ja3MgPSAoMSArIDIwNDggKyAyNTkgKyAxKTsKLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLQotICAgIGludCB0b3RhbF9ibG9ja3MgPSAwOwotICAgIHdoaWxlICghaXRlci0+RG9uZSgpKSB7Ci0gICAgICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICAgICAgaWYgKG9wLT50eXBlID09IGtDb3dYb3JPcCkgewotICAgICAgICAgICAgdG90YWxfYmxvY2tzICs9IDE7Ci0gICAgICAgICAgICBTdHJpbmdTaW5rIHNpbms7Ci0gICAgICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTApOwotICAgICAgICAgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDk4MzE0KTsgIC8vIDQwOTYgKiAyNCArIDEwCi0gICAgICAgICAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIHhvcl9kYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcC0+dHlwZSA9PSBrQ293UmVwbGFjZU9wKSB7Ci0gICAgICAgICAgICB0b3RhbF9ibG9ja3MgKz0gMTsKLSAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDEwMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Npbmsgc2luazsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgICAgICAgICAgICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNjAwMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Npbmsgc2luazsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgICAgICAgICAgICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3AtPm5ld19ibG9jayA9PSA5MDAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nU2luayBzaW5rOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGl0ZXItPk5leHQoKTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfRVEodG90YWxfYmxvY2tzLCBleHBlY3RlZF9ibG9ja3MpOwotfQotCi1URVNUX1AoQ29tcHJlc3Npb25SV1Rlc3QsIE5vQmF0Y2hXcml0ZXMpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IEdldFBhcmFtKCk7Ci0gICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IDE7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0KLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGVzdGluZyByZXBsYWNlIG9wcyB3aXRob3V0IGJhdGNoIHdyaXRlcyI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMTAyNCwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhMiA9ICJUZXN0aW5nIG9kZCBibG9ja3Mgd2l0aG91dCBiYXRjaCB3cml0ZXMiOwotICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAxMTEsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMzAwMCwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEzID0gIlRlc3Rpbmcgc2luZ2xlIDRrIGJsb2NrIjsKLSAgICBkYXRhMy5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwMDAsIGRhdGEzLmRhdGEoKSwgZGF0YTMuc2l6ZSgpKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBpbnQgZXhwZWN0ZWRfYmxvY2tzID0gKDEwMjQgKyAxMTEgKyAxKTsKLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLQotICAgIGludCB0b3RhbF9ibG9ja3MgPSAwOwotICAgIHdoaWxlICghaXRlci0+RG9uZSgpKSB7Ci0gICAgICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICAgICAgaWYgKG9wLT50eXBlID09IGtDb3dSZXBsYWNlT3ApIHsKLSAgICAgICAgICAgIHRvdGFsX2Jsb2NrcyArPSAxOwotICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNTApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdTaW5rIHNpbms7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICAgICAgICAgICAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDMwMDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdTaW5rIHNpbms7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICAgICAgICAgICAgICBkYXRhMi5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNTAwMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Npbmsgc2luazsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpdGVyLT5OZXh0KCk7Ci0gICAgfQotCi0gICAgQVNTRVJUX0VRKHRvdGFsX2Jsb2NrcywgZXhwZWN0ZWRfYmxvY2tzKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKENvd0FwaSwgQ29tcHJlc3Npb25SV1Rlc3QsIHRlc3Rpbmc6OlZhbHVlcygibm9uZSIsICJneiIsICJicm90bGkiLCAibHo0IikpOwotCi1URVNUX0YoQ293VGVzdCwgQ2x1c3RlckNvbXByZXNzR3opIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7Ci0gICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MSwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dSZXBsYWNlT3ApOwotICAgIEFTU0VSVF9FUShvcC0+Y29tcHJlc3Npb24sIGtDb3dDb21wcmVzc0d6KTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA1Nik7ICAvLyBjb21wcmVzc2VkIQotICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YSk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dDbHVzdGVyT3ApOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgc2luay5SZXNldCgpOwotICAgIEFTU0VSVF9FUShvcC0+Y29tcHJlc3Npb24sIGtDb3dDb21wcmVzc0d6KTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MSk7ICAvLyBjb21wcmVzc2VkIQotICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YTIpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293Q2x1c3Rlck9wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLSAgICBBU1NFUlRfVFJVRShpdGVyLT5Eb25lKCkpOwotfQotCi1URVNUX0YoQ293VGVzdCwgQ29tcHJlc3NUd29CbG9ja3MpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyLCAnXDAnKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIGl0ZXItPk5leHQoKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLQotICAgIFN0cmluZ1Npbmsgc2luazsKLQotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293UmVwbGFjZU9wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NHeik7Ci0gICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUxKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotfQotCi0vLyBPbmx5IHJldHVybiAxLWJ5dGUgYnVmZmVycywgdG8gc3RyZXNzIHRlc3QgdGhlIHBhcnRpYWwgcmVhZCBsb2dpYyBpbgotLy8gQ293UmVhZGVyLgotY2xhc3MgSG9ycmlibGVTdHJpbmdTaW5rIDogcHVibGljIFN0cmluZ1NpbmsgewotICBwdWJsaWM6Ci0gICAgdm9pZCogR2V0QnVmZmVyKHNpemVfdCwgc2l6ZV90KiBhY3R1YWwpIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZ1Npbms6OkdldEJ1ZmZlcigxLCBhY3R1YWwpOyB9Ci19OwotCi1jbGFzcyBDb21wcmVzc2lvblRlc3QgOiBwdWJsaWMgQ293VGVzdCwgcHVibGljIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxjb25zdCBjaGFyKj4ge307Ci0KLVRFU1RfUChDb21wcmVzc2lvblRlc3QsIEhvcnJpYmxlU2luaykgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gR2V0UGFyYW0oKTsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLQotICAgIEhvcnJpYmxlU3RyaW5nU2luayBzaW5rOwotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YSk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb3dBcGksIENvbXByZXNzaW9uVGVzdCwgdGVzdGluZzo6VmFsdWVzKCJub25lIiwgImd6IiwgImJyb3RsaSIpKTsKLQotVEVTVF9GKENvd1Rlc3QsIEdldFNpemUpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICBpZiAoZnRydW5jYXRlKGNvd18tPmZkLCAwKSA8IDApIHsKLSAgICAgICAgcGVycm9yKCJGYWlscyB0byBzZXQgdGVtcCBmaWxlIHNpemUiKTsKLSAgICAgICAgRkFJTCgpOwotICAgIH0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwLCAyMCkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDUxLCAyKSk7Ci0gICAgYXV0byBzaXplX2JlZm9yZSA9IHdyaXRlci5HZXRDb3dTaXplKCk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOwotICAgIGF1dG8gc2l6ZV9hZnRlciA9IHdyaXRlci5HZXRDb3dTaXplKCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfYmVmb3JlLCBzaXplX2FmdGVyKTsKLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgICBBU1NFUlRfR0UoZnN0YXQoY293Xy0+ZmQsICZidWYpLCAwKSA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXIuR2V0Q293U2l6ZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIEFwcGVuZExhYmVsU21hbGwpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDMpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMykpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7Ci0gICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBBU1NFUlRfRVEoZnN0YXQoY293Xy0+ZmQsICZidWYpLCAwKTsKLSAgICBBU1NFUlRfRVEoYnVmLnN0X3NpemUsIHdyaXRlci0+R2V0Q293U2l6ZSgpKTsKLQotICAgIC8vIFJlYWQgYmFjayBib3RoIG9wZXJhdGlvbnMsIGFuZCBsYWJlbC4KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIHVpbnQ2NF90IGxhYmVsOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5HZXRMYXN0TGFiZWwoJmxhYmVsKSk7Ci0gICAgQVNTRVJUX0VRKGxhYmVsLCAzKTsKLQotICAgIFN0cmluZ1Npbmsgc2luazsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7Ci0KLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBhdXRvIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1JlcGxhY2VPcCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YSk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgc2luay5SZXNldCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDMpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293UmVwbGFjZU9wKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhMik7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIEFwcGVuZExhYmVsTWlzc2luZykgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMCkpOwotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOwotICAgIC8vIERyb3AgdGhlIHRhaWwgZW5kIG9mIHRoZSBsYXN0IG9wIGhlYWRlciwgY29ycnVwdGluZyBpdC4KLSAgICBmdHJ1bmNhdGUoY293Xy0+ZmQsIHdyaXRlci0+R2V0Q293U2l6ZSgpIC0gc2l6ZW9mKENvd0Zvb3RlcikgLSAzKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zKTsKLSAgICBBU1NFUlRfRkFMU0Uod3JpdGVyLT5Jbml0aWFsaXplQXBwZW5kKGNvd18tPmZkLCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplQXBwZW5kKGNvd18tPmZkLCAwKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoNTEsIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgc3RydWN0IHN0YXQgYnVmOwotICAgIEFTU0VSVF9FUShmc3RhdChjb3dfLT5mZCwgJmJ1ZiksIDApOwotICAgIEFTU0VSVF9FUShidWYuc3Rfc2l6ZSwgd3JpdGVyLT5HZXRDb3dTaXplKCkpOwotCi0gICAgLy8gUmVhZCBiYWNrIGJvdGggb3BlcmF0aW9ucy4KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgU3RyaW5nU2luayBzaW5rOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDApOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293WmVyb09wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBBcHBlbmRFeHRlbmRlZENvcnJ1cHRlZCkgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNSkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMiwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNikpOwotCi0gICAgLy8gZmFpbCB0byB3cml0ZSB0aGUgZm9vdGVyLiBDb3cgRm9ybWF0IGRvZXMgbm90IGtub3cgaWYgTGFiZWwgNiBpcyB2YWxpZAotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgLy8gR2V0IHRoZSBsYXN0IGtub3duIGdvb2QgbGFiZWwKLSAgICBDb3dSZWFkZXIgbGFiZWxfcmVhZGVyOwotICAgIHVpbnQ2NF90IGxhYmVsOwotICAgIEFTU0VSVF9UUlVFKGxhYmVsX3JlYWRlci5QYXJzZShjb3dfLT5mZCwgezV9KSk7Ci0gICAgQVNTRVJUX1RSVUUobGFiZWxfcmVhZGVyLkdldExhc3RMYWJlbCgmbGFiZWwpKTsKLSAgICBBU1NFUlRfRVEobGFiZWwsIDUpOwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgNSkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLQotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBBU1NFUlRfRVEoZnN0YXQoY293Xy0+ZmQsICZidWYpLCAwKTsKLSAgICBBU1NFUlRfRVEoYnVmLnN0X3NpemUsIHdyaXRlci0+R2V0Q293U2l6ZSgpKTsKLQotICAgIC8vIFJlYWQgYmFjayBhbGwgdmFsaWQgb3BlcmF0aW9ucwotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dMYWJlbE9wKTsKLSAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSwgNSk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIEFwcGVuZGJ5TGFiZWwpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2Nrcyg1MCwgMikpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg1KSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoNSwgNikpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg2KSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX0ZBTFNFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMTIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemVBcHBlbmQoY293Xy0+ZmQsIDUpKTsKLQotICAgIC8vIFRoaXMgc2hvdWxkIGRyb3AgbGFiZWwgNgotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0KLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgQVNTRVJUX0VRKGZzdGF0KGNvd18tPmZkLCAmYnVmKSwgMCk7Ci0gICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXItPkdldENvd1NpemUoKSk7Ci0KLSAgICAvLyBSZWFkIGJhY2sgYWxsIG9wcwotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dSZXBsYWNlT3ApOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEuc3Vic3RyKDAsIG9wdGlvbnMuYmxvY2tfc2l6ZSkpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIHNpbmsuUmVzZXQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1JlcGxhY2VPcCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YS5zdWJzdHIob3B0aW9ucy5ibG9ja19zaXplLCAyICogb3B0aW9ucy5ibG9ja19zaXplKSk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgc2luay5SZXNldCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDQpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293WmVyb09wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1plcm9PcCk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDUpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIENsdXN0ZXJUZXN0KSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSA0OwotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2Nrcyg1MCwgMikpOyAgLy8gQ2x1c3RlciBzcGxpdCBpbiBtaWRkbGUKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNSkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDUsIDYpKTsKLQotICAgIC8vIENsdXN0ZXIgc3BsaXQKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNikpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsgIC8vIE5vIGRhdGEgZm9yIGNsdXN0ZXIsIHNvIG5vIGNsdXN0ZXIgc3BsaXQgbmVlZGVkCi0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICAvLyBSZWFkIGJhY2sgYWxsIG9wcwotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dSZXBsYWNlT3ApOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEuc3Vic3RyKDAsIG9wdGlvbnMuYmxvY2tfc2l6ZSkpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIHNpbmsuUmVzZXQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd0xhYmVsT3ApOwotICAgIEFTU0VSVF9FUShvcC0+c291cmNlLCA0KTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1plcm9PcCk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0KLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dDbHVzdGVyT3ApOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293WmVyb09wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd0xhYmVsT3ApOwotICAgIEFTU0VSVF9FUShvcC0+c291cmNlLCA1KTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd0NvcHlPcCk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0KLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dDbHVzdGVyT3ApOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDYpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIENsdXN0ZXJBcHBlbmRUZXN0KSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAzOwotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg1MCkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7ICAvLyBBZGRzIGEgY2x1c3RlciBvcCwgc2hvdWxkIGJlIGRyb3BwZWQgb24gYXBwZW5kCi0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplQXBwZW5kKGNvd18tPmZkLCA1MCkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7Ci0gICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsgIC8vIEFkZHMgYSBjbHVzdGVyIG9wCi0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgQVNTRVJUX0VRKGZzdGF0KGNvd18tPmZkLCAmYnVmKSwgMCk7Ci0gICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXItPkdldENvd1NpemUoKSk7Ci0KLSAgICAvLyBSZWFkIGJhY2sgYm90aCBvcGVyYXRpb25zLCBwbHVzIGNsdXN0ZXIgb3AgYXQgZW5kCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICB1aW50NjRfdCBsYWJlbDsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0TGFzdExhYmVsKCZsYWJlbCkpOwotICAgIEFTU0VSVF9FUShsYWJlbCwgNTApOwotCi0gICAgU3RyaW5nU2luayBzaW5rOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDUwKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1JlcGxhY2VPcCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YTIpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293Q2x1c3Rlck9wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBBcHBlbmRBZnRlckZpbmFsaXplKSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOwotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCgzKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEyID0gIk1vcmUgZGF0YSEiOwotICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUxLCBkYXRhMi5kYXRhKCksIGRhdGEyLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICAvLyBDT1cgc2hvdWxkIGJlIHZhbGlkLgotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBXcml0ZURhdGFCbG9jayhDb3dXcml0ZXIqIHdyaXRlciwgdWludDY0X3QgbmV3X2Jsb2NrLCBzdGQ6OnN0cmluZyBkYXRhKSB7Ci0gICAgZGF0YS5yZXNpemUod3JpdGVyLT5vcHRpb25zKCkuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgaWYgKCF3cml0ZXItPkFkZFJhd0Jsb2NrcyhuZXdfYmxvY2ssIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpIHsKLSAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRmFpbGVkIHRvIGFkZCByYXcgYmxvY2siOwotICAgIH0KLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgQ29tcGFyZURhdGFCbG9jayhDb3dSZWFkZXIqIHJlYWRlciwgY29uc3QgQ293T3BlcmF0aW9uJiBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXItPkdldEhlYWRlcigmaGVhZGVyKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNtcCA9IGRhdGE7Ci0gICAgY21wLnJlc2l6ZShoZWFkZXIuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0gICAgaWYgKCFyZWFkZXItPlJlYWREYXRhKG9wLCAmc2luaykpIHsKLSAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRmFpbGVkIHRvIHJlYWQgZGF0YSBibG9jayI7Ci0gICAgfQotICAgIGlmIChjbXAgIT0gc2luay5zdHJlYW0oKSkgewotICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJEYXRhIGJsb2NrcyBkaWQgbm90IG1hdGNoLCBleHBlY3RlZCAiIDw8IGNtcCA8PCAiLCBnb3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHNpbmsuc3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIFJlc3VtZU1pZENsdXN0ZXIpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDc7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDEsICJCbG9jayAxIikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMiwgIkJsb2NrIDIiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAzLCAiQmxvY2sgMyIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNCwgIkJsb2NrIDQiKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNCwgIkJsb2NrIDQiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA1LCAiQmxvY2sgNSIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDYsICJCbG9jayA2IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNywgIkJsb2NrIDciKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA4LCAiQmxvY2sgOCIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgc2l6ZV90IG51bV9yZXBsYWNlID0gMDsKLSAgICBzaXplX3QgbWF4X2luX2NsdXN0ZXIgPSAwOwotICAgIHNpemVfdCBudW1faW5fY2x1c3RlciA9IDA7Ci0gICAgc2l6ZV90IG51bV9jbHVzdGVycyA9IDA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKLQotICAgICAgICBudW1faW5fY2x1c3RlcisrOwotICAgICAgICBtYXhfaW5fY2x1c3RlciA9IHN0ZDo6bWF4KG1heF9pbl9jbHVzdGVyLCBudW1faW5fY2x1c3Rlcik7Ci0KLSAgICAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCkgewotICAgICAgICAgICAgbnVtX3JlcGxhY2UrKzsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKG9wLm5ld19ibG9jaywgbnVtX3JlcGxhY2UpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoQ29tcGFyZURhdGFCbG9jaygmcmVhZGVyLCBvcCwgIkJsb2NrICIgKyBzdGQ6OnRvX3N0cmluZyhudW1fcmVwbGFjZSkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgICAgIG51bV9pbl9jbHVzdGVyID0gMDsKLSAgICAgICAgICAgIG51bV9jbHVzdGVycysrOwotICAgICAgICB9Ci0KLSAgICAgICAgaXRlci0+TmV4dCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEobnVtX3JlcGxhY2UsIDgpOwotICAgIEFTU0VSVF9FUShtYXhfaW5fY2x1c3RlciwgNyk7Ci0gICAgQVNTRVJUX0VRKG51bV9jbHVzdGVycywgMik7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBSZXN1bWVFbmRDbHVzdGVyKSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIGludCBjbHVzdGVyX29wcyA9IDU7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IGNsdXN0ZXJfb3BzOwotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAxLCAiQmxvY2sgMSIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDIsICJCbG9jayAyIikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMywgIkJsb2NrIDMiKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCgxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDQsICJCbG9jayA0IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNSwgIkJsb2NrIDUiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA2LCAiQmxvY2sgNiIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDcsICJCbG9jayA3IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgOCwgIkJsb2NrIDgiKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNCwgIkJsb2NrIDQiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA1LCAiQmxvY2sgNSIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDYsICJCbG9jayA2IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNywgIkJsb2NrIDciKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA4LCAiQmxvY2sgOCIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgc2l6ZV90IG51bV9yZXBsYWNlID0gMDsKLSAgICBzaXplX3QgbWF4X2luX2NsdXN0ZXIgPSAwOwotICAgIHNpemVfdCBudW1faW5fY2x1c3RlciA9IDA7Ci0gICAgc2l6ZV90IG51bV9jbHVzdGVycyA9IDA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKLQotICAgICAgICBudW1faW5fY2x1c3RlcisrOwotICAgICAgICBtYXhfaW5fY2x1c3RlciA9IHN0ZDo6bWF4KG1heF9pbl9jbHVzdGVyLCBudW1faW5fY2x1c3Rlcik7Ci0KLSAgICAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCkgewotICAgICAgICAgICAgbnVtX3JlcGxhY2UrKzsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKG9wLm5ld19ibG9jaywgbnVtX3JlcGxhY2UpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoQ29tcGFyZURhdGFCbG9jaygmcmVhZGVyLCBvcCwgIkJsb2NrICIgKyBzdGQ6OnRvX3N0cmluZyhudW1fcmVwbGFjZSkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgICAgIG51bV9pbl9jbHVzdGVyID0gMDsKLSAgICAgICAgICAgIG51bV9jbHVzdGVycysrOwotICAgICAgICB9Ci0KLSAgICAgICAgaXRlci0+TmV4dCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEobnVtX3JlcGxhY2UsIDgpOwotICAgIEFTU0VSVF9FUShtYXhfaW5fY2x1c3RlciwgY2x1c3Rlcl9vcHMpOwotICAgIEFTU0VSVF9FUShudW1fY2x1c3RlcnMsIDMpOwotfQotCi1URVNUX0YoQ293VGVzdCwgRGVsZXRlTWlkQ2x1c3RlcikgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNzsKLSAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMSwgIkJsb2NrIDEiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAyLCAiQmxvY2sgMiIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDMsICJCbG9jayAzIikpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDUsICJCbG9jayA1IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNiwgIkJsb2NrIDYiKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICBzaXplX3QgbnVtX3JlcGxhY2UgPSAwOwotICAgIHNpemVfdCBtYXhfaW5fY2x1c3RlciA9IDA7Ci0gICAgc2l6ZV90IG51bV9pbl9jbHVzdGVyID0gMDsKLSAgICBzaXplX3QgbnVtX2NsdXN0ZXJzID0gMDsKLSAgICB3aGlsZSAoIWl0ZXItPkRvbmUoKSkgewotICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOwotCi0gICAgICAgIG51bV9pbl9jbHVzdGVyKys7Ci0gICAgICAgIG1heF9pbl9jbHVzdGVyID0gc3RkOjptYXgobWF4X2luX2NsdXN0ZXIsIG51bV9pbl9jbHVzdGVyKTsKLSAgICAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCkgewotICAgICAgICAgICAgbnVtX3JlcGxhY2UrKzsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKG9wLm5ld19ibG9jaywgbnVtX3JlcGxhY2UpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoQ29tcGFyZURhdGFCbG9jaygmcmVhZGVyLCBvcCwgIkJsb2NrICIgKyBzdGQ6OnRvX3N0cmluZyhudW1fcmVwbGFjZSkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgICAgIG51bV9pbl9jbHVzdGVyID0gMDsKLSAgICAgICAgICAgIG51bV9jbHVzdGVycysrOwotICAgICAgICB9Ci0KLSAgICAgICAgaXRlci0+TmV4dCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEobnVtX3JlcGxhY2UsIDMpOwotICAgIEFTU0VSVF9FUShtYXhfaW5fY2x1c3RlciwgNSk7ICAvLyAzIGRhdGEsIDEgbGFiZWwsIDEgY2x1c3RlciBvcAotICAgIEFTU0VSVF9FUShudW1fY2x1c3RlcnMsIDEpOwotfQotCi1URVNUX0YoQ293VGVzdCwgQmlnU2VxT3ApIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICBjb25zdCBpbnQgc2VxX2xlbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSAvIHNpemVvZih1aW50MzJfdCkgKyAxOwotICAgIHVpbnQzMl90IHNlcXVlbmNlW3NlcV9sZW5dOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7Ci0gICAgICAgIHNlcXVlbmNlW2ldID0gaSArIDE7Ci0gICAgfQotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRTZXF1ZW5jZURhdGEoc2VxX2xlbiwgc2VxdWVuY2UpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0UmV2TWVyZ2VPcEl0ZXIoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKCFpdGVyLT5Eb25lKCkpOwotICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOwotCi0gICAgICAgIEFTU0VSVF9FUShvcC5uZXdfYmxvY2ssIHNlcV9sZW4gLSBpKTsKLQotICAgICAgICBpdGVyLT5OZXh0KCk7Ci0gICAgfQotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBNaXNzaW5nU2VxT3ApIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICBjb25zdCBpbnQgc2VxX2xlbiA9IDEwOwotICAgIHVpbnQzMl90IHNlcXVlbmNlW3NlcV9sZW5dOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7Ci0gICAgICAgIHNlcXVlbmNlW2ldID0gaSArIDE7Ci0gICAgfQotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRTZXF1ZW5jZURhdGEoc2VxX2xlbiwgc2VxdWVuY2UpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuIC0gMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX0ZBTFNFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotfQotCi1URVNUX0YoQ293VGVzdCwgUmVzdW1lU2VxT3ApIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgY29uc3QgaW50IHNlcV9sZW4gPSAxMDsKLSAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgewotICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOwotICAgIH0KLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRTZXF1ZW5jZURhdGEoc2VxX2xlbiwgc2VxdWVuY2UpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMSwgc2VxX2xlbiAvIDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMSArIHNlcV9sZW4gLyAyLCAxKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0gICAgYXV0byByZWFkZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1JlYWRlcj4oKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXItPlBhcnNlKGNvd18tPmZkLCAxKSk7Ci0gICAgYXV0byBpdHIgPSByZWFkZXItPkdldFJldk1lcmdlT3BJdGVyKCk7Ci0gICAgQVNTRVJUX1RSVUUoaXRyLT5Eb25lKCkpOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxICsgc2VxX2xlbiAvIDIsIHNlcV9sZW4gLyAyKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci0+UGFyc2UoY293Xy0+ZmQpKTsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKLQotICAgIHVpbnQ2NF90IGV4cGVjdGVkX2Jsb2NrID0gMTA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkgJiYgZXhwZWN0ZWRfYmxvY2sgPiAwKSB7Ci0gICAgICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOwotCi0gICAgICAgIEFTU0VSVF9FUShvcC5uZXdfYmxvY2ssIGV4cGVjdGVkX2Jsb2NrKTsKLQotICAgICAgICBpdGVyLT5OZXh0KCk7Ci0gICAgICAgIGV4cGVjdGVkX2Jsb2NrLS07Ci0gICAgfQotICAgIEFTU0VSVF9FUShleHBlY3RlZF9ibG9jaywgMCk7Ci0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIFJldk1lcmdlT3BJdHJUZXN0KSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSA1OwotICAgIG9wdGlvbnMubnVtX21lcmdlX29wcyA9IDE7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICB1aW50MzJfdCBzZXF1ZW5jZVtdID0gezIsIDEwLCA2LCA3LCAzLCA1fTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkU2VxdWVuY2VEYXRhKDYsIHNlcXVlbmNlKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNiwgMTMpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxMiwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDgsIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxMSwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDMsIDE1KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMiwgMTEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg0LCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoOSwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDUsIDE2KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoMSwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwLCAxMikpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDcsIDE0KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOwotCi0gICAgLy8gTmV3IGJsb2NrIGluIGNvdyBvcmRlciBpcyA2LCAxMiwgOCwgMTEsIDMsIDIsIDQsIDksIDUsIDEsIDEwLCA3Ci0gICAgLy8gTmV3IGJsb2NrIGluIG1lcmdlIG9yZGVyIGlzIDIsIDEwLCA2LCA3LCAzLCA1LCAxMiwgMTEsIDksIDgsIDQsIDEKLSAgICAvLyBSZXZNZXJnZU9yZGVyIGlzIDEsIDQsIDgsIDksIDExLCAxMiwgNSwgMywgNywgNiwgMTAsIDIKLSAgICAvLyBuZXcgYmxvY2sgMiBpcyAiYWxyZWFkeSBtZXJnZWQiLCBzbyB3aWxsIGJlIGxlZnQgb3V0LgotCi0gICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHJldk1lcmdlT3BTZXF1ZW5jZSA9IHsxLCA0LCA4LCA5LCAxMSwgMTIsIDUsIDMsIDcsIDYsIDEwfTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldFJldk1lcmdlT3BJdGVyKCk7Ci0gICAgYXV0byBleHBlY3RlZF9uZXdfYmxvY2sgPSByZXZNZXJnZU9wU2VxdWVuY2UuYmVnaW4oKTsKLQotICAgIHdoaWxlICghaXRlci0+RG9uZSgpICYmIGV4cGVjdGVkX25ld19ibG9jayAhPSByZXZNZXJnZU9wU2VxdWVuY2UuZW5kKCkpIHsKLSAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKLQotICAgICAgICBBU1NFUlRfRVEob3AubmV3X2Jsb2NrLCAqZXhwZWN0ZWRfbmV3X2Jsb2NrKTsKLQotICAgICAgICBpdGVyLT5OZXh0KCk7Ci0gICAgICAgIGV4cGVjdGVkX25ld19ibG9jaysrOwotICAgIH0KLSAgICBBU1NFUlRfRVEoZXhwZWN0ZWRfbmV3X2Jsb2NrLCByZXZNZXJnZU9wU2VxdWVuY2UuZW5kKCkpOwotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBMZWdhY3lSZXZNZXJnZU9wSXRyVGVzdCkgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNTsKLSAgICBvcHRpb25zLm51bV9tZXJnZV9vcHMgPSAxOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMiwgMTEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMCwgMTIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg2LCAxMykpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDcsIDE0KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMywgMTUpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg1LCAxNikpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDEyLCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoOCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDExLCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoNCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDksIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxLCAxKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICAvLyBOZXcgYmxvY2sgaW4gY293IG9yZGVyIGlzIDIsIDEwLCA2LCA3LCAzLCA1LCAxMiwgOCwgMTEsIDQsIDksIDEKLSAgICAvLyBOZXcgYmxvY2sgaW4gbWVyZ2Ugb3JkZXIgaXMgMiwgMTAsIDYsIDcsIDMsIDUsIDEyLCAxMSwgOSwgOCwgNCwgMQotICAgIC8vIFJldk1lcmdlT3JkZXIgaXMgMSwgNCwgOCwgOSwgMTEsIDEyLCA1LCAzLCA3LCA2LCAxMCwgMgotICAgIC8vIG5ldyBibG9jayAyIGlzICJhbHJlYWR5IG1lcmdlZCIsIHNvIHdpbGwgYmUgbGVmdCBvdXQuCi0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gcmV2TWVyZ2VPcFNlcXVlbmNlID0gezEsIDQsIDgsIDksIDExLCAxMiwgNSwgMywgNywgNiwgMTB9OwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0UmV2TWVyZ2VPcEl0ZXIoKTsKLSAgICBhdXRvIGV4cGVjdGVkX25ld19ibG9jayA9IHJldk1lcmdlT3BTZXF1ZW5jZS5iZWdpbigpOwotCi0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkgJiYgZXhwZWN0ZWRfbmV3X2Jsb2NrICE9IHJldk1lcmdlT3BTZXF1ZW5jZS5lbmQoKSkgewotICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOwotCi0gICAgICAgIEFTU0VSVF9FUShvcC5uZXdfYmxvY2ssICpleHBlY3RlZF9uZXdfYmxvY2spOwotCi0gICAgICAgIGl0ZXItPk5leHQoKTsKLSAgICAgICAgZXhwZWN0ZWRfbmV3X2Jsb2NrKys7Ci0gICAgfQotICAgIEFTU0VSVF9FUShleHBlY3RlZF9uZXdfYmxvY2ssIHJldk1lcmdlT3BTZXF1ZW5jZS5lbmQoKSk7Ci0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIEludmFsaWRNZXJnZU9yZGVyVGVzdCkgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNTsKLSAgICBvcHRpb25zLm51bV9tZXJnZV9vcHMgPSAxOwotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQ293UmVhZGVyIHJlYWRlcjsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDMsIDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoMiwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlZlcmlmeU1lcmdlT3BzKCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplQXBwZW5kKGNvd18tPmZkLCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDQsIDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotICAgIEFTU0VSVF9GQUxTRShyZWFkZXIuVmVyaWZ5TWVyZ2VPcHMoKSk7Ci0KLSAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDIsIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFhvckJsb2NrcygzLCAmZGF0YSwgZGF0YS5zaXplKCksIDEsIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotICAgIEFTU0VSVF9GQUxTRShyZWFkZXIuVmVyaWZ5TWVyZ2VPcHMoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2NvbXByZXNzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2NvbXByZXNzLmNwcAppbmRleCA5YjUwOTg2Li5hYmM3ZDMzIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19jb21wcmVzcy5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfY29tcHJlc3MuY3BwCkBAIC0xOCwxMDIgKzE4LDIwNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxxdWV1ZT4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxicm90bGkvZW5jb2RlLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2NvbXByZXNzLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgogI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+CiAjaW5jbHVkZSA8bHo0Lmg+CiAjaW5jbHVkZSA8emxpYi5oPgorI2luY2x1ZGUgPHpzdGQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKLXN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+IENvbXByZXNzV29ya2VyOjpDb21wcmVzcyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIENvbXByZXNzKGNvbXByZXNzaW9uXywgZGF0YSwgbGVuZ3RoKTsKKworc3RkOjpvcHRpb25hbDxDb3dDb21wcmVzc2lvbkFsZ29yaXRobT4gQ29tcHJlc3Npb25BbGdvcml0aG1Gcm9tU3RyaW5nKHN0ZDo6c3RyaW5nX3ZpZXcgbmFtZSkgeworICAgIGlmIChuYW1lID09ICJneiIpIHsKKyAgICAgICAgcmV0dXJuIHtrQ293Q29tcHJlc3NHen07CisgICAgfSBlbHNlIGlmIChuYW1lID09ICJicm90bGkiKSB7CisgICAgICAgIHJldHVybiB7a0Nvd0NvbXByZXNzQnJvdGxpfTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImx6NCIpIHsKKyAgICAgICAgcmV0dXJuIHtrQ293Q29tcHJlc3NMejR9OworICAgIH0gZWxzZSBpZiAobmFtZSA9PSAienN0ZCIpIHsKKyAgICAgICAgcmV0dXJuIHtrQ293Q29tcHJlc3Nac3RkfTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIm5vbmUiIHx8IG5hbWUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4ge2tDb3dDb21wcmVzc05vbmV9OworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInVuYWJsZSB0byBkZXRlcm1pbmUgZGVmYXVsdCBjb21wcmVzc2lvbiBhbGdvcml0aG0gZm9yOiAiIDw8IG5hbWU7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CiB9CiAKLXN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+IENvbXByZXNzV29ya2VyOjpDb21wcmVzcyhDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CitzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IElDb21wcmVzc29yOjpDcmVhdGUoQ293Q29tcHJlc3Npb24gY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBibG9ja19zaXplKSB7CisgICAgc3dpdGNoIChjb21wcmVzc2lvbi5hbGdvcml0aG0pIHsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NMejQ6CisgICAgICAgICAgICByZXR1cm4gSUNvbXByZXNzb3I6Okx6NChjb21wcmVzc2lvbi5jb21wcmVzc2lvbl9sZXZlbCwgYmxvY2tfc2l6ZSk7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzQnJvdGxpOgorICAgICAgICAgICAgcmV0dXJuIElDb21wcmVzc29yOjpCcm90bGkoY29tcHJlc3Npb24uY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc0d6OgorICAgICAgICAgICAgcmV0dXJuIElDb21wcmVzc29yOjpHeihjb21wcmVzc2lvbi5jb21wcmVzc2lvbl9sZXZlbCwgYmxvY2tfc2l6ZSk7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzWnN0ZDoKKyAgICAgICAgICAgIHJldHVybiBJQ29tcHJlc3Nvcjo6WnN0ZChjb21wcmVzc2lvbi5jb21wcmVzc2lvbl9sZXZlbCwgYmxvY2tfc2l6ZSk7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTm9uZToKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gMS4gRGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCBpcyBkZXRlcm1pbmVkIGJ5IGNvbXByZXNzaW9uIGFsZ29yaXRobQorLy8gMi4gVGhlcmUgbWlnaHQgYmUgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaWYgYSB2YWx1ZSBpcyBjaGFuZ2VkIGhlcmUsIGFzICBzb21lIG9sZGVyIHZlcnNpb25zIG9mCisvLyBBbmRyb2lkIHdpbGwgYXNzdW1lIGEgZGlmZmVyZW50IGNvbXByZXNzaW9uIGxldmVsLCBjYXVzaW5nIGNvd19zaXplIGVzdGltYXRpb24gZGlmZmVyZW5jZXMgdGhhdAorLy8gd2lsbCBsZWFkIHRvIE9UQSBmYWlsdXJlLiBFbnN1cmUgdGhhdCB0aGUgZGV2aWNlIGFuZCBPVEEgcGFja2FnZSB1c2UgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwKKy8vIGZvciBPVEEgdG8gc3VjY2VlZC4KK3VpbnQzMl90IENvbXByZXNzV29ya2VyOjpHZXREZWZhdWx0Q29tcHJlc3Npb25MZXZlbChDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbikgewogICAgIHN3aXRjaCAoY29tcHJlc3Npb24pIHsKICAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NHejogewotICAgICAgICAgICAgY29uc3QgYXV0byBib3VuZCA9IGNvbXByZXNzQm91bmQobGVuZ3RoKTsKLSAgICAgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+IGJ1ZmZlcihib3VuZCwgJ1wwJyk7Ci0KLSAgICAgICAgICAgIHVMb25nZiBkZXN0X2xlbiA9IGJvdW5kOwotICAgICAgICAgICAgYXV0byBydiA9IGNvbXByZXNzMihidWZmZXIuZGF0YSgpLCAmZGVzdF9sZW4sIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnl0ZWYqPihkYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBaX0JFU1RfQ09NUFJFU1NJT04pOwotICAgICAgICAgICAgaWYgKHJ2ICE9IFpfT0spIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJjb21wcmVzczIgcmV0dXJuZWQ6ICIgPDwgcnY7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHt9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLnJlc2l6ZShkZXN0X2xlbik7Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIFpfQkVTVF9DT01QUkVTU0lPTjsKICAgICAgICAgfQogICAgICAgICBjYXNlIGtDb3dDb21wcmVzc0Jyb3RsaTogewotICAgICAgICAgICAgY29uc3QgYXV0byBib3VuZCA9IEJyb3RsaUVuY29kZXJNYXhDb21wcmVzc2VkU2l6ZShsZW5ndGgpOwotICAgICAgICAgICAgaWYgKCFib3VuZCkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkJyb3RsaUVuY29kZXJNYXhDb21wcmVzc2VkU2l6ZSByZXR1cm5lZCAwIjsKLSAgICAgICAgICAgICAgICByZXR1cm4ge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBidWZmZXIoYm91bmQsICdcMCcpOwotCi0gICAgICAgICAgICBzaXplX3QgZW5jb2RlZF9zaXplID0gYm91bmQ7Ci0gICAgICAgICAgICBhdXRvIHJ2ID0gQnJvdGxpRW5jb2RlckNvbXByZXNzKAotICAgICAgICAgICAgICAgICAgICBCUk9UTElfREVGQVVMVF9RVUFMSVRZLCBCUk9UTElfREVGQVVMVF9XSU5ET1csIEJST1RMSV9ERUZBVUxUX01PREUsIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSksICZlbmNvZGVkX3NpemUsIGJ1ZmZlci5kYXRhKCkpOwotICAgICAgICAgICAgaWYgKCFydikgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkJyb3RsaUVuY29kZXJDb21wcmVzcyBmYWlsZWQiOwotICAgICAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoZW5jb2RlZF9zaXplKTsKLSAgICAgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICAgICAgICByZXR1cm4gQlJPVExJX0RFRkFVTFRfUVVBTElUWTsKICAgICAgICAgfQogICAgICAgICBjYXNlIGtDb3dDb21wcmVzc0x6NDogewotICAgICAgICAgICAgY29uc3QgYXV0byBib3VuZCA9IExaNF9jb21wcmVzc0JvdW5kKGxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoIWJvdW5kKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTFo0X2NvbXByZXNzQm91bmQgcmV0dXJuZWQgMCI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHt9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4gYnVmZmVyKGJvdW5kLCAnXDAnKTsKLQotICAgICAgICAgICAgY29uc3QgYXV0byBjb21wcmVzc2VkX3NpemUgPSBMWjRfY29tcHJlc3NfZGVmYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpLCByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXIuZGF0YSgpKSwgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIuc2l6ZSgpKTsKLSAgICAgICAgICAgIGlmIChjb21wcmVzc2VkX3NpemUgPD0gMCkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkxaNF9jb21wcmVzc19kZWZhdWx0IGZhaWxlZCwgaW5wdXQgc2l6ZTogIiA8PCBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGNvbXByZXNzaW9uIGJvdW5kOiAiIDw8IGJvdW5kIDw8ICIsIHJldDogIiA8PCBjb21wcmVzc2VkX3NpemU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHt9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIGNvbXByZXNzaW9uIGlmIHRoZSBjb21wcmVzc2VkIG91dHB1dCBpcyBsYXJnZXIKLSAgICAgICAgICAgIGlmIChjb21wcmVzc2VkX3NpemUgPj0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLnJlc2l6ZShsZW5ndGgpOwotICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIuZGF0YSgpLCBkYXRhLCBsZW5ndGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIucmVzaXplKGNvbXByZXNzZWRfc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ1bmhhbmRsZWQgY29tcHJlc3Npb24gdHlwZTogIiA8PCBjb21wcmVzc2lvbjsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzWnN0ZDogeworICAgICAgICAgICAgcmV0dXJuIFpTVERfZGVmYXVsdENMZXZlbCgpOworICAgICAgICB9CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTm9uZTogeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHt9OworICAgIHJldHVybiAwOwogfQorCitjbGFzcyBHekNvbXByZXNzb3IgZmluYWwgOiBwdWJsaWMgSUNvbXByZXNzb3IgeworICBwdWJsaWM6CisgICAgR3pDb21wcmVzc29yKHVpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLCBjb25zdCB1aW50MzJfdCBibG9ja19zaXplKQorICAgICAgICA6IElDb21wcmVzc29yKGNvbXByZXNzaW9uX2xldmVsLCBibG9ja19zaXplKXt9OworCisgICAgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4gQ29tcHJlc3MoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBjb25zdCBhdXRvIGJvdW5kID0gY29tcHJlc3NCb3VuZChsZW5ndGgpOworICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBidWZmZXIoYm91bmQsICdcMCcpOworCisgICAgICAgIHVMb25nZiBkZXN0X2xlbiA9IGJvdW5kOworICAgICAgICBhdXRvIHJ2ID0gY29tcHJlc3MyKGJ1ZmZlci5kYXRhKCksICZkZXN0X2xlbiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCeXRlZio+KGRhdGEpLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29tcHJlc3Npb25MZXZlbCgpKTsKKyAgICAgICAgaWYgKHJ2ICE9IFpfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvbXByZXNzMiByZXR1cm5lZDogIiA8PCBydjsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIucmVzaXplKGRlc3RfbGVuKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9OworfTsKKworY2xhc3MgTHo0Q29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBJQ29tcHJlc3NvciB7CisgIHB1YmxpYzoKKyAgICBMejRDb21wcmVzc29yKHVpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLCBjb25zdCB1aW50MzJfdCBibG9ja19zaXplKQorICAgICAgICA6IElDb21wcmVzc29yKGNvbXByZXNzaW9uX2xldmVsLCBibG9ja19zaXplKXt9OworCisgICAgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4gQ29tcHJlc3MoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBjb25zdCBhdXRvIGJvdW5kID0gTFo0X2NvbXByZXNzQm91bmQobGVuZ3RoKTsKKyAgICAgICAgaWYgKCFib3VuZCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTFo0X2NvbXByZXNzQm91bmQgcmV0dXJuZWQgMCI7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4gYnVmZmVyKGJvdW5kLCAnXDAnKTsKKworICAgICAgICBjb25zdCBhdXRvIGNvbXByZXNzZWRfc2l6ZSA9CisgICAgICAgICAgICAgICAgTFo0X2NvbXByZXNzX2RlZmF1bHQoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlci5kYXRhKCkpLCBsZW5ndGgsIGJ1ZmZlci5zaXplKCkpOworICAgICAgICBpZiAoY29tcHJlc3NlZF9zaXplIDw9IDApIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkxaNF9jb21wcmVzc19kZWZhdWx0IGZhaWxlZCwgaW5wdXQgc2l6ZTogIiA8PCBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgY29tcHJlc3Npb24gYm91bmQ6ICIgPDwgYm91bmQgPDwgIiwgcmV0OiAiIDw8IGNvbXByZXNzZWRfc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICAvLyBEb24ndCBydW4gY29tcHJlc3Npb24gaWYgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGlzIGxhcmdlcgorICAgICAgICBpZiAoY29tcHJlc3NlZF9zaXplID49IGxlbmd0aCkgeworICAgICAgICAgICAgYnVmZmVyLnJlc2l6ZShsZW5ndGgpOworICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci5kYXRhKCksIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXIucmVzaXplKGNvbXByZXNzZWRfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9OworfTsKKworY2xhc3MgQnJvdGxpQ29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBJQ29tcHJlc3NvciB7CisgIHB1YmxpYzoKKyAgICBCcm90bGlDb21wcmVzc29yKHVpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLCBjb25zdCB1aW50MzJfdCBibG9ja19zaXplKQorICAgICAgICA6IElDb21wcmVzc29yKGNvbXByZXNzaW9uX2xldmVsLCBibG9ja19zaXplKXt9OworCisgICAgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4gQ29tcHJlc3MoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBjb25zdCBhdXRvIGJvdW5kID0gQnJvdGxpRW5jb2Rlck1heENvbXByZXNzZWRTaXplKGxlbmd0aCk7CisgICAgICAgIGlmICghYm91bmQpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkJyb3RsaUVuY29kZXJNYXhDb21wcmVzc2VkU2l6ZSByZXR1cm5lZCAwIjsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBidWZmZXIoYm91bmQsICdcMCcpOworCisgICAgICAgIHNpemVfdCBlbmNvZGVkX3NpemUgPSBib3VuZDsKKyAgICAgICAgYXV0byBydiA9IEJyb3RsaUVuY29kZXJDb21wcmVzcygKKyAgICAgICAgICAgICAgICBHZXRDb21wcmVzc2lvbkxldmVsKCksIEJST1RMSV9ERUZBVUxUX1dJTkRPVywgQlJPVExJX0RFRkFVTFRfTU9ERSwgbGVuZ3RoLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpLCAmZW5jb2RlZF9zaXplLCBidWZmZXIuZGF0YSgpKTsKKyAgICAgICAgaWYgKCFydikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQnJvdGxpRW5jb2RlckNvbXByZXNzIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLnJlc2l6ZShlbmNvZGVkX3NpemUpOworICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH07Cit9OworCitjbGFzcyBac3RkQ29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBJQ29tcHJlc3NvciB7CisgIHB1YmxpYzoKKyAgICBac3RkQ29tcHJlc3Nvcih1aW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZSkKKyAgICAgICAgOiBJQ29tcHJlc3Nvcihjb21wcmVzc2lvbl9sZXZlbCwgYmxvY2tfc2l6ZSksCisgICAgICAgICAgenN0ZF9jb250ZXh0XyhaU1REX2NyZWF0ZUNDdHgoKSwgWlNURF9mcmVlQ0N0eCkgeworICAgICAgICBaU1REX0NDdHhfc2V0UGFyYW1ldGVyKHpzdGRfY29udGV4dF8uZ2V0KCksIFpTVERfY19jb21wcmVzc2lvbkxldmVsLCBjb21wcmVzc2lvbl9sZXZlbCk7CisgICAgICAgIFpTVERfQ0N0eF9zZXRQYXJhbWV0ZXIoenN0ZF9jb250ZXh0Xy5nZXQoKSwgWlNURF9jX3dpbmRvd0xvZywgbG9nMihHZXRCbG9ja1NpemUoKSkpOworICAgIH07CisKKyAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBDb21wcmVzcyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+IGJ1ZmZlcihaU1REX2NvbXByZXNzQm91bmQobGVuZ3RoKSwgJ1wwJyk7CisgICAgICAgIGNvbnN0IGF1dG8gY29tcHJlc3NlZF9zaXplID0KKyAgICAgICAgICAgICAgICBaU1REX2NvbXByZXNzMih6c3RkX2NvbnRleHRfLmdldCgpLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpLCBkYXRhLCBsZW5ndGgpOworICAgICAgICBpZiAoY29tcHJlc3NlZF9zaXplIDw9IDApIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlpTVEQgY29tcHJlc3Npb24gZmFpbGVkICIgPDwgY29tcHJlc3NlZF9zaXplOworICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgICAgIC8vIERvbid0IHJ1biBjb21wcmVzc2lvbiBpZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgaXMgbGFyZ2VyCisgICAgICAgIGlmIChjb21wcmVzc2VkX3NpemUgPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICBidWZmZXIucmVzaXplKGxlbmd0aCk7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLmRhdGEoKSwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoY29tcHJlc3NlZF9zaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8WlNURF9DQ3R4LCBkZWNsdHlwZSgmWlNURF9mcmVlQ0N0eCk+IHpzdGRfY29udGV4dF87Cit9OworCiBib29sIENvbXByZXNzV29ya2VyOjpDb21wcmVzc0Jsb2Nrcyhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBudW1fYmxvY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4+KiBjb21wcmVzc2VkX2RhdGEpIHsKLSAgICByZXR1cm4gQ29tcHJlc3NCbG9ja3MoY29tcHJlc3Npb25fLCBibG9ja19zaXplXywgYnVmZmVyLCBudW1fYmxvY2tzLCBjb21wcmVzc2VkX2RhdGEpOworICAgIHJldHVybiBDb21wcmVzc0Jsb2Nrcyhjb21wcmVzc29yXy5nZXQoKSwgYmxvY2tfc2l6ZV8sIGJ1ZmZlciwgbnVtX2Jsb2NrcywgY29tcHJlc3NlZF9kYXRhKTsKIH0KIAotYm9vbCBDb21wcmVzc1dvcmtlcjo6Q29tcHJlc3NCbG9ja3MoQ293Q29tcHJlc3Npb25BbGdvcml0aG0gY29tcHJlc3Npb24sIHNpemVfdCBibG9ja19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgbnVtX2Jsb2NrcywKK2Jvb2wgQ29tcHJlc3NXb3JrZXI6OkNvbXByZXNzQmxvY2tzKElDb21wcmVzc29yKiBjb21wcmVzc29yLCBzaXplX3QgYmxvY2tfc2l6ZSwgY29uc3Qgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ibG9ja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4qIGNvbXByZXNzZWRfZGF0YSkgewogICAgIGNvbnN0IHVpbnQ4X3QqIGl0ZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpOwogICAgIHdoaWxlIChudW1fYmxvY2tzKSB7Ci0gICAgICAgIGF1dG8gZGF0YSA9IENvbXByZXNzKGNvbXByZXNzaW9uLCBpdGVyLCBibG9ja19zaXplKTsKKyAgICAgICAgYXV0byBkYXRhID0gY29tcHJlc3Nvci0+Q29tcHJlc3MoaXRlciwgYmxvY2tfc2l6ZSk7CiAgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDb21wcmVzc0Jsb2NrczogQ29tcHJlc3Npb24gZmFpbGVkIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIxMiw2ICszMTcsMjUgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBJQ29tcHJlc3Nvcjo6QnJvdGxpKHVpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYmxvY2tfc2l6ZSkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEJyb3RsaUNvbXByZXNzb3I+KGNvbXByZXNzaW9uX2xldmVsLCBibG9ja19zaXplKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBJQ29tcHJlc3Nvcjo6R3oodWludDMyX3QgY29tcHJlc3Npb25fbGV2ZWwsIGNvbnN0IGludDMyX3QgYmxvY2tfc2l6ZSkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEd6Q29tcHJlc3Nvcj4oY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IElDb21wcmVzc29yOjpMejQodWludDMyX3QgY29tcHJlc3Npb25fbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBibG9ja19zaXplKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8THo0Q29tcHJlc3Nvcj4oY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IElDb21wcmVzc29yOjpac3RkKHVpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGJsb2NrX3NpemUpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxac3RkQ29tcHJlc3Nvcj4oY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworfQorCiB2b2lkIENvbXByZXNzV29ya2VyOjpGaW5hbGl6ZSgpIHsKICAgICB7CiAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CkBAIC0yMjAsOCArMzQ0LDggQEAKICAgICBjdl8ubm90aWZ5X2FsbCgpOwogfQogCi1Db21wcmVzc1dvcmtlcjo6Q29tcHJlc3NXb3JrZXIoQ293Q29tcHJlc3Npb25BbGdvcml0aG0gY29tcHJlc3Npb24sIHVpbnQzMl90IGJsb2NrX3NpemUpCi0gICAgOiBjb21wcmVzc2lvbl8oY29tcHJlc3Npb24pLCBibG9ja19zaXplXyhibG9ja19zaXplKSB7fQorQ29tcHJlc3NXb3JrZXI6OkNvbXByZXNzV29ya2VyKHN0ZDo6dW5pcXVlX3B0cjxJQ29tcHJlc3Nvcj4mJiBjb21wcmVzc29yLCB1aW50MzJfdCBibG9ja19zaXplKQorICAgIDogY29tcHJlc3Nvcl8oc3RkOjptb3ZlKGNvbXByZXNzb3IpKSwgYmxvY2tfc2l6ZV8oYmxvY2tfc2l6ZSkge30KIAogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZGVjb21wcmVzcy5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19kZWNvbXByZXNzLmNwcAppbmRleCAxMzlhMjlmLi4yYWFmMzg4IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19kZWNvbXByZXNzLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19kZWNvbXByZXNzLmNwcApAQCAtMTYsMTI0ICsxNiwxMjUgQEAKIAogI2luY2x1ZGUgImNvd19kZWNvbXByZXNzLmgiCiAKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YnJvdGxpL2RlY29kZS5oPgogI2luY2x1ZGUgPGx6NC5oPgogI2luY2x1ZGUgPHpsaWIuaD4KKyNpbmNsdWRlIDx6c3RkLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKLWNsYXNzIE5vRGVjb21wcmVzc29yIGZpbmFsIDogcHVibGljIElEZWNvbXByZXNzb3IgewotICBwdWJsaWM6Ci0gICAgYm9vbCBEZWNvbXByZXNzKHNpemVfdCkgb3ZlcnJpZGU7Ci19Oworc3NpemVfdCBJQnl0ZVN0cmVhbTo6UmVhZEZ1bGx5KHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKSB7CisgICAgc2l6ZV90IHN0cmVhbV9yZW1haW5pbmcgPSBTaXplKCk7CiAKLWJvb2wgTm9EZWNvbXByZXNzb3I6OkRlY29tcHJlc3Moc2l6ZV90KSB7Ci0gICAgc2l6ZV90IHN0cmVhbV9yZW1haW5pbmcgPSBzdHJlYW1fLT5TaXplKCk7CisgICAgY2hhciogYnVmZmVyX3N0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyKTsKKyAgICBjaGFyKiBidWZmZXJfcG9zID0gYnVmZmVyX3N0YXJ0OworICAgIHNpemVfdCBidWZmZXJfcmVtYWluaW5nID0gYnVmZmVyX3NpemU7CiAgICAgd2hpbGUgKHN0cmVhbV9yZW1haW5pbmcpIHsKLSAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gc3RyZWFtX3JlbWFpbmluZzsKLSAgICAgICAgdWludDhfdCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oc2lua18tPkdldEJ1ZmZlcihidWZmZXJfc2l6ZSwgJmJ1ZmZlcl9zaXplKSk7Ci0gICAgICAgIGlmICghYnVmZmVyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgYWNxdWlyZSBidWZmZXIgZnJvbSBzaW5rIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHRvX3JlYWQgPSBzdGQ6Om1pbihidWZmZXJfcmVtYWluaW5nLCBzdHJlYW1fcmVtYWluaW5nKTsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBhY3R1YWxfcmVhZCA9IFJlYWQoYnVmZmVyX3BvcywgdG9fcmVhZCk7CisgICAgICAgIGlmIChhY3R1YWxfcmVhZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQorICAgICAgICBpZiAoIWFjdHVhbF9yZWFkKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTdHJlYW0gZW5kZWQgcHJlbWF0dXJlbHkiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIENIRUNLX0xFKGFjdHVhbF9yZWFkLCB0b19yZWFkKTsKIAotICAgICAgICAvLyBSZWFkIHVudGlsIHdlIGNhbiBmaWxsIHRoZSBidWZmZXIuCi0gICAgICAgIHVpbnQ4X3QqIGJ1ZmZlcl9wb3MgPSBidWZmZXI7Ci0gICAgICAgIHNpemVfdCBieXRlc190b19yZWFkID0gc3RkOjptaW4oYnVmZmVyX3NpemUsIHN0cmVhbV9yZW1haW5pbmcpOwotICAgICAgICB3aGlsZSAoYnl0ZXNfdG9fcmVhZCkgewotICAgICAgICAgICAgc2l6ZV90IHJlYWQ7Ci0gICAgICAgICAgICBpZiAoIXN0cmVhbV8tPlJlYWQoYnVmZmVyX3BvcywgYnl0ZXNfdG9fcmVhZCwgJnJlYWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFyZWFkKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU3RyZWFtIGVuZGVkIHByZW1hdHVyZWx5IjsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXNpbmtfLT5SZXR1cm5EYXRhKGJ1ZmZlcl9wb3MsIHJlYWQpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHJldHVybiBidWZmZXIgdG8gc2luayI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyX3BvcyArPSByZWFkOwotICAgICAgICAgICAgYnl0ZXNfdG9fcmVhZCAtPSByZWFkOwotICAgICAgICAgICAgc3RyZWFtX3JlbWFpbmluZyAtPSByZWFkOwotICAgICAgICB9CisgICAgICAgIHN0cmVhbV9yZW1haW5pbmcgLT0gYWN0dWFsX3JlYWQ7CisgICAgICAgIGJ1ZmZlcl9wb3MgKz0gYWN0dWFsX3JlYWQ7CisgICAgICAgIGJ1ZmZlcl9yZW1haW5pbmcgLT0gYWN0dWFsX3JlYWQ7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBidWZmZXJfcG9zIC0gYnVmZmVyX3N0YXJ0OwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8SURlY29tcHJlc3Nvcj4gSURlY29tcHJlc3Nvcjo6VW5jb21wcmVzc2VkKCkgewotICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8SURlY29tcHJlc3Nvcj4obmV3IE5vRGVjb21wcmVzc29yKCkpOworc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IElEZWNvbXByZXNzb3I6OkZyb21TdHJpbmcoc3RkOjpzdHJpbmdfdmlldyBjb21wcmVzc29yKSB7CisgICAgaWYgKGNvbXByZXNzb3IgPT0gImx6NCIpIHsKKyAgICAgICAgcmV0dXJuIElEZWNvbXByZXNzb3I6Okx6NCgpOworICAgIH0gZWxzZSBpZiAoY29tcHJlc3NvciA9PSAiYnJvdGxpIikgeworICAgICAgICByZXR1cm4gSURlY29tcHJlc3Nvcjo6QnJvdGxpKCk7CisgICAgfSBlbHNlIGlmIChjb21wcmVzc29yID09ICJneiIpIHsKKyAgICAgICAgcmV0dXJuIElEZWNvbXByZXNzb3I6Okd6KCk7CisgICAgfSBlbHNlIGlmIChjb21wcmVzc29yID09ICJ6c3RkIikgeworICAgICAgICByZXR1cm4gSURlY29tcHJlc3Nvcjo6WnN0ZCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIH0KIAogLy8gUmVhZCBjaHVua3Mgb2YgdGhlIENPVyBhbmQgaW5jcmVtZW50YWxseSBzdHJlYW0gdGhlbSB0byB0aGUgZGVjb2Rlci4KIGNsYXNzIFN0cmVhbURlY29tcHJlc3NvciA6IHB1YmxpYyBJRGVjb21wcmVzc29yIHsKICAgcHVibGljOgotICAgIGJvb2wgRGVjb21wcmVzcyhzaXplX3Qgb3V0cHV0X2J5dGVzKSBvdmVycmlkZTsKKyAgICBzc2l6ZV90IERlY29tcHJlc3Modm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBkZWNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGlnbm9yZV9ieXRlcykgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIGJvb2wgSW5pdCgpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgRGVjb21wcmVzc0lucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgRG9uZSgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgUGFydGlhbERlY29tcHJlc3MoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgPSAwOworICAgIGJvb2wgT3V0cHV0RnVsbCgpIGNvbnN0IHsgcmV0dXJuICFpZ25vcmVfYnl0ZXNfICYmICFvdXRwdXRfYnVmZmVyX3JlbWFpbmluZ187IH0KIAogICBwcm90ZWN0ZWQ6Ci0gICAgYm9vbCBHZXRGcmVzaEJ1ZmZlcigpOwotCi0gICAgc2l6ZV90IG91dHB1dF9ieXRlc187CiAgICAgc2l6ZV90IHN0cmVhbV9yZW1haW5pbmdfOwogICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXJfID0gbnVsbHB0cjsKICAgICBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfID0gMDsKKyAgICBzaXplX3QgaWdub3JlX2J5dGVzXyA9IDA7CisgICAgYm9vbCBkZWNvbXByZXNzb3JfZW5kZWRfID0gZmFsc2U7CiB9OwogCiBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrQ2h1bmtTaXplID0gNDA5NjsKIAotYm9vbCBTdHJlYW1EZWNvbXByZXNzb3I6OkRlY29tcHJlc3Moc2l6ZV90IG91dHB1dF9ieXRlcykgeworc3NpemVfdCBTdHJlYW1EZWNvbXByZXNzb3I6OkRlY29tcHJlc3Modm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpZ25vcmVfYnl0ZXMpIHsKICAgICBpZiAoIUluaXQoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgc3RyZWFtX3JlbWFpbmluZ18gPSBzdHJlYW1fLT5TaXplKCk7Ci0gICAgb3V0cHV0X2J5dGVzXyA9IG91dHB1dF9ieXRlczsKKyAgICBvdXRwdXRfYnVmZmVyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZmZlcik7CisgICAgb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfID0gYnVmZmVyX3NpemU7CisgICAgaWdub3JlX2J5dGVzXyA9IGlnbm9yZV9ieXRlczsKIAogICAgIHVpbnQ4X3QgY2h1bmtba0NodW5rU2l6ZV07Ci0gICAgd2hpbGUgKHN0cmVhbV9yZW1haW5pbmdfKSB7Ci0gICAgICAgIHNpemVfdCByZWFkID0gc3RkOjptaW4oc3RyZWFtX3JlbWFpbmluZ18sIHNpemVvZihjaHVuaykpOwotICAgICAgICBpZiAoIXN0cmVhbV8tPlJlYWQoY2h1bmssIHJlYWQsICZyZWFkKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHdoaWxlIChzdHJlYW1fcmVtYWluaW5nXyAmJiBvdXRwdXRfYnVmZmVyX3JlbWFpbmluZ18gJiYgIWRlY29tcHJlc3Nvcl9lbmRlZF8pIHsKKyAgICAgICAgc2l6ZV90IG1heF9yZWFkID0gc3RkOjptaW4oc3RyZWFtX3JlbWFpbmluZ18sIHNpemVvZihjaHVuaykpOworICAgICAgICBzc2l6ZV90IHJlYWQgPSBzdHJlYW1fLT5SZWFkKGNodW5rLCBtYXhfcmVhZCk7CisgICAgICAgIGlmIChyZWFkIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGlmICghcmVhZCkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU3RyZWFtIGVuZGVkIHByZW1hdHVyZWx5IjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBpZiAoIURlY29tcHJlc3NJbnB1dChjaHVuaywgcmVhZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFQYXJ0aWFsRGVjb21wcmVzcyhjaHVuaywgcmVhZCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotCiAgICAgICAgIHN0cmVhbV9yZW1haW5pbmdfIC09IHJlYWQ7CisgICAgfQogCi0gICAgICAgIGlmIChzdHJlYW1fcmVtYWluaW5nXyAmJiBEb25lKCkpIHsKKyAgICBpZiAoc3RyZWFtX3JlbWFpbmluZ18pIHsKKyAgICAgICAgaWYgKGRlY29tcHJlc3Nvcl9lbmRlZF8gJiYgIU91dHB1dEZ1bGwoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIGlucHV0IGluIHRoZSBzdHJlYW0sIGJ1dCB3ZSBoYXZlbid0IGZpbmlzaGVkCisgICAgICAgICAgICAvLyBjb25zdW1pbmcgaWdub3JlZCBieXRlcyBvciBhdmFpbGFibGUgb3V0cHV0IHNwYWNlIHlldCwgdGhlbgorICAgICAgICAgICAgLy8gc29tZXRoaW5nIHdlaXJkIGhhcHBlbmVkLiBSZXBvcnQgaXQgYW5kIGZhaWwuCiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJEZWNvbXByZXNzb3IgdGVybWluYXRlZCBlYXJseSI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWRlY29tcHJlc3Nvcl9lbmRlZF8gJiYgIU91dHB1dEZ1bGwoKSkgeworICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBlbmRlZCwgYnV0IHRoZSBkZWNvZGVyIGRvZXNuJ3QgdGhpbmsgc28sIGFuZCB0aGVyZSBhcmUKKyAgICAgICAgICAgIC8vIG1vcmUgYnl0ZXMgaW4gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJEZWNvbXByZXNzb3IgZXhwZWN0ZWQgbW9yZSBieXRlcyI7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFEb25lKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGVjb21wcmVzc29yIGV4cGVjdGVkIG1vcmUgYnl0ZXMiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0cmVhbURlY29tcHJlc3Nvcjo6R2V0RnJlc2hCdWZmZXIoKSB7Ci0gICAgc2l6ZV90IHJlcXVlc3Rfc2l6ZSA9IHN0ZDo6bWluKG91dHB1dF9ieXRlc18sIGtDaHVua1NpemUpOwotICAgIG91dHB1dF9idWZmZXJfID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHNpbmtfLT5HZXRCdWZmZXIocmVxdWVzdF9zaXplLCAmb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfKSk7Ci0gICAgaWYgKCFvdXRwdXRfYnVmZmVyXykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgYWNxdWlyZSBidWZmZXIgZnJvbSBzaW5rIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gYnVmZmVyX3NpemUgLSBvdXRwdXRfYnVmZmVyX3JlbWFpbmluZ187CiB9CiAKIGNsYXNzIEd6RGVjb21wcmVzc29yIGZpbmFsIDogcHVibGljIFN0cmVhbURlY29tcHJlc3NvciB7CkBAIC0xNDEsMTIgKzE0MiwxMCBAQAogICAgIH5HekRlY29tcHJlc3NvcigpOwogCiAgICAgYm9vbCBJbml0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBEZWNvbXByZXNzSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBEb25lKCkgb3ZlcnJpZGUgeyByZXR1cm4gZW5kZWRfOyB9CisgICAgYm9vbCBQYXJ0aWFsRGVjb21wcmVzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKIAogICBwcml2YXRlOgogICAgIHpfc3RyZWFtIHpfID0ge307Ci0gICAgYm9vbCBlbmRlZF8gPSBmYWxzZTsKIH07CiAKIGJvb2wgR3pEZWNvbXByZXNzb3I6OkluaXQoKSB7CkBAIC0xNjEsMjMgKzE2MCwzOSBAQAogICAgIGluZmxhdGVFbmQoJnpfKTsKIH0KIAotYm9vbCBHekRlY29tcHJlc3Nvcjo6RGVjb21wcmVzc0lucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKK2Jvb2wgR3pEZWNvbXByZXNzb3I6OlBhcnRpYWxEZWNvbXByZXNzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKICAgICB6Xy5uZXh0X2luID0gcmVpbnRlcnByZXRfY2FzdDxCeXRlZio+KGNvbnN0X2Nhc3Q8dWludDhfdCo+KGRhdGEpKTsKICAgICB6Xy5hdmFpbF9pbiA9IGxlbmd0aDsKIAotICAgIHdoaWxlICh6Xy5hdmFpbF9pbikgewotICAgICAgICAvLyBJZiBubyBtb3JlIG91dHB1dCBidWZmZXIsIGdyYWIgYSBuZXcgYnVmZmVyLgotICAgICAgICBpZiAoel8uYXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgIGlmICghR2V0RnJlc2hCdWZmZXIoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHpfLm5leHRfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxCeXRlZio+KG91dHB1dF9idWZmZXJfKTsKLSAgICAgICAgICAgIHpfLmF2YWlsX291dCA9IG91dHB1dF9idWZmZXJfcmVtYWluaW5nXzsKKyAgICAvLyBJZiB3ZSdyZSBhc2tlZCB0byBpZ25vcmUgc3RhcnRpbmcgYnl0ZXMsIHdlIHNpbmsgdGhvc2UgaW50byB0aGUgb3V0cHV0CisgICAgLy8gcmVwZWF0ZWRseSB1bnRpbCB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gaWdub3JlLgorICAgIHdoaWxlIChpZ25vcmVfYnl0ZXNfICYmIHpfLmF2YWlsX2luKSB7CisgICAgICAgIHN0ZDo6YXJyYXk8Qnl0ZWYsIGtDaHVua1NpemU+IGlnbm9yZV9idWZmZXI7CisgICAgICAgIHNpemVfdCBtYXhfaWdub3JlID0gc3RkOjptaW4oaWdub3JlX2J5dGVzXywgaWdub3JlX2J1ZmZlci5zaXplKCkpOworICAgICAgICB6Xy5uZXh0X291dCA9IGlnbm9yZV9idWZmZXIuZGF0YSgpOworICAgICAgICB6Xy5hdmFpbF9vdXQgPSBtYXhfaWdub3JlOworCisgICAgICAgIGludCBydiA9IGluZmxhdGUoJnpfLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgaWYgKHJ2ICE9IFpfT0sgJiYgcnYgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJpbmZsYXRlIHJldHVybmVkIGVycm9yIGNvZGUgIiA8PCBydjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IGJ1ZmZlciBzbyB3ZSBjYW4gY2FsbCBSZXR1cm5EYXRhLgotICAgICAgICBhdXRvIGF2YWlsX291dCA9IHpfLmF2YWlsX291dDsKKyAgICAgICAgc2l6ZV90IHJldHVybmVkID0gbWF4X2lnbm9yZSAtIHpfLmF2YWlsX291dDsKKyAgICAgICAgQ0hFQ0tfTEUocmV0dXJuZWQsIGlnbm9yZV9ieXRlc18pOwogCisgICAgICAgIGlnbm9yZV9ieXRlc18gLT0gcmV0dXJuZWQ7CisKKyAgICAgICAgaWYgKHJ2ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgZGVjb21wcmVzc29yX2VuZGVkXyA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHpfLm5leHRfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxCeXRlZio+KG91dHB1dF9idWZmZXJfKTsKKyAgICB6Xy5hdmFpbF9vdXQgPSBvdXRwdXRfYnVmZmVyX3JlbWFpbmluZ187CisKKyAgICB3aGlsZSAoel8uYXZhaWxfaW4gJiYgel8uYXZhaWxfb3V0KSB7CiAgICAgICAgIC8vIERlY29tcHJlc3MuCiAgICAgICAgIGludCBydiA9IGluZmxhdGUoJnpfLCBaX05PX0ZMVVNIKTsKICAgICAgICAgaWYgKHJ2ICE9IFpfT0sgJiYgcnYgIT0gWl9TVFJFQU1fRU5EKSB7CkBAIC0xODUsMzcgKzIwMCwyNiBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IHJldHVybmVkID0gYXZhaWxfb3V0IC0gel8uYXZhaWxfb3V0OwotICAgICAgICBpZiAoIXNpbmtfLT5SZXR1cm5EYXRhKG91dHB1dF9idWZmZXJfLCByZXR1cm5lZCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCByZXR1cm4gYnVmZmVyIHRvIHNpbmsiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIHNpemVfdCByZXR1cm5lZCA9IG91dHB1dF9idWZmZXJfcmVtYWluaW5nXyAtIHpfLmF2YWlsX291dDsKKyAgICAgICAgQ0hFQ0tfTEUocmV0dXJuZWQsIG91dHB1dF9idWZmZXJfcmVtYWluaW5nXyk7CisKICAgICAgICAgb3V0cHV0X2J1ZmZlcl8gKz0gcmV0dXJuZWQ7CiAgICAgICAgIG91dHB1dF9idWZmZXJfcmVtYWluaW5nXyAtPSByZXR1cm5lZDsKIAogICAgICAgICBpZiAocnYgPT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgICAgICAgICBpZiAoel8uYXZhaWxfaW4pIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJHeiBzdHJlYW0gZW5kZWQgcHJlbWF0dXJlbHkiOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuZGVkXyA9IHRydWU7CisgICAgICAgICAgICBkZWNvbXByZXNzb3JfZW5kZWRfID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8SURlY29tcHJlc3Nvcj4gSURlY29tcHJlc3Nvcjo6R3ooKSB7Ci0gICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPihuZXcgR3pEZWNvbXByZXNzb3IoKSk7Ci19Ci0KIGNsYXNzIEJyb3RsaURlY29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBTdHJlYW1EZWNvbXByZXNzb3IgewogICBwdWJsaWM6CiAgICAgfkJyb3RsaURlY29tcHJlc3NvcigpOwogCiAgICAgYm9vbCBJbml0KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBEZWNvbXByZXNzSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBEb25lKCkgb3ZlcnJpZGUgeyByZXR1cm4gQnJvdGxpRGVjb2RlcklzRmluaXNoZWQoZGVjb2Rlcl8pOyB9CisgICAgYm9vbCBQYXJ0aWFsRGVjb21wcmVzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKIAogICBwcml2YXRlOgogICAgIEJyb3RsaURlY29kZXJTdGF0ZSogZGVjb2Rlcl8gPSBudWxscHRyOwpAQCAtMjMyLDg0ICsyMzYsMTYyIEBACiAgICAgfQogfQogCi1ib29sIEJyb3RsaURlY29tcHJlc3Nvcjo6RGVjb21wcmVzc0lucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKK2Jvb2wgQnJvdGxpRGVjb21wcmVzc29yOjpQYXJ0aWFsRGVjb21wcmVzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CiAgICAgc2l6ZV90IGF2YWlsYWJsZV9pbiA9IGxlbmd0aDsKICAgICBjb25zdCB1aW50OF90KiBuZXh0X2luID0gZGF0YTsKIAotICAgIGJvb2wgbmVlZHNfbW9yZV9vdXRwdXQgPSBmYWxzZTsKLSAgICB3aGlsZSAoYXZhaWxhYmxlX2luIHx8IG5lZWRzX21vcmVfb3V0cHV0KSB7Ci0gICAgICAgIGlmICghb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfICYmICFHZXRGcmVzaEJ1ZmZlcigpKSB7CisgICAgd2hpbGUgKGF2YWlsYWJsZV9pbiAmJiBpZ25vcmVfYnl0ZXNfICYmICFCcm90bGlEZWNvZGVySXNGaW5pc2hlZChkZWNvZGVyXykpIHsKKyAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCBrQ2h1bmtTaXplPiBpZ25vcmVfYnVmZmVyOworICAgICAgICBzaXplX3QgbWF4X2lnbm9yZSA9IHN0ZDo6bWluKGlnbm9yZV9ieXRlc18sIGlnbm9yZV9idWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGlnbm9yZV9zaXplID0gbWF4X2lnbm9yZTsKKworICAgICAgICB1aW50OF90KiBpZ25vcmVfYnVmZmVyX3B0ciA9IGlnbm9yZV9idWZmZXIuZGF0YSgpOworICAgICAgICBhdXRvIHIgPSBCcm90bGlEZWNvZGVyRGVjb21wcmVzc1N0cmVhbShkZWNvZGVyXywgJmF2YWlsYWJsZV9pbiwgJm5leHRfaW4sICZpZ25vcmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlnbm9yZV9idWZmZXJfcHRyLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHIgPT0gQlJPVExJX0RFQ09ERVJfUkVTVUxUX0VSUk9SKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJicm90bGkgZGVjb2RlIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAociA9PSBCUk9UTElfREVDT0RFUl9SRVNVTFRfTkVFRFNfTU9SRV9JTlBVVCAmJiBhdmFpbGFibGVfaW4pIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImJyb3RsaSB1bmV4cGVjdGVkIG5lZWRzIG1vcmUgaW5wdXQiOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIGlnbm9yZV9ieXRlc18gLT0gbWF4X2lnbm9yZSAtIGlnbm9yZV9zaXplOworICAgIH0KIAotICAgICAgICBhdXRvIG91dHB1dF9idWZmZXIgPSBvdXRwdXRfYnVmZmVyXzsKKyAgICB3aGlsZSAoYXZhaWxhYmxlX2luICYmICFCcm90bGlEZWNvZGVySXNGaW5pc2hlZChkZWNvZGVyXykpIHsKICAgICAgICAgYXV0byByID0gQnJvdGxpRGVjb2RlckRlY29tcHJlc3NTdHJlYW0oZGVjb2Rlcl8sICZhdmFpbGFibGVfaW4sICZuZXh0X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfLCAmb3V0cHV0X2J1ZmZlcl8sIG51bGxwdHIpOwogICAgICAgICBpZiAociA9PSBCUk9UTElfREVDT0RFUl9SRVNVTFRfRVJST1IpIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImJyb3RsaSBkZWNvZGUgZmFpbGVkIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXNpbmtfLT5SZXR1cm5EYXRhKG91dHB1dF9idWZmZXIsIG91dHB1dF9idWZmZXJfIC0gb3V0cHV0X2J1ZmZlcikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChyID09IEJST1RMSV9ERUNPREVSX1JFU1VMVF9ORUVEU19NT1JFX0lOUFVUICYmIGF2YWlsYWJsZV9pbikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiYnJvdGxpIHVuZXhwZWN0ZWQgbmVlZHMgbW9yZSBpbnB1dCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgbmVlZHNfbW9yZV9vdXRwdXQgPSAociA9PSBCUk9UTElfREVDT0RFUl9SRVNVTFRfTkVFRFNfTU9SRV9PVVRQVVQpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KIAotc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IElEZWNvbXByZXNzb3I6OkJyb3RsaSgpIHsKLSAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+KG5ldyBCcm90bGlEZWNvbXByZXNzb3IoKSk7CisgICAgZGVjb21wcmVzc29yX2VuZGVkXyA9IEJyb3RsaURlY29kZXJJc0ZpbmlzaGVkKGRlY29kZXJfKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogY2xhc3MgTHo0RGVjb21wcmVzc29yIGZpbmFsIDogcHVibGljIElEZWNvbXByZXNzb3IgewogICBwdWJsaWM6CiAgICAgfkx6NERlY29tcHJlc3NvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICAgIGJvb2wgRGVjb21wcmVzcyhjb25zdCBzaXplX3Qgb3V0cHV0X3NpemUpIG92ZXJyaWRlIHsKLSAgICAgICAgc2l6ZV90IGFjdHVhbF9idWZmZXJfc2l6ZSA9IDA7Ci0gICAgICAgIGF1dG8mJiBvdXRwdXRfYnVmZmVyID0gc2lua18tPkdldEJ1ZmZlcihvdXRwdXRfc2l6ZSwgJmFjdHVhbF9idWZmZXJfc2l6ZSk7Ci0gICAgICAgIGlmIChhY3R1YWxfYnVmZmVyX3NpemUgIT0gb3V0cHV0X3NpemUpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgb2Ygc2l6ZSAiIDw8IG91dHB1dF9zaXplIDw8ICIgb25seSBnb3QgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBhY3R1YWxfYnVmZmVyX3NpemUgPDwgIiBieXRlcyI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3NpemVfdCBEZWNvbXByZXNzKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZGVjb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpZ25vcmVfYnl0ZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXRfYnVmZmVyKHN0cmVhbV8tPlNpemUoKSwgJ1wwJyk7CisgICAgICAgIHNzaXplX3Qgc3RyZWFtZWRfaW4gPSBzdHJlYW1fLT5SZWFkRnVsbHkoaW5wdXRfYnVmZmVyLmRhdGEoKSwgaW5wdXRfYnVmZmVyLnNpemUoKSk7CisgICAgICAgIGlmIChzdHJlYW1lZF9pbiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICAvLyBJZiBpbnB1dCBzaXplIGlzIHNhbWUgYXMgb3V0cHV0IHNpemUsIHRoZW4gaW5wdXQgaXMgdW5jb21wcmVzc2VkLgotICAgICAgICBpZiAoc3RyZWFtXy0+U2l6ZSgpID09IG91dHB1dF9zaXplKSB7Ci0gICAgICAgICAgICBzaXplX3QgYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgICAgICBzdHJlYW1fLT5SZWFkKG91dHB1dF9idWZmZXIsIG91dHB1dF9zaXplLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCAhPSBvdXRwdXRfc2l6ZSkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIGFsbCBpbnB1dCBhdCBvbmNlLiBFeHBlY3RlZDogIiA8PCBvdXRwdXRfc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhY3R1YWw6ICIgPDwgYnl0ZXNfcmVhZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIENIRUNLX0VRKHN0cmVhbWVkX2luLCBzdHJlYW1fLT5TaXplKCkpOworCisgICAgICAgIGNoYXIqIGRlY29kZV9idWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXIpOworICAgICAgICBzaXplX3QgZGVjb2RlX2J1ZmZlcl9zaXplID0gYnVmZmVyX3NpemU7CisKKyAgICAgICAgLy8gSXQncyB1bmNsZWFyIGlmIExaNCBjYW4gZXhhY3RseSBzYXRpc2Z5IGEgcGFydGlhbCBkZWNvZGUgcmVxdWVzdCwgc28KKyAgICAgICAgLy8gaWYgd2UgZ2V0IG9uZSwgY3JlYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlci4KKyAgICAgICAgc3RkOjpzdHJpbmcgdGVtcDsKKyAgICAgICAgaWYgKGJ1ZmZlcl9zaXplIDwgZGVjb21wcmVzc2VkX3NpemUpIHsKKyAgICAgICAgICAgIHRlbXAucmVzaXplKGRlY29tcHJlc3NlZF9zaXplLCAnXDAnKTsKKyAgICAgICAgICAgIGRlY29kZV9idWZmZXIgPSB0ZW1wLmRhdGEoKTsKKyAgICAgICAgICAgIGRlY29kZV9idWZmZXJfc2l6ZSA9IHRlbXAuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaW50IGJ5dGVzX2RlY29tcHJlc3NlZCA9IExaNF9kZWNvbXByZXNzX3NhZmUoaW5wdXRfYnVmZmVyLmRhdGEoKSwgZGVjb2RlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfYnVmZmVyLnNpemUoKSwgZGVjb2RlX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgaWYgKGJ5dGVzX2RlY29tcHJlc3NlZCA8IDApIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBkZWNvbXByZXNzIExaNCBibG9jaywgY29kZTogIiA8PCBieXRlc19kZWNvbXByZXNzZWQ7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzX2RlY29tcHJlc3NlZCAhPSBkZWNvbXByZXNzZWRfc2l6ZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29tcHJlc3MgTFo0IGJsb2NrLCBleHBlY3RlZCBvdXRwdXQgc2l6ZTogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBieXRlc19kZWNvbXByZXNzZWQgPDwgIiwgYWN0dWFsOiAiIDw8IGJ5dGVzX2RlY29tcHJlc3NlZDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19MRShieXRlc19kZWNvbXByZXNzZWQsIGRlY29kZV9idWZmZXJfc2l6ZSk7CisKKyAgICAgICAgaWYgKGlnbm9yZV9ieXRlcyA+IGJ5dGVzX2RlY29tcHJlc3NlZCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSWdub3JpbmcgbW9yZSBieXRlcyB0aGFuIGV4aXN0IGluIHN0cmVhbSAoaWdub3JpbmcgIiA8PCBpZ25vcmVfYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZ290ICIgPDwgYnl0ZXNfZGVjb21wcmVzc2VkIDw8ICIpIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0ZW1wLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIExaNCdzIEFQSSBoYXMgbm8gd2F5IHRvIHNpbmsgb3V0IHRoZSBmaXJzdCBOIGJ5dGVzIG9mIGRlY29kaW5nLAorICAgICAgICAgICAgLy8gc28gd2UgcmVhZCB0aGVtIGFsbCBpbiBhbmQgbWVtbW92ZSgpIHRvIGRyb3AgdGhlIHBhcnRpYWwgcmVhZC4KKyAgICAgICAgICAgIGlmIChpZ25vcmVfYnl0ZXMpIHsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKGRlY29kZV9idWZmZXIsIGRlY29kZV9idWZmZXIgKyBpZ25vcmVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19kZWNvbXByZXNzZWQgLSBpZ25vcmVfYnl0ZXMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2lua18tPlJldHVybkRhdGEob3V0cHV0X2J1ZmZlciwgb3V0cHV0X3NpemUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXNfZGVjb21wcmVzc2VkIC0gaWdub3JlX2J5dGVzOwogICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG1heF9jb3B5ID0gc3RkOjptaW4oYnl0ZXNfZGVjb21wcmVzc2VkIC0gaWdub3JlX2J5dGVzLCBidWZmZXJfc2l6ZSk7CisgICAgICAgIG1lbWNweShidWZmZXIsIHRlbXAuZGF0YSgpICsgaWdub3JlX2J5dGVzLCBtYXhfY29weSk7CisgICAgICAgIHJldHVybiBtYXhfY29weTsKKyAgICB9Cit9OworCitjbGFzcyBac3RkRGVjb21wcmVzc29yIGZpbmFsIDogcHVibGljIElEZWNvbXByZXNzb3IgeworICBwdWJsaWM6CisgICAgc3NpemVfdCBEZWNvbXByZXNzKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZGVjb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpZ25vcmVfYnl0ZXMgPSAwKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChidWZmZXJfc2l6ZSA8IGRlY29tcHJlc3NlZF9zaXplIC0gaWdub3JlX2J5dGVzKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgImJ1ZmZlciBzaXplICIgPDwgYnVmZmVyX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBkZWNvbXByZXNzZWQgZGF0YS4gRGVjb21wcmVzc2VkIHNpemUgIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGRlY29tcHJlc3NlZF9zaXplIDw8ICIsIGlnbm9yZV9ieXRlcyAiIDw8IGlnbm9yZV9ieXRlczsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWdub3JlX2J5dGVzID09IDApIHsKKyAgICAgICAgICAgIGlmICghRGVjb21wcmVzcyhidWZmZXIsIGRlY29tcHJlc3NlZF9zaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWNvbXByZXNzZWRfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBpZ25vcmVfYnVmKGRlY29tcHJlc3NlZF9zaXplKTsKKyAgICAgICAgaWYgKCFEZWNvbXByZXNzKGlnbm9yZV9idWYuZGF0YSgpLCBkZWNvbXByZXNzZWRfc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLCBpZ25vcmVfYnVmLmRhdGEoKSArIGlnbm9yZV9ieXRlcywgYnVmZmVyX3NpemUpOworICAgICAgICByZXR1cm4gZGVjb21wcmVzc2VkX3NpemU7CisgICAgfQorICAgIGJvb2wgRGVjb21wcmVzcyh2b2lkKiBvdXRwdXRfYnVmZmVyLCBjb25zdCBzaXplX3Qgb3V0cHV0X3NpemUpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXRfYnVmZmVyOwogICAgICAgICBpbnB1dF9idWZmZXIucmVzaXplKHN0cmVhbV8tPlNpemUoKSk7Ci0gICAgICAgIHNpemVfdCBieXRlc19yZWFkID0gMDsKLSAgICAgICAgc3RyZWFtXy0+UmVhZChpbnB1dF9idWZmZXIuZGF0YSgpLCBpbnB1dF9idWZmZXIuc2l6ZSgpLCAmYnl0ZXNfcmVhZCk7CisgICAgICAgIHNpemVfdCBieXRlc19yZWFkID0gc3RyZWFtXy0+UmVhZChpbnB1dF9idWZmZXIuZGF0YSgpLCBpbnB1dF9idWZmZXIuc2l6ZSgpKTsKICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgIT0gaW5wdXRfYnVmZmVyLnNpemUoKSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgYWxsIGlucHV0IGF0IG9uY2UuIEV4cGVjdGVkOiAiIDw8IGlucHV0X2J1ZmZlci5zaXplKCkKICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhY3R1YWw6ICIgPDwgYnl0ZXNfcmVhZDsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBpbnQgYnl0ZXNfZGVjb21wcmVzc2VkID0KLSAgICAgICAgICAgICAgICBMWjRfZGVjb21wcmVzc19zYWZlKGlucHV0X2J1ZmZlci5kYXRhKCksIHN0YXRpY19jYXN0PGNoYXIqPihvdXRwdXRfYnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2J1ZmZlci5zaXplKCksIG91dHB1dF9zaXplKTsKKyAgICAgICAgY29uc3QgYXV0byBieXRlc19kZWNvbXByZXNzZWQgPSBaU1REX2RlY29tcHJlc3Mob3V0cHV0X2J1ZmZlciwgb3V0cHV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2J1ZmZlci5kYXRhKCksIGlucHV0X2J1ZmZlci5zaXplKCkpOwogICAgICAgICBpZiAoYnl0ZXNfZGVjb21wcmVzc2VkICE9IG91dHB1dF9zaXplKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZGVjb21wcmVzcyBMWjQgYmxvY2ssIGV4cGVjdGVkIG91dHB1dCBzaXplOiAiIDw8IG91dHB1dF9zaXplCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZGVjb21wcmVzcyBaU1REIGJsb2NrLCBleHBlY3RlZCBvdXRwdXQgc2l6ZTogIiA8PCBvdXRwdXRfc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBhY3R1YWw6ICIgPDwgYnl0ZXNfZGVjb21wcmVzc2VkOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHNpbmtfLT5SZXR1cm5EYXRhKG91dHB1dF9idWZmZXIsIG91dHB1dF9zaXplKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfTsKIAorc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IElEZWNvbXByZXNzb3I6OkJyb3RsaSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxCcm90bGlEZWNvbXByZXNzb3I+KCk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBJRGVjb21wcmVzc29yOjpHeigpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxHekRlY29tcHJlc3Nvcj4oKTsKK30KKwogc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IElEZWNvbXByZXNzb3I6Okx6NCgpIHsKICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxMejREZWNvbXByZXNzb3I+KCk7CiB9CiAKK3N0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBJRGVjb21wcmVzc29yOjpac3RkKCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFpzdGREZWNvbXByZXNzb3I+KCk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2RlY29tcHJlc3MuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2RlY29tcHJlc3MuaAppbmRleCA3Zjc0ZWRhLi41MmIzZDc2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19kZWNvbXByZXNzLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZGVjb21wcmVzcy5oCkBAIC0yNiwxMSArMjYsMTYgQEAKICAgICB2aXJ0dWFsIH5JQnl0ZVN0cmVhbSgpIHt9CiAKICAgICAvLyBSZWFkIHVwIHRvIHxsZW5ndGh8IGJ5dGVzLCBzdG9yaW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbiB0aGUgb3V0LQotICAgIC8vIHBhcmFtZXRlci4gSWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQsIDAgaXMgcmV0dXJuZWQuCi0gICAgdmlydHVhbCBib29sIFJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBzaXplX3QqIHJlYWQpID0gMDsKKyAgICAvLyBwYXJhbWV0ZXIuIElmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLCAwIGlzIHJldHVybmVkLiBPbiBlcnJvciwKKyAgICAvLyAtMSBpcyByZXR1cm5lZC4gZXJybm8gaXMgTk9UIHNldC4KKyAgICB2aXJ0dWFsIHNzaXplX3QgUmVhZCh2b2lkKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpID0gMDsKIAogICAgIC8vIFNpemUgb2YgdGhlIHN0cmVhbS4KICAgICB2aXJ0dWFsIHNpemVfdCBTaXplKCkgY29uc3QgPSAwOworCisgICAgLy8gSGVscGVyIGZvciBSZWFkKCkuIFJlYWQgdGhlIGVudGlyZSBzdHJlYW0gaW50byB8YnVmZmVyfCwgdXAgdG8gfGxlbmd0aHwKKyAgICAvLyBieXRlcy4KKyAgICBzc2l6ZV90IFJlYWRGdWxseSh2b2lkKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpOwogfTsKIAogY2xhc3MgSURlY29tcHJlc3NvciB7CkBAIC00MiwxNiArNDcsMjQgQEAKICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IEd6KCk7CiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBCcm90bGkoKTsKICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IEx6NCgpOworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SURlY29tcHJlc3Nvcj4gWnN0ZCgpOwogCi0gICAgLy8gfG91dHB1dF9ieXRlc3wgaXMgdGhlIGV4cGVjdGVkIHRvdGFsIG51bWJlciBvZiBieXRlcyB0byBzaW5rLgotICAgIHZpcnR1YWwgYm9vbCBEZWNvbXByZXNzKHNpemVfdCBvdXRwdXRfYnl0ZXMpID0gMDsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IEZyb21TdHJpbmcoc3RkOjpzdHJpbmdfdmlldyBjb21wcmVzc29yKTsKKworICAgIC8vIERlY29tcHJlc3MgYXQgbW9zdCB8YnVmZmVyX3NpemV8IGJ5dGVzLCBpZ25vcmluZyB0aGUgZmlyc3QgfGlnbm9yZV9ieXRlc3wKKyAgICAvLyBvZiB0aGUgZGVjb2RlZCBzdHJlYW0uIHxidWZmZXJfc2l6ZXwgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYnl0ZS4KKyAgICAvLyB8ZGVjb21wcmVzc2VkX3NpemV8IGlzIHRoZSBleHBlY3RlZCB0b3RhbCBzaXplIGlmIHRoZSBlbnRpcmUgc3RyZWFtIHdlcmUKKyAgICAvLyBkZWNvbXByZXNzZWQuCisgICAgLy8KKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB8YnVmZmVyfCwgb3IgLTEgb24gZXJyb3IuIGVycm5vCisgICAgLy8gaXMgTk9UIHNldC4KKyAgICB2aXJ0dWFsIHNzaXplX3QgRGVjb21wcmVzcyh2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGRlY29tcHJlc3NlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpZ25vcmVfYnl0ZXMgPSAwKSA9IDA7CiAKICAgICB2b2lkIHNldF9zdHJlYW0oSUJ5dGVTdHJlYW0qIHN0cmVhbSkgeyBzdHJlYW1fID0gc3RyZWFtOyB9Ci0gICAgdm9pZCBzZXRfc2luayhJQnl0ZVNpbmsqIHNpbmspIHsgc2lua18gPSBzaW5rOyB9CiAKICAgcHJvdGVjdGVkOgogICAgIElCeXRlU3RyZWFtKiBzdHJlYW1fID0gbnVsbHB0cjsKLSAgICBJQnl0ZVNpbmsqIHNpbmtfID0gbnVsbHB0cjsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZm9ybWF0LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2Zvcm1hdC5jcHAKaW5kZXggOTRjNDEwOS4uOGQxNzg2YyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZm9ybWF0LmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19mb3JtYXQuY3BwCkBAIC0xOSw1MSArMTksOTUgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaD4KKyNpbmNsdWRlICJ3cml0ZXJfdjIuaCIKKyNpbmNsdWRlICJ3cml0ZXJfdjMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIENvd09wZXJhdGlvbiBjb25zdCYgb3ApIHsKLSAgICBvcyA8PCAiQ293T3BlcmF0aW9uKHR5cGU6IjsKLSAgICBpZiAob3AudHlwZSA9PSBrQ293Q29weU9wKQotICAgICAgICBvcyA8PCAia0Nvd0NvcHlPcCwgICAgIjsKLSAgICBlbHNlIGlmIChvcC50eXBlID09IGtDb3dSZXBsYWNlT3ApCi0gICAgICAgIG9zIDw8ICJrQ293UmVwbGFjZU9wLCAiOwotICAgIGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd1plcm9PcCkKLSAgICAgICAgb3MgPDwgImtaZXJvT3AsICAgICAgICI7Ci0gICAgZWxzZSBpZiAob3AudHlwZSA9PSBrQ293Rm9vdGVyT3ApCi0gICAgICAgIG9zIDw8ICJrQ293Rm9vdGVyT3AsICAiOwotICAgIGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd0xhYmVsT3ApCi0gICAgICAgIG9zIDw8ICJrQ293TGFiZWxPcCwgICAiOwotICAgIGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd0NsdXN0ZXJPcCkKLSAgICAgICAgb3MgPDwgImtDb3dDbHVzdGVyT3AgICI7Ci0gICAgZWxzZSBpZiAob3AudHlwZSA9PSBrQ293WG9yT3ApCi0gICAgICAgIG9zIDw8ICJrQ293WG9yT3AgICAgICAiOwotICAgIGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd1NlcXVlbmNlT3ApCi0gICAgICAgIG9zIDw8ICJrQ293U2VxdWVuY2VPcCAiOwotICAgIGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd0Zvb3Rlck9wKQotICAgICAgICBvcyA8PCAia0Nvd0Zvb3Rlck9wICAiOwotICAgIGVsc2UKLSAgICAgICAgb3MgPDwgKGludClvcC50eXBlIDw8ICI/LCI7Ci0gICAgb3MgPDwgImNvbXByZXNzaW9uOiI7Ci0gICAgaWYgKG9wLmNvbXByZXNzaW9uID09IGtDb3dDb21wcmVzc05vbmUpCi0gICAgICAgIG9zIDw8ICJrQ293Q29tcHJlc3NOb25lLCAgICI7Ci0gICAgZWxzZSBpZiAob3AuY29tcHJlc3Npb24gPT0ga0Nvd0NvbXByZXNzR3opCi0gICAgICAgIG9zIDw8ICJrQ293Q29tcHJlc3NHeiwgICAgICI7Ci0gICAgZWxzZSBpZiAob3AuY29tcHJlc3Npb24gPT0ga0Nvd0NvbXByZXNzQnJvdGxpKQotICAgICAgICBvcyA8PCAia0Nvd0NvbXByZXNzQnJvdGxpLCAiOwotICAgIGVsc2UKLSAgICAgICAgb3MgPDwgKGludClvcC5jb21wcmVzc2lvbiA8PCAiPywgIjsKLSAgICBvcyA8PCAiZGF0YV9sZW5ndGg6IiA8PCBvcC5kYXRhX2xlbmd0aCA8PCAiLFx0IjsKLSAgICBvcyA8PCAibmV3X2Jsb2NrOiIgPDwgb3AubmV3X2Jsb2NrIDw8ICIsXHQiOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOworCitzdGQ6Om9zdHJlYW0mIEVtaXRDb3dUeXBlU3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3MsIENvd09wZXJhdGlvblR5cGUgY293X3R5cGUpIHsKKyAgICBzd2l0Y2ggKGNvd190eXBlKSB7CisgICAgICAgIGNhc2Uga0Nvd0NvcHlPcDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAia0Nvd0NvcHlPcCI7CisgICAgICAgIGNhc2Uga0Nvd1JlcGxhY2VPcDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAia0Nvd1JlcGxhY2VPcCI7CisgICAgICAgIGNhc2Uga0Nvd1plcm9PcDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAia1plcm9PcCI7CisgICAgICAgIGNhc2Uga0Nvd0Zvb3Rlck9wOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJrQ293Rm9vdGVyT3AiOworICAgICAgICBjYXNlIGtDb3dMYWJlbE9wOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJrQ293TGFiZWxPcCI7CisgICAgICAgIGNhc2Uga0Nvd0NsdXN0ZXJPcDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAia0Nvd0NsdXN0ZXJPcCI7CisgICAgICAgIGNhc2Uga0Nvd1hvck9wOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJrQ293WG9yT3AiOworICAgICAgICBjYXNlIGtDb3dTZXF1ZW5jZU9wOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJrQ293U2VxdWVuY2VPcCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gb3MgPDwgKGludCljb3dfdHlwZSA8PCAidW5rbm93biI7CisgICAgfQorfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgQ293T3BlcmF0aW9uVHlwZSBjb3dfdHlwZSkgeworICAgIHJldHVybiBFbWl0Q293VHlwZVN0cmluZyhvcywgY293X3R5cGUpOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgQ293T3BlcmF0aW9uVjIgY29uc3QmIG9wKSB7CisgICAgb3MgPDwgIkNvd09wZXJhdGlvblYyKCI7CisgICAgRW1pdENvd1R5cGVTdHJpbmcob3MsIG9wLnR5cGUpIDw8ICIsICI7CisgICAgc3dpdGNoIChvcC5jb21wcmVzc2lvbikgeworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc05vbmU6CisgICAgICAgICAgICBvcyA8PCAidW5jb21wcmVzc2VkLCAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzR3o6CisgICAgICAgICAgICBvcyA8PCAiZ3osICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NCcm90bGk6CisgICAgICAgICAgICBvcyA8PCAiYnJvdGxpLCAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTHo0OgorICAgICAgICAgICAgb3MgPDwgImx6NCwgIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc1pzdGQ6CisgICAgICAgICAgICBvcyA8PCAienN0ZCwgIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBvcyA8PCAiZGF0YV9sZW5ndGg6IiA8PCBvcC5kYXRhX2xlbmd0aCA8PCAiLCAiOworICAgIG9zIDw8ICJuZXdfYmxvY2s6IiA8PCBvcC5uZXdfYmxvY2sgPDwgIiwgIjsKICAgICBvcyA8PCAic291cmNlOiIgPDwgb3Auc291cmNlOwotICAgIGlmIChvcC50eXBlID09IGtDb3dYb3JPcCkKLSAgICAgICAgb3MgPDwgIiAoYmxvY2s6IiA8PCBvcC5zb3VyY2UgLyBCTE9DS19TWiA8PCAiIG9mZnNldDoiIDw8IG9wLnNvdXJjZSAlIEJMT0NLX1NaIDw8ICIpIjsKICAgICBvcyA8PCAiKSI7CiAgICAgcmV0dXJuIG9zOwogfQogCi1pbnQ2NF90IEdldE5leHRPcE9mZnNldChjb25zdCBDb3dPcGVyYXRpb24mIG9wLCB1aW50MzJfdCBjbHVzdGVyX29wcykgeworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIENvd09wZXJhdGlvblYzIGNvbnN0JiBvcCkgeworICAgIG9zIDw8ICJDb3dPcGVyYXRpb24oIjsKKyAgICBFbWl0Q293VHlwZVN0cmluZyhvcywgb3AudHlwZSgpKTsKKyAgICBpZiAob3AudHlwZSgpID09IGtDb3dSZXBsYWNlT3AgfHwgb3AudHlwZSgpID09IGtDb3dYb3JPcCB8fCBvcC50eXBlKCkgPT0ga0Nvd1NlcXVlbmNlT3ApIHsKKyAgICAgICAgb3MgPDwgIiwgZGF0YV9sZW5ndGg6IiA8PCBvcC5kYXRhX2xlbmd0aDsKKyAgICB9CisgICAgaWYgKG9wLnR5cGUoKSAhPSBrQ293Q2x1c3Rlck9wICYmIG9wLnR5cGUoKSAhPSBrQ293U2VxdWVuY2VPcCAmJiBvcC50eXBlKCkgIT0ga0Nvd0xhYmVsT3ApIHsKKyAgICAgICAgb3MgPDwgIiwgbmV3X2Jsb2NrOiIgPDwgb3AubmV3X2Jsb2NrOworICAgIH0KKyAgICBpZiAob3AudHlwZSgpID09IGtDb3dYb3JPcCB8fCBvcC50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCB8fCBvcC50eXBlKCkgPT0ga0Nvd0NvcHlPcCkgeworICAgICAgICBvcyA8PCAiLCBzb3VyY2U6IiA8PCBvcC5zb3VyY2UoKTsKKyAgICB9IGVsc2UgaWYgKG9wLnR5cGUoKSA9PSBrQ293Q2x1c3Rlck9wKSB7CisgICAgICAgIG9zIDw8ICIsIGNsdXN0ZXJfZGF0YToiIDw8IG9wLnNvdXJjZSgpOworICAgIH0KKyAgICAvLyBWMyBvcCBzdG9yZXMgcmVzdW1lIHBvaW50cyBpbiBoZWFkZXIsIHNvIENvd09wIGNhbiBuZXZlciBiZSBMYWJlbC4KKyAgICBvcyA8PCAiKSI7CisgICAgcmV0dXJuIG9zOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgUmVzdW1lUG9pbnQgY29uc3QmIHJlc3VtZV9wb2ludCkgeworICAgIG9zIDw8ICJSZXN1bWVQb2ludCgiIDw8IHJlc3VtZV9wb2ludC5sYWJlbCA8PCAiICwgIiA8PCByZXN1bWVfcG9pbnQub3BfaW5kZXggPDwgIikiOworICAgIHJldHVybiBvczsKK30KKworaW50NjRfdCBHZXROZXh0T3BPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uVjImIG9wLCB1aW50MzJfdCBjbHVzdGVyX29wcykgewogICAgIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKICAgICAgICAgcmV0dXJuIG9wLnNvdXJjZTsKICAgICB9IGVsc2UgaWYgKChvcC50eXBlID09IGtDb3dSZXBsYWNlT3AgfHwgb3AudHlwZSA9PSBrQ293WG9yT3ApICYmIGNsdXN0ZXJfb3BzID09IDApIHsKQEAgLTczLDE4ICsxMTcsMTggQEAKICAgICB9CiB9CiAKLWludDY0X3QgR2V0TmV4dERhdGFPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uJiBvcCwgdWludDMyX3QgY2x1c3Rlcl9vcHMpIHsKK2ludDY0X3QgR2V0TmV4dERhdGFPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uVjImIG9wLCB1aW50MzJfdCBjbHVzdGVyX29wcykgewogICAgIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgcmV0dXJuIGNsdXN0ZXJfb3BzICogc2l6ZW9mKENvd09wZXJhdGlvbik7CisgICAgICAgIHJldHVybiBjbHVzdGVyX29wcyAqIHNpemVvZihDb3dPcGVyYXRpb25WMik7CiAgICAgfSBlbHNlIGlmIChjbHVzdGVyX29wcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBzaXplb2YoQ293T3BlcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihDb3dPcGVyYXRpb25WMik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQogCiBib29sIElzTWV0YWRhdGFPcChjb25zdCBDb3dPcGVyYXRpb24mIG9wKSB7Ci0gICAgc3dpdGNoIChvcC50eXBlKSB7CisgICAgc3dpdGNoIChvcC50eXBlKCkpIHsKICAgICAgICAgY2FzZSBrQ293TGFiZWxPcDoKICAgICAgICAgY2FzZSBrQ293Q2x1c3Rlck9wOgogICAgICAgICBjYXNlIGtDb3dGb290ZXJPcDoKQEAgLTk2LDcgKzE0MCw3IEBACiB9CiAKIGJvb2wgSXNPcmRlcmVkT3AoY29uc3QgQ293T3BlcmF0aW9uJiBvcCkgewotICAgIHN3aXRjaCAob3AudHlwZSkgeworICAgIHN3aXRjaCAob3AudHlwZSgpKSB7CiAgICAgICAgIGNhc2Uga0Nvd0NvcHlPcDoKICAgICAgICAgY2FzZSBrQ293WG9yT3A6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwNSw1ICsxNDksMzAgQEAKICAgICB9CiB9CiAKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dXcml0ZXIodWludDMyX3QgdmVyc2lvbiwgY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX2ZkJiYgZmQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvd1dyaXRlckJhc2U+IGJhc2U7CisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYmFzZSA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIHN0ZDo6bW92ZShmZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGJhc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYzPihvcHRpb25zLCBzdGQ6Om1vdmUoZmQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSB1bmtub3duIGNvdyB2ZXJzaW9uOiAiIDw8IHZlcnNpb247CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFiYXNlLT5Jbml0aWFsaXplKGxhYmVsKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGJhc2U7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dFc3RpbWF0b3IodWludDMyX3QgdmVyc2lvbiwgY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucykgeworICAgIHJldHVybiBDcmVhdGVDb3dXcml0ZXIodmVyc2lvbiwgb3B0aW9ucywgdW5pcXVlX2Zkey0xfSwgc3RkOjpudWxsb3B0KTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfcmVhZGVyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X3JlYWRlci5jcHAKaW5kZXggNDViZTE5MS4uMWI0YTk3MSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfcmVhZGVyLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19yZWFkZXIuY3BwCkBAIC0xNywyMyArMTcsNTMgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3JlYWRlci5oPgogI2luY2x1ZGUgPHpsaWIuaD4KIAogI2luY2x1ZGUgImNvd19kZWNvbXByZXNzLmgiCisjaW5jbHVkZSAicGFyc2VyX3YyLmgiCisjaW5jbHVkZSAicGFyc2VyX3YzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKK2Jvb2wgUmVhZENvd0hlYWRlcihhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgQ293SGVhZGVyVjMqIGhlYWRlcikgeworICAgIGlmIChsc2VlayhmZC5nZXQoKSwgMCwgU0VFS19TRVQpIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgaGVhZGVyIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZW1zZXQoaGVhZGVyLCAwLCBzaXplb2YoKmhlYWRlcikpOworCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkoZmQsICZoZWFkZXItPnByZWZpeCwgc2l6ZW9mKGhlYWRlci0+cHJlZml4KSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaGVhZGVyLT5wcmVmaXgubWFnaWMgIT0ga0Nvd01hZ2ljTnVtYmVyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkhlYWRlciBNYWdpYyBjb3JydXB0ZWQuIE1hZ2ljOiAiIDw8IGhlYWRlci0+cHJlZml4Lm1hZ2ljCisgICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGtDb3dNYWdpY051bWJlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaGVhZGVyLT5wcmVmaXguaGVhZGVyX3NpemUgPiBzaXplb2YoQ293SGVhZGVyVjMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gQ293SGVhZGVyIHNpemUgKGdvdCAiIDw8IGhlYWRlci0+cHJlZml4LmhlYWRlcl9zaXplCisgICAgICAgICAgICAgICAgICAgPDwgIiBieXRlcywgZXhwZWN0ZWQgYXQgbW9zdCAiIDw8IHNpemVvZihDb3dIZWFkZXJWMykgPDwgIiBieXRlcykiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGxzZWVrKGZkLmdldCgpLCAwLCBTRUVLX1NFVCkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBoZWFkZXIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGZkLCBoZWFkZXIsIGhlYWRlci0+cHJlZml4LmhlYWRlcl9zaXplKTsKK30KKwogQ293UmVhZGVyOjpDb3dSZWFkZXIoUmVhZGVyRmxhZ3MgcmVhZGVyX2ZsYWcsIGJvb2wgaXNfbWVyZ2UpCiAgICAgOiBmZF8oLTEpLAogICAgICAgaGVhZGVyXygpLApAQCAtNDIsMTUgKzcyLDYgQEAKICAgICAgIHJlYWRlcl9mbGFnXyhyZWFkZXJfZmxhZyksCiAgICAgICBpc19tZXJnZV8oaXNfbWVyZ2UpIHt9CiAKLXN0YXRpYyB2b2lkIFNIQTI1Nihjb25zdCB2b2lkKiwgc2l6ZV90LCB1aW50OF90W10pIHsKLSNpZiAwCi0gICAgU0hBMjU2X0NUWCBjOwotICAgIFNIQTI1Nl9Jbml0KCZjKTsKLSAgICBTSEEyNTZfVXBkYXRlKCZjLCBkYXRhLCBsZW5ndGgpOwotICAgIFNIQTI1Nl9GaW5hbChvdXQsICZjKTsKLSNlbmRpZgotfQotCiBzdGQ6OnVuaXF1ZV9wdHI8Q293UmVhZGVyPiBDb3dSZWFkZXI6OkNsb25lQ293UmVhZGVyKCkgewogICAgIGF1dG8gY293ID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dSZWFkZXI+KCk7CiAgICAgY293LT5vd25lZF9mZF8ucmVzZXQoKTsKQEAgLTYyLDggKzgzLDcgQEAKICAgICBjb3ctPm1lcmdlX29wX3N0YXJ0XyA9IG1lcmdlX29wX3N0YXJ0XzsKICAgICBjb3ctPm51bV90b3RhbF9kYXRhX29wc18gPSBudW1fdG90YWxfZGF0YV9vcHNfOwogICAgIGNvdy0+bnVtX29yZGVyZWRfb3BzX3RvX21lcmdlXyA9IG51bV9vcmRlcmVkX29wc190b19tZXJnZV87Ci0gICAgY293LT5oYXNfc2VxX29wc18gPSBoYXNfc2VxX29wc187Ci0gICAgY293LT5kYXRhX2xvY18gPSBkYXRhX2xvY187CisgICAgY293LT54b3JfZGF0YV9sb2NfID0geG9yX2RhdGFfbG9jXzsKICAgICBjb3ctPmJsb2NrX3Bvc19pbmRleF8gPSBibG9ja19wb3NfaW5kZXhfOwogICAgIGNvdy0+aXNfbWVyZ2VfID0gaXNfbWVyZ2VfOwogICAgIHJldHVybiBjb3c7CkBAIC04NCwxMSArMTA0LDE0IEBACiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBoZWFkZXIgZmFpbGVkIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShmZF8sICZoZWFkZXJfLCBzaXplb2YoaGVhZGVyXykpKSB7CisKKyAgICBDSEVDS19HRShoZWFkZXJfLnByZWZpeC5oZWFkZXJfc2l6ZSwgc2l6ZW9mKENvd0hlYWRlcikpOworICAgIENIRUNLX0xFKGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplLCBzaXplb2YoaGVhZGVyXykpOworCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkoZmRfLCAmaGVhZGVyXywgaGVhZGVyXy5wcmVmaXguaGVhZGVyX3NpemUpKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWFkIGhlYWRlciBmYWlsZWQiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTEwMCwyMTcgKzEyMyw0NCBAQAogYm9vbCBDb3dSZWFkZXI6OlBhcnNlKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgewogICAgIGZkXyA9IGZkOwogCi0gICAgYXV0byBwb3MgPSBsc2VlayhmZF8uZ2V0KCksIDAsIFNFRUtfRU5EKTsKLSAgICBpZiAocG9zIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgZW5kIGZhaWxlZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZmRfc2l6ZV8gPSBwb3M7Ci0KLSAgICBpZiAobHNlZWsoZmRfLmdldCgpLCAwLCBTRUVLX1NFVCkgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBoZWFkZXIgZmFpbGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShmZF8sICZoZWFkZXJfLCBzaXplb2YoaGVhZGVyXykpKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWFkIGhlYWRlciBmYWlsZWQiOworICAgIGlmICghUmVhZENvd0hlYWRlcihmZCwgJmhlYWRlcl8pKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoaGVhZGVyXy5tYWdpYyAhPSBrQ293TWFnaWNOdW1iZXIpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGVhZGVyIE1hZ2ljIGNvcnJ1cHRlZC4gTWFnaWM6ICIgPDwgaGVhZGVyXy5tYWdpYwotICAgICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBrQ293TWFnaWNOdW1iZXI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293UGFyc2VyQmFzZT4gcGFyc2VyOworICAgIHN3aXRjaCAoaGVhZGVyXy5wcmVmaXgubWFqb3JfdmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHBhcnNlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UGFyc2VyVjI+KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcGFyc2VyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dQYXJzZXJWMz4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biB2ZXJzaW9uOiAiIDw8IGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb247CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmIChoZWFkZXJfLmZvb3Rlcl9zaXplICE9IHNpemVvZihDb3dGb290ZXIpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZvb3RlciBzaXplIHVua25vd24sIHJlYWQgIiA8PCBoZWFkZXJfLmZvb3Rlcl9zaXplIDw8ICIsIGV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICA8PCBzaXplb2YoQ293Rm9vdGVyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoaGVhZGVyXy5vcF9zaXplICE9IHNpemVvZihDb3dPcGVyYXRpb24pKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIk9wZXJhdGlvbiBzaXplIHVua25vd24sIHJlYWQgIiA8PCBoZWFkZXJfLm9wX3NpemUgPDwgIiwgZXhwZWN0ZWQgIgotICAgICAgICAgICAgICAgICAgIDw8IHNpemVvZihDb3dPcGVyYXRpb24pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChoZWFkZXJfLmNsdXN0ZXJfb3BzID09IDEpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2x1c3RlcnMgbXVzdCBjb250YWluIGF0IGxlYXN0IHR3byBvcGVyYXRpb25zIHRvIGZ1bmN0aW9uLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGhlYWRlcl8ub3Bfc2l6ZSAhPSBzaXplb2YoQ293T3BlcmF0aW9uKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJPcGVyYXRpb24gc2l6ZSB1bmtub3duLCByZWFkICIgPDwgaGVhZGVyXy5vcF9zaXplIDw8ICIsIGV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICA8PCBzaXplb2YoQ293T3BlcmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoaGVhZGVyXy5jbHVzdGVyX29wcyA9PSAxKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNsdXN0ZXJzIG11c3QgY29udGFpbiBhdCBsZWFzdCB0d28gb3BlcmF0aW9ucyB0byBmdW5jdGlvbi4iOworICAgIGlmICghcGFyc2VyLT5QYXJzZShmZCwgaGVhZGVyXywgbGFiZWwpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoKGhlYWRlcl8ubWFqb3JfdmVyc2lvbiA+IGtDb3dWZXJzaW9uTWFqb3IpIHx8IChoZWFkZXJfLm1pbm9yX3ZlcnNpb24gIT0ga0Nvd1ZlcnNpb25NaW5vcikpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGVhZGVyIHZlcnNpb24gbWlzbWF0Y2giOwotICAgICAgICBMT0coRVJST1IpIDw8ICJNYWpvciB2ZXJzaW9uOiAiIDw8IGhlYWRlcl8ubWFqb3JfdmVyc2lvbgotICAgICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBrQ293VmVyc2lvbk1ham9yOwotICAgICAgICBMT0coRVJST1IpIDw8ICJNaW5vciB2ZXJzaW9uOiAiIDw8IGhlYWRlcl8ubWlub3JfdmVyc2lvbgotICAgICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBrQ293VmVyc2lvbk1pbm9yOworICAgIFRyYW5zbGF0ZWRDb3dPcHMgb3BzX2luZm87CisgICAgaWYgKCFwYXJzZXItPlRyYW5zbGF0ZSgmb3BzX2luZm8pKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIVBhcnNlT3BzKGxhYmVsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIGhlYWRlcl8gPSBvcHNfaW5mby5oZWFkZXI7CisgICAgb3BzXyA9IHN0ZDo6bW92ZShvcHNfaW5mby5vcHMpOworICAgIGZvb3Rlcl8gPSBwYXJzZXItPmZvb3RlcigpOworICAgIGZkX3NpemVfID0gcGFyc2VyLT5mZF9zaXplKCk7CisgICAgbGFzdF9sYWJlbF8gPSBwYXJzZXItPmxhc3RfbGFiZWwoKTsKKyAgICB4b3JfZGF0YV9sb2NfID0gcGFyc2VyLT54b3JfZGF0YV9sb2MoKTsKKwogICAgIC8vIElmIHdlJ3JlIHJlc3VtaW5nIGEgd3JpdGUsIHdlJ3JlIG5vdCByZWFkeSB0byBtZXJnZQogICAgIGlmIChsYWJlbC5oYXNfdmFsdWUoKSkgcmV0dXJuIHRydWU7CiAgICAgcmV0dXJuIFByZXBNZXJnZU9wcygpOwogfQogCi1ib29sIENvd1JlYWRlcjo6UGFyc2VPcHMoc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpIHsKLSAgICB1aW50NjRfdCBwb3M7Ci0gICAgYXV0byBkYXRhX2xvYyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4+KCk7Ci0KLSAgICAvLyBTa2lwIHRoZSBzY3JhdGNoIHNwYWNlCi0gICAgaWYgKGhlYWRlcl8ubWFqb3JfdmVyc2lvbiA+PSAyICYmIChoZWFkZXJfLmJ1ZmZlcl9zaXplID4gMCkpIHsKLSAgICAgICAgTE9HKERFQlVHKSA8PCAiIFNjcmF0Y2ggc3BhY2UgZm91bmQgb2Ygc2l6ZTogIiA8PCBoZWFkZXJfLmJ1ZmZlcl9zaXplOwotICAgICAgICBzaXplX3QgaW5pdF9vZmZzZXQgPSBoZWFkZXJfLmhlYWRlcl9zaXplICsgaGVhZGVyXy5idWZmZXJfc2l6ZTsKLSAgICAgICAgcG9zID0gbHNlZWsoZmRfLmdldCgpLCBpbml0X29mZnNldCwgU0VFS19TRVQpOwotICAgICAgICBpZiAocG9zICE9IGluaXRfb2Zmc2V0KSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgb3BzIGZhaWxlZCI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBwb3MgPSBsc2VlayhmZF8uZ2V0KCksIGhlYWRlcl8uaGVhZGVyX3NpemUsIFNFRUtfU0VUKTsKLSAgICAgICAgaWYgKHBvcyAhPSBoZWFkZXJfLmhlYWRlcl9zaXplKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgb3BzIGZhaWxlZCI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVhZGluZyBhIHYxIHZlcnNpb24gb2YgQ09XIHdoaWNoIGRvZXNuJ3QgaGF2ZSBidWZmZXJfc2l6ZS4KLSAgICAgICAgaGVhZGVyXy5idWZmZXJfc2l6ZSA9IDA7Ci0gICAgfQotICAgIHVpbnQ2NF90IGRhdGFfcG9zID0gMDsKLQotICAgIGlmIChoZWFkZXJfLmNsdXN0ZXJfb3BzKSB7Ci0gICAgICAgIGRhdGFfcG9zID0gcG9zICsgaGVhZGVyXy5jbHVzdGVyX29wcyAqIHNpemVvZihDb3dPcGVyYXRpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRhdGFfcG9zID0gcG9zICsgc2l6ZW9mKENvd09wZXJhdGlvbik7Ci0gICAgfQotCi0gICAgYXV0byBvcHNfYnVmZmVyID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb24+PigpOwotICAgIHVpbnQ2NF90IGN1cnJlbnRfb3BfbnVtID0gMDsKLSAgICB1aW50NjRfdCBjbHVzdGVyX29wcyA9IGhlYWRlcl8uY2x1c3Rlcl9vcHMgPzogMTsKLSAgICBib29sIGRvbmUgPSBmYWxzZTsKLQotICAgIC8vIEFsdGVybmF0aW5nIG9wIGNsdXN0ZXJzIGFuZCBkYXRhCi0gICAgd2hpbGUgKCFkb25lKSB7Ci0gICAgICAgIHVpbnQ2NF90IHRvX2FkZCA9IHN0ZDo6bWluKGNsdXN0ZXJfb3BzLCAoZmRfc2l6ZV8gLSBwb3MpIC8gc2l6ZW9mKENvd09wZXJhdGlvbikpOwotICAgICAgICBpZiAodG9fYWRkID09IDApIGJyZWFrOwotICAgICAgICBvcHNfYnVmZmVyLT5yZXNpemUoY3VycmVudF9vcF9udW0gKyB0b19hZGQpOwotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShmZF8sICZvcHNfYnVmZmVyLT5kYXRhKClbY3VycmVudF9vcF9udW1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19hZGQgKiBzaXplb2YoQ293T3BlcmF0aW9uKSkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWFkIG9wIGZhaWxlZCI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUGFyc2UgY3VycmVudCBjbHVzdGVyIHRvIGZpbmQgc3RhcnQgb2YgbmV4dCBjbHVzdGVyCi0gICAgICAgIHdoaWxlIChjdXJyZW50X29wX251bSA8IG9wc19idWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgYXV0byYgY3VycmVudF9vcCA9IG9wc19idWZmZXItPmRhdGEoKVtjdXJyZW50X29wX251bV07Ci0gICAgICAgICAgICBjdXJyZW50X29wX251bSsrOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293WG9yT3ApIHsKLSAgICAgICAgICAgICAgICBkYXRhX2xvYy0+aW5zZXJ0KHtjdXJyZW50X29wLm5ld19ibG9jaywgZGF0YV9wb3N9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyArPSBzaXplb2YoQ293T3BlcmF0aW9uKSArIEdldE5leHRPcE9mZnNldChjdXJyZW50X29wLCBoZWFkZXJfLmNsdXN0ZXJfb3BzKTsKLSAgICAgICAgICAgIGRhdGFfcG9zICs9IGN1cnJlbnRfb3AuZGF0YV9sZW5ndGggKyBHZXROZXh0RGF0YU9mZnNldChjdXJyZW50X29wLCBoZWFkZXJfLmNsdXN0ZXJfb3BzKTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293Q2x1c3Rlck9wKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293TGFiZWxPcCkgewotICAgICAgICAgICAgICAgIGxhc3RfbGFiZWxfID0ge2N1cnJlbnRfb3Auc291cmNlfTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoIHRoZSByZXF1ZXN0ZWQgbGFiZWwsIHN0b3AgcmVhZGluZy4KLSAgICAgICAgICAgICAgICBpZiAobGFiZWwgJiYgbGFiZWwudmFsdWUoKSA9PSBjdXJyZW50X29wLnNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X29wLnR5cGUgPT0ga0Nvd0Zvb3Rlck9wKSB7Ci0gICAgICAgICAgICAgICAgZm9vdGVyXy5lbXBsYWNlKCk7Ci0gICAgICAgICAgICAgICAgQ293Rm9vdGVyKiBmb290ZXIgPSAmZm9vdGVyXy52YWx1ZSgpOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZm9vdGVyXy0+b3AsICZjdXJyZW50X29wLCBzaXplb2YoZm9vdGVyLT5vcCkpOwotICAgICAgICAgICAgICAgIG9mZl90IG9mZnMgPSBsc2VlayhmZF8uZ2V0KCksIHBvcywgU0VFS19TRVQpOwotICAgICAgICAgICAgICAgIGlmIChvZmZzIDwgMCB8fCBwb3MgIT0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG9mZnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBuZXh0IG9wIGZhaWxlZCAiIDw8IG9mZnM7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkoZmRfLCAmZm9vdGVyLT5kYXRhLCBzaXplb2YoZm9vdGVyLT5kYXRhKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHJlYWQgQ09XIGZvb3RlciI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEcm9wIHRoZSBmb290ZXIgZnJvbSB0aGUgb3Agc3RyZWFtLgotICAgICAgICAgICAgICAgIGN1cnJlbnRfb3BfbnVtLS07Ci0gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293U2VxdWVuY2VPcCkgewotICAgICAgICAgICAgICAgIGhhc19zZXFfb3BzXyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQb3NpdGlvbiBmb3IgbmV4dCBjbHVzdGVyIHJlYWQKLSAgICAgICAgb2ZmX3Qgb2ZmcyA9IGxzZWVrKGZkXy5nZXQoKSwgcG9zLCBTRUVLX1NFVCk7Ci0gICAgICAgIGlmIChvZmZzIDwgMCB8fCBwb3MgIT0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG9mZnMpKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgbmV4dCBvcCBmYWlsZWQgIiA8PCBvZmZzOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG9wc19idWZmZXItPnJlc2l6ZShjdXJyZW50X29wX251bSk7Ci0gICAgfQotCi0gICAgTE9HKERFQlVHKSA8PCAiQ09XIGZpbGUgcmVhZCBjb21wbGV0ZS4gVG90YWwgb3BzOiAiIDw8IG9wc19idWZmZXItPnNpemUoKTsKLSAgICAvLyBUbyBzdWNjZXNzZnVsbHkgcGFyc2UgYSBDT1cgZmlsZSwgd2UgbmVlZCBlaXRoZXI6Ci0gICAgLy8gICgxKSBhIGxhYmVsIHRvIHJlYWQgdXAgdG8sIGFuZCBmb3IgdGhhdCBsYWJlbCB0byBiZSBmb3VuZCwgb3IKLSAgICAvLyAgKDIpIGEgdmFsaWQgZm9vdGVyLgotICAgIGlmIChsYWJlbCkgewotICAgICAgICBpZiAoIWxhc3RfbGFiZWxfKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJEaWQgbm90IGZpbmQgbGFiZWwgIiA8PCBsYWJlbC52YWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2hpbGUgcmVhZGluZyBDT1cgKG5vIGxhYmVscyBmb3VuZCkiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXN0X2xhYmVsXy52YWx1ZSgpICE9IGxhYmVsLnZhbHVlKCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkRpZCBub3QgZmluZCBsYWJlbCAiIDw8IGxhYmVsLnZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgbGFzdCBsYWJlbD0iIDw8IGxhc3RfbGFiZWxfLnZhbHVlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFmb290ZXJfKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIk5vIENPVyBmb290ZXIgZm91bmQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdWludDhfdCBjc3VtWzMyXTsKLSAgICBtZW1zZXQoY3N1bSwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogMzIpOwotCi0gICAgaWYgKGZvb3Rlcl8pIHsKLSAgICAgICAgaWYgKG9wc19idWZmZXItPnNpemUoKSAhPSBmb290ZXJfLT5vcC5udW1fb3BzKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJudW0gb3BzIGRvZXMgbm90IG1hdGNoLCBleHBlY3RlZCAiIDw8IGZvb3Rlcl8tPm9wLm51bV9vcHMgPDwgIiwgZm91bmQgIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBvcHNfYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wc19idWZmZXItPnNpemUoKSAqIHNpemVvZihDb3dPcGVyYXRpb24pICE9IGZvb3Rlcl8tPm9wLm9wc19zaXplKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJvcHMgc2l6ZSBkb2VzIG5vdCBtYXRjaCAiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFNIQTI1NigmZm9vdGVyXy0+b3AsIHNpemVvZihmb290ZXJfLT5vcCksIGZvb3Rlcl8tPmRhdGEuZm9vdGVyX2NoZWNrc3VtKTsKLSAgICAgICAgaWYgKG1lbWNtcChjc3VtLCBmb290ZXJfLT5kYXRhLm9wc19jaGVja3N1bSwgc2l6ZW9mKGNzdW0pKSAhPSAwKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJvcHMgY2hlY2tzdW0gZG9lcyBub3QgbWF0Y2giOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFNIQTI1NihvcHNfYnVmZmVyLT5kYXRhKCksIGZvb3Rlcl8tPm9wLm9wc19zaXplLCBjc3VtKTsKLSAgICAgICAgaWYgKG1lbWNtcChjc3VtLCBmb290ZXJfLT5kYXRhLm9wc19jaGVja3N1bSwgc2l6ZW9mKGNzdW0pKSAhPSAwKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJvcHMgY2hlY2tzdW0gZG9lcyBub3QgbWF0Y2giOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb3BzXyA9IG9wc19idWZmZXI7Ci0gICAgb3BzXy0+c2hyaW5rX3RvX2ZpdCgpOwotICAgIGRhdGFfbG9jXyA9IGRhdGFfbG9jOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIC8vCiAvLyBUaGlzIHNldHMgdXAgdGhlIGRhdGEgbmVlZGVkIGZvciBNZXJnZU9wSXRlci4gTWVyZ2VPcEl0ZXIgcHJlc2VudHMKIC8vIGRhdGEgaW4gdGhlIG9yZGVyIHdlIGludGVuZCB0byBtZXJnZSBpbi4KQEAgLTQxNiw1MSArMjY2LDMxIEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2Utb3AtNCwgWmVyby1vcC05LCBSZXBsYWNlLW9wLTUgfQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogYm9vbCBDb3dSZWFkZXI6OlByZXBNZXJnZU9wcygpIHsKLSAgICBhdXRvIG1lcmdlX29wX2Jsb2NrcyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjp2ZWN0b3I8dWludDMyX3Q+PigpOwogICAgIHN0ZDo6dmVjdG9yPGludD4gb3RoZXJfb3BzOwotICAgIGF1dG8gc2VxX29wc19zZXQgPSBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+KCk7Ci0gICAgYXV0byBibG9ja19tYXAgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgaW50Pj4oKTsKLSAgICBzaXplX3QgbnVtX3NlcXMgPSAwOwotICAgIHNpemVfdCByZWFkOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtZXJnZV9vcF9ibG9ja3M7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBpbnQ+IGJsb2NrX21hcDsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3BzXy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgYXV0byYgY3VycmVudF9vcCA9IG9wc18tPmRhdGEoKVtpXTsKLQotICAgICAgICBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dTZXF1ZW5jZU9wKSB7Ci0gICAgICAgICAgICBzaXplX3Qgc2VxX2xlbiA9IGN1cnJlbnRfb3AuZGF0YV9sZW5ndGggLyBzaXplb2YodWludDMyX3QpOwotCi0gICAgICAgICAgICBtZXJnZV9vcF9ibG9ja3MtPnJlc2l6ZShtZXJnZV9vcF9ibG9ja3MtPnNpemUoKSArIHNlcV9sZW4pOwotICAgICAgICAgICAgaWYgKCFHZXRSYXdCeXRlcyhjdXJyZW50X29wLnNvdXJjZSwgJm1lcmdlX29wX2Jsb2Nrcy0+ZGF0YSgpW251bV9zZXFzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9vcC5kYXRhX2xlbmd0aCwgJnJlYWQpKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIHNlcXVlbmNlIG9wISI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IG51bV9zZXFzOyBqIDwgbnVtX3NlcXMgKyBzZXFfbGVuOyBqKyspIHsKLSAgICAgICAgICAgICAgICBzZXFfb3BzX3NldC5pbnNlcnQobWVyZ2Vfb3BfYmxvY2tzLT5kYXRhKClbal0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtX3NlcXMgKz0gc2VxX2xlbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChJc01ldGFkYXRhT3AoY3VycmVudF9vcCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoYXNfc2VxX29wc18gJiYgSXNPcmRlcmVkT3AoY3VycmVudF9vcCkpIHsKLSAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy0+ZW1wbGFjZV9iYWNrKGN1cnJlbnRfb3AubmV3X2Jsb2NrKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXFfb3BzX3NldC5jb3VudChjdXJyZW50X29wLm5ld19ibG9jaykgPT0gMCkgewotICAgICAgICAgICAgb3RoZXJfb3BzLnB1c2hfYmFjayhjdXJyZW50X29wLm5ld19ibG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgYmxvY2tfbWFwLT5pbnNlcnQoe2N1cnJlbnRfb3AubmV3X2Jsb2NrLCBpfSk7CisgICAgc3dpdGNoIChoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgR2V0U2VxdWVuY2VEYXRhVjIoJm1lcmdlX29wX2Jsb2NrcywgJm90aGVyX29wcywgJmJsb2NrX21hcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgR2V0U2VxdWVuY2VEYXRhKCZtZXJnZV9vcF9ibG9ja3MsICZvdGhlcl9vcHMsICZibG9ja19tYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgZm9yIChhdXRvIGJsb2NrIDogKm1lcmdlX29wX2Jsb2NrcykgewotICAgICAgICBpZiAoYmxvY2tfbWFwLT5jb3VudChibG9jaykgPT0gMCkgeworCisgICAgZm9yIChhdXRvIGJsb2NrIDogbWVyZ2Vfb3BfYmxvY2tzKSB7CisgICAgICAgIGlmIChibG9ja19tYXAuY291bnQoYmxvY2spID09IDApIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2VxdWVuY2UgT3BzLiBDb3VsZCBub3QgZmluZCBDb3cgT3AgZm9yIG5ldyBibG9jayAiIDw8IGJsb2NrOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1lcmdlX29wX2Jsb2Nrcy0+c2l6ZSgpID4gaGVhZGVyXy5udW1fbWVyZ2Vfb3BzKSB7Ci0gICAgICAgIG51bV9vcmRlcmVkX29wc190b19tZXJnZV8gPSBtZXJnZV9vcF9ibG9ja3MtPnNpemUoKSAtIGhlYWRlcl8ubnVtX21lcmdlX29wczsKKyAgICBpZiAobWVyZ2Vfb3BfYmxvY2tzLnNpemUoKSA+IGhlYWRlcl8ubnVtX21lcmdlX29wcykgeworICAgICAgICBudW1fb3JkZXJlZF9vcHNfdG9fbWVyZ2VfID0gbWVyZ2Vfb3BfYmxvY2tzLnNpemUoKSAtIGhlYWRlcl8ubnVtX21lcmdlX29wczsKICAgICB9IGVsc2UgewogICAgICAgICBudW1fb3JkZXJlZF9vcHNfdG9fbWVyZ2VfID0gMDsKICAgICB9CkBAIC00NzYsOSArMzA2LDkgQEAKICAgICAgICAgc3RkOjpzb3J0KG90aGVyX29wcy5iZWdpbigpLCBvdGhlcl9vcHMuZW5kKCksIHN0ZDo6Z3JlYXRlcjxpbnQ+KCkpOwogICAgIH0KIAotICAgIG1lcmdlX29wX2Jsb2Nrcy0+aW5zZXJ0KG1lcmdlX29wX2Jsb2Nrcy0+ZW5kKCksIG90aGVyX29wcy5iZWdpbigpLCBvdGhlcl9vcHMuZW5kKCkpOworICAgIG1lcmdlX29wX2Jsb2Nrcy5pbnNlcnQobWVyZ2Vfb3BfYmxvY2tzLmVuZCgpLCBvdGhlcl9vcHMuYmVnaW4oKSwgb3RoZXJfb3BzLmVuZCgpKTsKIAotICAgIG51bV90b3RhbF9kYXRhX29wc18gPSBtZXJnZV9vcF9ibG9ja3MtPnNpemUoKTsKKyAgICBudW1fdG90YWxfZGF0YV9vcHNfID0gbWVyZ2Vfb3BfYmxvY2tzLnNpemUoKTsKICAgICBpZiAoaGVhZGVyXy5udW1fbWVyZ2Vfb3BzID4gMCkgewogICAgICAgICBtZXJnZV9vcF9zdGFydF8gPSBoZWFkZXJfLm51bV9tZXJnZV9vcHM7CiAgICAgfQpAQCAtNDg4LDY3ICszMTgsMTUzIEBACiAgICAgICAgIC8vIHRoZSBvcHMgdmVjdG9yIGFzIHJlcXVpcmVkIGZvciBtZXJnZSBvcGVyYXRpb25zLgogICAgICAgICBhdXRvIG1lcmdlX29wc19idWZmZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvbj4+KCk7CiAgICAgICAgIG1lcmdlX29wc19idWZmZXItPnJlc2VydmUobnVtX3RvdGFsX2RhdGFfb3BzXyk7Ci0gICAgICAgIGZvciAoYXV0byBibG9jayA6ICptZXJnZV9vcF9ibG9ja3MpIHsKLSAgICAgICAgICAgIG1lcmdlX29wc19idWZmZXItPmVtcGxhY2VfYmFjayhvcHNfLT5kYXRhKClbYmxvY2tfbWFwLT5hdChibG9jayldKTsKKyAgICAgICAgZm9yIChhdXRvIGJsb2NrIDogbWVyZ2Vfb3BfYmxvY2tzKSB7CisgICAgICAgICAgICBtZXJnZV9vcHNfYnVmZmVyLT5lbXBsYWNlX2JhY2sob3BzXy0+ZGF0YSgpW2Jsb2NrX21hcC5hdChibG9jayldKTsKICAgICAgICAgfQogICAgICAgICBvcHNfLT5jbGVhcigpOwogICAgICAgICBvcHNfID0gbWVyZ2Vfb3BzX2J1ZmZlcjsKICAgICAgICAgb3BzXy0+c2hyaW5rX3RvX2ZpdCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoYXV0byBibG9jayA6ICptZXJnZV9vcF9ibG9ja3MpIHsKLSAgICAgICAgICAgIGJsb2NrX3Bvc19pbmRleF8tPnB1c2hfYmFjayhibG9ja19tYXAtPmF0KGJsb2NrKSk7CisgICAgICAgIGZvciAoYXV0byBibG9jayA6IG1lcmdlX29wX2Jsb2NrcykgeworICAgICAgICAgICAgYmxvY2tfcG9zX2luZGV4Xy0+cHVzaF9iYWNrKGJsb2NrX21hcC5hdChibG9jaykpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgYmxvY2tfbWFwLT5jbGVhcigpOwotICAgIG1lcmdlX29wX2Jsb2Nrcy0+Y2xlYXIoKTsKKyAgICBibG9ja19tYXAuY2xlYXIoKTsKKyAgICBtZXJnZV9vcF9ibG9ja3MuY2xlYXIoKTsKIAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIENvd1JlYWRlcjo6R2V0U2VxdWVuY2VEYXRhVjIoc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBtZXJnZV9vcF9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50Piogb3RoZXJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgaW50PiogYmxvY2tfbWFwKSB7CisgICAgYXV0byBzZXFfb3BzX3NldCA9IHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4oKTsKKyAgICBzaXplX3QgbnVtX3NlcXMgPSAwOworICAgIHNpemVfdCByZWFkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3BzXy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXV0byYgY3VycmVudF9vcCA9IG9wc18tPmRhdGEoKVtpXTsKKworICAgICAgICBpZiAoY3VycmVudF9vcC50eXBlKCkgPT0ga0Nvd1NlcXVlbmNlT3ApIHsKKyAgICAgICAgICAgIHNpemVfdCBzZXFfbGVuID0gY3VycmVudF9vcC5kYXRhX2xlbmd0aCAvIHNpemVvZih1aW50MzJfdCk7CisKKyAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy0+cmVzaXplKG1lcmdlX29wX2Jsb2Nrcy0+c2l6ZSgpICsgc2VxX2xlbik7CisgICAgICAgICAgICBpZiAoIUdldFJhd0J5dGVzKCZjdXJyZW50X29wLCAmbWVyZ2Vfb3BfYmxvY2tzLT5kYXRhKClbbnVtX3NlcXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X29wLmRhdGFfbGVuZ3RoLCAmcmVhZCkpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgc2VxdWVuY2Ugb3AhIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gbnVtX3NlcXM7IGogPCBudW1fc2VxcyArIHNlcV9sZW47IGorKykgeworICAgICAgICAgICAgICAgIHNlcV9vcHNfc2V0Lmluc2VydChtZXJnZV9vcF9ibG9ja3MtPmF0KGopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bV9zZXFzICs9IHNlcV9sZW47CisgICAgICAgIH0KKworICAgICAgICBpZiAoSXNNZXRhZGF0YU9wKGN1cnJlbnRfb3ApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlcXVlbmNlIG9wcyBtdXN0IGJlIHRoZSBmaXJzdCBvcHMgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAgaWYgKHNlcV9vcHNfc2V0LmVtcHR5KCkgJiYgSXNPcmRlcmVkT3AoY3VycmVudF9vcCkpIHsKKyAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy0+ZW1wbGFjZV9iYWNrKGN1cnJlbnRfb3AubmV3X2Jsb2NrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZXFfb3BzX3NldC5jb3VudChjdXJyZW50X29wLm5ld19ibG9jaykgPT0gMCkgeworICAgICAgICAgICAgb3RoZXJfb3BzLT5wdXNoX2JhY2soY3VycmVudF9vcC5uZXdfYmxvY2spOworICAgICAgICB9CisgICAgICAgIGJsb2NrX21hcC0+aW5zZXJ0KHtjdXJyZW50X29wLm5ld19ibG9jaywgaX0pOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ293UmVhZGVyOjpHZXRTZXF1ZW5jZURhdGEoc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBtZXJnZV9vcF9ibG9ja3MsIHN0ZDo6dmVjdG9yPGludD4qIG90aGVyX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBpbnQ+KiBibG9ja19tYXApIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHNlcV9vcHNfc2V0OworICAgIC8vIHJlYWQgc2VxdWVuY2Ugb3BzIGRhdGEKKyAgICBtZXJnZV9vcF9ibG9ja3MtPnJlc2l6ZShoZWFkZXJfLnNlcXVlbmNlX2RhdGFfY291bnQpOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoCisgICAgICAgICAgICAgICAgZmRfLCBtZXJnZV9vcF9ibG9ja3MtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICBoZWFkZXJfLnNlcXVlbmNlX2RhdGFfY291bnQgKiBzaXplb2YobWVyZ2Vfb3BfYmxvY2tzLT5hdCgwKSksCisgICAgICAgICAgICAgICAgR2V0U2VxdWVuY2VPZmZzZXQoaGVhZGVyXykpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gcmVhZCBzZXF1ZW5jZSBidWZmZXIuIHNlcV9kYXRhX2NvdW50OiAiCisgICAgICAgICAgICAgICAgICAgIDw8IGhlYWRlcl8uc2VxdWVuY2VfZGF0YV9jb3VudCA8PCAiIGF0IG9mZnNldDogIiA8PCBHZXRTZXF1ZW5jZU9mZnNldChoZWFkZXJfKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzZXFfb3BzX3NldC5yZXNlcnZlKG1lcmdlX29wX2Jsb2Nrcy0+c2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8mIGkgOiAqbWVyZ2Vfb3BfYmxvY2tzKSB7CisgICAgICAgIHNlcV9vcHNfc2V0Lmluc2VydChpKTsKKyAgICB9CisgICAgLy8gcmVhZCBvcmRlcmVkIG9wIGRhdGEKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wc18tPnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1dG8mIGN1cnJlbnRfb3AgPSBvcHNfLT5kYXRhKClbaV07CisgICAgICAgIC8vIFNlcXVlbmNlIG9wcyBtdXN0IGJlIHRoZSBmaXJzdCBvcHMgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAgaWYgKHNlcV9vcHNfc2V0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy0+ZW1wbGFjZV9iYWNrKGN1cnJlbnRfb3AubmV3X2Jsb2NrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZXFfb3BzX3NldC5jb3VudChjdXJyZW50X29wLm5ld19ibG9jaykgPT0gMCkgeworICAgICAgICAgICAgb3RoZXJfb3BzLT5wdXNoX2JhY2soY3VycmVudF9vcC5uZXdfYmxvY2spOworICAgICAgICB9CisgICAgICAgIGJsb2NrX21hcC0+aW5zZXJ0KHtjdXJyZW50X29wLm5ld19ibG9jaywgaX0pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBDb3dSZWFkZXI6OlZlcmlmeU1lcmdlT3BzKCkgewogICAgIGF1dG8gaXRyID0gR2V0TWVyZ2VPcEl0ZXIodHJ1ZSk7Ci0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBDb3dPcGVyYXRpb24+IG92ZXJ3cml0dGVuX2Jsb2NrczsKLSAgICB3aGlsZSAoIWl0ci0+RG9uZSgpKSB7Ci0gICAgICAgIENvd09wZXJhdGlvbiBvcCA9IGl0ci0+R2V0KCk7Ci0gICAgICAgIHVpbnQ2NF90IGJsb2NrOwotICAgICAgICBib29sIG9mZnNldDsKLSAgICAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd0NvcHlPcCkgewotICAgICAgICAgICAgYmxvY2sgPSBvcC5zb3VyY2U7Ci0gICAgICAgICAgICBvZmZzZXQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dYb3JPcCkgewotICAgICAgICAgICAgYmxvY2sgPSBvcC5zb3VyY2UgLyBCTE9DS19TWjsKLSAgICAgICAgICAgIG9mZnNldCA9IChvcC5zb3VyY2UgJSBCTE9DS19TWikgIT0gMDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIGNvbnN0IENvd09wZXJhdGlvbio+IG92ZXJ3cml0dGVuX2Jsb2NrczsKKyAgICBib29sIG5vbl9vcmRlcmVkX29wX2ZvdW5kID0gZmFsc2U7CisKKyAgICB3aGlsZSAoIWl0ci0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ci0+R2V0KCk7CisgICAgICAgIHVpbnQ2NF90IG9mZnNldDsKKworICAgICAgICAvLyBPcCBzaG91bGQgbm90IGJlIGEgbWV0YWRhdGEKKyAgICAgICAgaWYgKElzTWV0YWRhdGFPcCgqb3ApKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNZXRhZGF0YSBvcDogIiA8PCBvcCA8PCAiIGZvdW5kIGR1cmluZyBtZXJnZSBzZXF1ZW5jZSI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXF1ZW5jZSBvcHMgc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBvcmRlcmVkIG9wcyBmb2xsb3dlZAorICAgICAgICAvLyBieSBSZXBsYWNlIGFuZCBaZXJvIG9wcy4gSWYgd2UgZmluZCB0aGUgZmlyc3Qgb3Agd2hpY2gKKyAgICAgICAgLy8gaXMgbm90IG9yZGVyZWQsIHRoYXQgbWVhbnMgYWxsIG9yZGVyZWQgb3BzIHByb2Nlc3NpbmcKKyAgICAgICAgLy8gaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAgICBpZiAoIUlzT3JkZXJlZE9wKCpvcCkpIHsKKyAgICAgICAgICAgIG5vbl9vcmRlcmVkX29wX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNpbmNlLCBhbGwgb3JkZXJlZCBvcHMgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQsCisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIHN1YnNlcXVlbnQgb3BzIGFyZSBub3Qgb3JkZXJlZC4KKyAgICAgICAgaWYgKG5vbl9vcmRlcmVkX29wX2ZvdW5kICYmIElzT3JkZXJlZE9wKCpvcCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgc2VxdWVuY2UgLSBub24tb3JkZXJlZCBhbmQgb3JkZXJlZCBvcHMiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY2Fubm90IGJlIG1peGVkIGR1cmluZyBzZXF1ZW5jZSBnZW5lcmF0aW9uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR2V0U291cmNlT2Zmc2V0KG9wLCAmb2Zmc2V0KSkgewogICAgICAgICAgICAgaXRyLT5OZXh0KCk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIENvd09wZXJhdGlvbiogb3ZlcndyaXRlID0gbnVsbHB0cjsKKyAgICAgICAgdWludDY0X3QgYmxvY2sgPSBHZXRCbG9ja0Zyb21PZmZzZXQoaGVhZGVyXywgb2Zmc2V0KTsKKyAgICAgICAgYm9vbCBtaXNhbGlnbmVkID0gKEdldEJsb2NrUmVsYXRpdmVPZmZzZXQoaGVhZGVyXywgb2Zmc2V0KSAhPSAwKTsKKworICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIG92ZXJ3cml0ZSA9IG51bGxwdHI7CiAgICAgICAgIGlmIChvdmVyd3JpdHRlbl9ibG9ja3MuY291bnQoYmxvY2spKSB7Ci0gICAgICAgICAgICBvdmVyd3JpdGUgPSAmb3ZlcndyaXR0ZW5fYmxvY2tzW2Jsb2NrXTsKKyAgICAgICAgICAgIG92ZXJ3cml0ZSA9IG92ZXJ3cml0dGVuX2Jsb2Nrc1tibG9ja107CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFNlcXVlbmNlISBCbG9jayBuZWVkZWQgZm9yIG9wOlxuIgogICAgICAgICAgICAgICAgICAgICAgICA8PCBvcCA8PCAiXG5vdmVyd3JpdHRlbiBieSBwcmV2aW91c2x5IG1lcmdlZCBvcDpcbiIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgKm92ZXJ3cml0ZTsKICAgICAgICAgfQotICAgICAgICBpZiAob2Zmc2V0ICYmIG92ZXJ3cml0dGVuX2Jsb2Nrcy5jb3VudChibG9jayArIDEpKSB7Ci0gICAgICAgICAgICBvdmVyd3JpdGUgPSAmb3ZlcndyaXR0ZW5fYmxvY2tzW2Jsb2NrICsgMV07CisgICAgICAgIGlmIChtaXNhbGlnbmVkICYmIG92ZXJ3cml0dGVuX2Jsb2Nrcy5jb3VudChibG9jayArIDEpKSB7CisgICAgICAgICAgICBvdmVyd3JpdGUgPSBvdmVyd3JpdHRlbl9ibG9ja3NbYmxvY2sgKyAxXTsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2VxdWVuY2UhIEJsb2NrIG5lZWRlZCBmb3Igb3A6XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIDw8IG9wIDw8ICJcbm92ZXJ3cml0dGVuIGJ5IHByZXZpb3VzbHkgbWVyZ2VkIG9wOlxuIgogICAgICAgICAgICAgICAgICAgICAgICA8PCAqb3ZlcndyaXRlOwogICAgICAgICB9CiAgICAgICAgIGlmIChvdmVyd3JpdGUgIT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICAgICAgICBvdmVyd3JpdHRlbl9ibG9ja3Nbb3AubmV3X2Jsb2NrXSA9IG9wOworICAgICAgICBvdmVyd3JpdHRlbl9ibG9ja3Nbb3AtPm5ld19ibG9ja10gPSBvcDsKICAgICAgICAgaXRyLT5OZXh0KCk7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1JlYWRlcjo6R2V0SGVhZGVyKENvd0hlYWRlciogaGVhZGVyKSB7Ci0gICAgKmhlYWRlciA9IGhlYWRlcl87Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIGJvb2wgQ293UmVhZGVyOjpHZXRGb290ZXIoQ293Rm9vdGVyKiBmb290ZXIpIHsKICAgICBpZiAoIWZvb3Rlcl8pIHJldHVybiBmYWxzZTsKICAgICAqZm9vdGVyID0gZm9vdGVyXy52YWx1ZSgpOwpAQCAtNTY1LDEyICs0ODEsMTIgQEAKICAgcHVibGljOgogICAgIENvd09wSXRlcihzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uPj4mIG9wcywgdWludDY0X3Qgc3RhcnQpOwogCi0gICAgYm9vbCBEb25lKCkgb3ZlcnJpZGU7Ci0gICAgY29uc3QgQ293T3BlcmF0aW9uJiBHZXQoKSBvdmVycmlkZTsKKyAgICBib29sIEF0RW5kKCkgb3ZlcnJpZGU7CisgICAgY29uc3QgQ293T3BlcmF0aW9uKiBHZXQoKSBvdmVycmlkZTsKICAgICB2b2lkIE5leHQoKSBvdmVycmlkZTsKIAogICAgIHZvaWQgUHJldigpIG92ZXJyaWRlOwotICAgIGJvb2wgUkRvbmUoKSBvdmVycmlkZTsKKyAgICBib29sIEF0QmVnaW4oKSBvdmVycmlkZTsKIAogICBwcml2YXRlOgogICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb24+PiBvcHNfOwpAQCAtNTgyLDI3ICs0OTgsMjcgQEAKICAgICBvcF9pdGVyXyA9IG9wc18tPmJlZ2luKCkgKyBzdGFydDsKIH0KIAotYm9vbCBDb3dPcEl0ZXI6OlJEb25lKCkgeworYm9vbCBDb3dPcEl0ZXI6OkF0QmVnaW4oKSB7CiAgICAgcmV0dXJuIG9wX2l0ZXJfID09IG9wc18tPmJlZ2luKCk7CiB9CiAKIHZvaWQgQ293T3BJdGVyOjpQcmV2KCkgewotICAgIENIRUNLKCFSRG9uZSgpKTsKKyAgICBDSEVDSyghQXRCZWdpbigpKTsKICAgICBvcF9pdGVyXy0tOwogfQogCi1ib29sIENvd09wSXRlcjo6RG9uZSgpIHsKK2Jvb2wgQ293T3BJdGVyOjpBdEVuZCgpIHsKICAgICByZXR1cm4gb3BfaXRlcl8gPT0gb3BzXy0+ZW5kKCk7CiB9CiAKIHZvaWQgQ293T3BJdGVyOjpOZXh0KCkgewotICAgIENIRUNLKCFEb25lKCkpOworICAgIENIRUNLKCFBdEVuZCgpKTsKICAgICBvcF9pdGVyXysrOwogfQogCi1jb25zdCBDb3dPcGVyYXRpb24mIENvd09wSXRlcjo6R2V0KCkgewotICAgIENIRUNLKCFEb25lKCkpOwotICAgIHJldHVybiAoKm9wX2l0ZXJfKTsKK2NvbnN0IENvd09wZXJhdGlvbiogQ293T3BJdGVyOjpHZXQoKSB7CisgICAgQ0hFQ0soIUF0RW5kKCkpOworICAgIHJldHVybiAmKCpvcF9pdGVyXyk7CiB9CiAKIGNsYXNzIENvd1Jldk1lcmdlT3BJdGVyIGZpbmFsIDogcHVibGljIElDb3dPcEl0ZXIgewpAQCAtNjEwLDEyICs1MjYsMTIgQEAKICAgICBleHBsaWNpdCBDb3dSZXZNZXJnZU9wSXRlcihzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uPj4gb3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxpbnQ+PiBibG9ja19wb3NfaW5kZXgsIHVpbnQ2NF90IHN0YXJ0KTsKIAotICAgIGJvb2wgRG9uZSgpIG92ZXJyaWRlOwotICAgIGNvbnN0IENvd09wZXJhdGlvbiYgR2V0KCkgb3ZlcnJpZGU7CisgICAgYm9vbCBBdEVuZCgpIG92ZXJyaWRlOworICAgIGNvbnN0IENvd09wZXJhdGlvbiogR2V0KCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBOZXh0KCkgb3ZlcnJpZGU7CiAKICAgICB2b2lkIFByZXYoKSBvdmVycmlkZTsKLSAgICBib29sIFJEb25lKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBBdEJlZ2luKCkgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKICAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uPj4gb3BzXzsKQEAgLTYyOSwxMiArNTQ1LDEyIEBACiAgICAgZXhwbGljaXQgQ293TWVyZ2VPcEl0ZXIoc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvbj4+IG9wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8aW50Pj4gYmxvY2tfcG9zX2luZGV4LCB1aW50NjRfdCBzdGFydCk7CiAKLSAgICBib29sIERvbmUoKSBvdmVycmlkZTsKLSAgICBjb25zdCBDb3dPcGVyYXRpb24mIEdldCgpIG92ZXJyaWRlOworICAgIGJvb2wgQXRFbmQoKSBvdmVycmlkZTsKKyAgICBjb25zdCBDb3dPcGVyYXRpb24qIEdldCgpIG92ZXJyaWRlOwogICAgIHZvaWQgTmV4dCgpIG92ZXJyaWRlOwogCiAgICAgdm9pZCBQcmV2KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBSRG9uZSgpIG92ZXJyaWRlOworICAgIGJvb2wgQXRCZWdpbigpIG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvbj4+IG9wc187CkBAIC02NTEsMjcgKzU2NywyNyBAQAogICAgIGJsb2NrX2l0ZXJfID0gY293X29wX2luZGV4X3ZlY18tPmJlZ2luKCkgKyBzdGFydDsKIH0KIAotYm9vbCBDb3dNZXJnZU9wSXRlcjo6UkRvbmUoKSB7Citib29sIENvd01lcmdlT3BJdGVyOjpBdEJlZ2luKCkgewogICAgIHJldHVybiBibG9ja19pdGVyXyA9PSBjb3dfb3BfaW5kZXhfdmVjXy0+YmVnaW4oKTsKIH0KIAogdm9pZCBDb3dNZXJnZU9wSXRlcjo6UHJldigpIHsKLSAgICBDSEVDSyghUkRvbmUoKSk7CisgICAgQ0hFQ0soIUF0QmVnaW4oKSk7CiAgICAgYmxvY2tfaXRlcl8tLTsKIH0KIAotYm9vbCBDb3dNZXJnZU9wSXRlcjo6RG9uZSgpIHsKK2Jvb2wgQ293TWVyZ2VPcEl0ZXI6OkF0RW5kKCkgewogICAgIHJldHVybiBibG9ja19pdGVyXyA9PSBjb3dfb3BfaW5kZXhfdmVjXy0+ZW5kKCk7CiB9CiAKIHZvaWQgQ293TWVyZ2VPcEl0ZXI6Ok5leHQoKSB7Ci0gICAgQ0hFQ0soIURvbmUoKSk7CisgICAgQ0hFQ0soIUF0RW5kKCkpOwogICAgIGJsb2NrX2l0ZXJfKys7CiB9CiAKLWNvbnN0IENvd09wZXJhdGlvbiYgQ293TWVyZ2VPcEl0ZXI6OkdldCgpIHsKLSAgICBDSEVDSyghRG9uZSgpKTsKLSAgICByZXR1cm4gb3BzXy0+ZGF0YSgpWypibG9ja19pdGVyX107Citjb25zdCBDb3dPcGVyYXRpb24qIENvd01lcmdlT3BJdGVyOjpHZXQoKSB7CisgICAgQ0hFQ0soIUF0RW5kKCkpOworICAgIHJldHVybiAmb3BzXy0+ZGF0YSgpWypibG9ja19pdGVyX107CiB9CiAKIENvd1Jldk1lcmdlT3BJdGVyOjpDb3dSZXZNZXJnZU9wSXRlcihzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uPj4gb3BzLApAQCAtNjgzLDI3ICs1OTksMjcgQEAKICAgICBibG9ja19yaXRlcl8gPSBjb3dfb3BfaW5kZXhfdmVjXy0+cmJlZ2luKCk7CiB9CiAKLWJvb2wgQ293UmV2TWVyZ2VPcEl0ZXI6OlJEb25lKCkgeworYm9vbCBDb3dSZXZNZXJnZU9wSXRlcjo6QXRCZWdpbigpIHsKICAgICByZXR1cm4gYmxvY2tfcml0ZXJfID09IGNvd19vcF9pbmRleF92ZWNfLT5yYmVnaW4oKTsKIH0KIAogdm9pZCBDb3dSZXZNZXJnZU9wSXRlcjo6UHJldigpIHsKLSAgICBDSEVDSyghUkRvbmUoKSk7CisgICAgQ0hFQ0soIUF0QmVnaW4oKSk7CiAgICAgYmxvY2tfcml0ZXJfLS07CiB9CiAKLWJvb2wgQ293UmV2TWVyZ2VPcEl0ZXI6OkRvbmUoKSB7Citib29sIENvd1Jldk1lcmdlT3BJdGVyOjpBdEVuZCgpIHsKICAgICByZXR1cm4gYmxvY2tfcml0ZXJfID09IGNvd19vcF9pbmRleF92ZWNfLT5yZW5kKCkgLSBzdGFydF87CiB9CiAKIHZvaWQgQ293UmV2TWVyZ2VPcEl0ZXI6Ok5leHQoKSB7Ci0gICAgQ0hFQ0soIURvbmUoKSk7CisgICAgQ0hFQ0soIUF0RW5kKCkpOwogICAgIGJsb2NrX3JpdGVyXysrOwogfQogCi1jb25zdCBDb3dPcGVyYXRpb24mIENvd1Jldk1lcmdlT3BJdGVyOjpHZXQoKSB7Ci0gICAgQ0hFQ0soIURvbmUoKSk7Ci0gICAgcmV0dXJuIG9wc18tPmRhdGEoKVsqYmxvY2tfcml0ZXJfXTsKK2NvbnN0IENvd09wZXJhdGlvbiogQ293UmV2TWVyZ2VPcEl0ZXI6OkdldCgpIHsKKyAgICBDSEVDSyghQXRFbmQoKSk7CisgICAgcmV0dXJuICZvcHNfLT5kYXRhKClbKmJsb2NrX3JpdGVyX107CiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBDb3dSZWFkZXI6OkdldE9wSXRlcihib29sIG1lcmdlX3Byb2dyZXNzKSB7CkBAIC03MjAsMTAgKzYzNiwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfcHJvZ3Jlc3MgPyAwIDogbWVyZ2Vfb3Bfc3RhcnRfKTsKIH0KIAorYm9vbCBDb3dSZWFkZXI6OkdldFJhd0J5dGVzKGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbiwgc2l6ZV90KiByZWFkKSB7CisgICAgc3dpdGNoIChvcC0+dHlwZSgpKSB7CisgICAgICAgIGNhc2Uga0Nvd1NlcXVlbmNlT3A6CisgICAgICAgIGNhc2Uga0Nvd1JlcGxhY2VPcDoKKyAgICAgICAgY2FzZSBrQ293WG9yT3A6CisgICAgICAgICAgICByZXR1cm4gR2V0UmF3Qnl0ZXMob3AtPnNvdXJjZSgpLCBidWZmZXIsIGxlbiwgcmVhZCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZ2V0IHJhdyBieXRlcyBvZiBub24tZGF0YSBvcDogIiA8PCAqb3A7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCiBib29sIENvd1JlYWRlcjo6R2V0UmF3Qnl0ZXModWludDY0X3Qgb2Zmc2V0LCB2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4sIHNpemVfdCogcmVhZCkgewogICAgIC8vIFZhbGlkYXRlIHRoZSBvZmZzZXQsIHRha2luZyBjYXJlIHRvIGFja25vd2xlZGdlIHBvc3NpYmxlIG92ZXJmbG93IG9mIG9mZnNldCtsZW4uCi0gICAgaWYgKG9mZnNldCA8IGhlYWRlcl8uaGVhZGVyX3NpemUgfHwgb2Zmc2V0ID49IGZkX3NpemVfIC0gc2l6ZW9mKENvd0Zvb3RlcikgfHwgbGVuID49IGZkX3NpemVfIHx8Ci0gICAgICAgIG9mZnNldCArIGxlbiA+IGZkX3NpemVfIC0gc2l6ZW9mKENvd0Zvb3RlcikpIHsKKyAgICBpZiAob2Zmc2V0IDwgaGVhZGVyXy5wcmVmaXguaGVhZGVyX3NpemUgfHwgb2Zmc2V0ID49IGZkX3NpemVfIHx8IG9mZnNldCArIGxlbiA+IGZkX3NpemVfIHx8CisgICAgICAgIGxlbiA+PSBmZF9zaXplXykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJpbnZhbGlkIGRhdGEgb2Zmc2V0OiAiIDw8IG9mZnNldCA8PCAiLCAiIDw8IGxlbiA8PCAiIGJ5dGVzIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTc0NywxOCArNjc1LDE4IEBACiAgICAgICAgIHJlbWFpbmluZ18gPSBkYXRhX2xlbmd0aF87CiAgICAgfQogCi0gICAgYm9vbCBSZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgc2l6ZV90KiByZWFkKSBvdmVycmlkZSB7CisgICAgc3NpemVfdCBSZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUgewogICAgICAgICBzaXplX3QgdG9fcmVhZCA9IHN0ZDo6bWluKGxlbmd0aCwgcmVtYWluaW5nXyk7CiAgICAgICAgIGlmICghdG9fcmVhZCkgewotICAgICAgICAgICAgKnJlYWQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBpZiAoIXJlYWRlcl8tPkdldFJhd0J5dGVzKG9mZnNldF8sIGJ1ZmZlciwgdG9fcmVhZCwgcmVhZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc2l6ZV90IHJlYWQ7CisgICAgICAgIGlmICghcmVhZGVyXy0+R2V0UmF3Qnl0ZXMob2Zmc2V0XywgYnVmZmVyLCB0b19yZWFkLCAmcmVhZCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBvZmZzZXRfICs9ICpyZWFkOwotICAgICAgICByZW1haW5pbmdfIC09ICpyZWFkOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgb2Zmc2V0XyArPSByZWFkOworICAgICAgICByZW1haW5pbmdfIC09IHJlYWQ7CisgICAgICAgIHJldHVybiByZWFkOwogICAgIH0KIAogICAgIHNpemVfdCBTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZGF0YV9sZW5ndGhfOyB9CkBAIC03NzAsMTEgKzY5OCwxNSBAQAogICAgIHNpemVfdCByZW1haW5pbmdfOwogfTsKIAotYm9vbCBDb3dSZWFkZXI6OlJlYWREYXRhKGNvbnN0IENvd09wZXJhdGlvbiYgb3AsIElCeXRlU2luayogc2luaykgewordWludDhfdCBDb3dSZWFkZXI6OkdldENvbXByZXNzaW9uVHlwZSgpIHsKKyAgICByZXR1cm4gaGVhZGVyXy5jb21wcmVzc2lvbl9hbGdvcml0aG07Cit9CisKK3NzaXplX3QgQ293UmVhZGVyOjpSZWFkRGF0YShjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWdub3JlX2J5dGVzKSB7CiAgICAgc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IGRlY29tcHJlc3NvcjsKLSAgICBzd2l0Y2ggKG9wLmNvbXByZXNzaW9uKSB7CisgICAgc3dpdGNoIChHZXRDb21wcmVzc2lvblR5cGUoKSkgewogICAgICAgICBjYXNlIGtDb3dDb21wcmVzc05vbmU6Ci0gICAgICAgICAgICBkZWNvbXByZXNzb3IgPSBJRGVjb21wcmVzc29yOjpVbmNvbXByZXNzZWQoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGtDb3dDb21wcmVzc0d6OgogICAgICAgICAgICAgZGVjb21wcmVzc29yID0gSURlY29tcHJlc3Nvcjo6R3ooKTsKQEAgLTc4MiwyNCArNzE0LDQ5IEBACiAgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzQnJvdGxpOgogICAgICAgICAgICAgZGVjb21wcmVzc29yID0gSURlY29tcHJlc3Nvcjo6QnJvdGxpKCk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3Nac3RkOgorICAgICAgICAgICAgaWYgKGhlYWRlcl8uYmxvY2tfc2l6ZSAhPSBvcC0+ZGF0YV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBkZWNvbXByZXNzb3IgPSBJRGVjb21wcmVzc29yOjpac3RkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NMejQ6Ci0gICAgICAgICAgICBkZWNvbXByZXNzb3IgPSBJRGVjb21wcmVzc29yOjpMejQoKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXJfLmJsb2NrX3NpemUgIT0gb3AtPmRhdGFfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZGVjb21wcmVzc29yID0gSURlY29tcHJlc3Nvcjo6THo0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZTogIiA8PCBvcC5jb21wcmVzc2lvbjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZTogIiA8PCBHZXRDb21wcmVzc2lvblR5cGUoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICB1aW50NjRfdCBvZmZzZXQ7Ci0gICAgaWYgKG9wLnR5cGUgPT0ga0Nvd1hvck9wKSB7Ci0gICAgICAgIG9mZnNldCA9IGRhdGFfbG9jXy0+YXQob3AubmV3X2Jsb2NrKTsKKyAgICBpZiAob3AtPnR5cGUoKSA9PSBrQ293WG9yT3ApIHsKKyAgICAgICAgb2Zmc2V0ID0geG9yX2RhdGFfbG9jXy0+YXQob3AtPm5ld19ibG9jayk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb2Zmc2V0ID0gb3Auc291cmNlOworICAgICAgICBvZmZzZXQgPSBvcC0+c291cmNlKCk7CiAgICAgfQotICAgIENvd0RhdGFTdHJlYW0gc3RyZWFtKHRoaXMsIG9mZnNldCwgb3AuZGF0YV9sZW5ndGgpOworICAgIGlmICghZGVjb21wcmVzc29yIHx8CisgICAgICAgICgob3AtPmRhdGFfbGVuZ3RoID09IGhlYWRlcl8uYmxvY2tfc2l6ZSkgJiYgKGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24gPT0gMykpKSB7CisgICAgICAgIENvd0RhdGFTdHJlYW0gc3RyZWFtKHRoaXMsIG9mZnNldCArIGlnbm9yZV9ieXRlcywgb3AtPmRhdGFfbGVuZ3RoIC0gaWdub3JlX2J5dGVzKTsKKyAgICAgICAgcmV0dXJuIHN0cmVhbS5SZWFkRnVsbHkoYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisgICAgfQorCisgICAgQ293RGF0YVN0cmVhbSBzdHJlYW0odGhpcywgb2Zmc2V0LCBvcC0+ZGF0YV9sZW5ndGgpOwogICAgIGRlY29tcHJlc3Nvci0+c2V0X3N0cmVhbSgmc3RyZWFtKTsKLSAgICBkZWNvbXByZXNzb3ItPnNldF9zaW5rKHNpbmspOwotICAgIHJldHVybiBkZWNvbXByZXNzb3ItPkRlY29tcHJlc3MoaGVhZGVyXy5ibG9ja19zaXplKTsKKyAgICByZXR1cm4gZGVjb21wcmVzc29yLT5EZWNvbXByZXNzKGJ1ZmZlciwgYnVmZmVyX3NpemUsIGhlYWRlcl8uYmxvY2tfc2l6ZSwgaWdub3JlX2J5dGVzKTsKK30KKworYm9vbCBDb3dSZWFkZXI6OkdldFNvdXJjZU9mZnNldChjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB1aW50NjRfdCogc291cmNlX29mZnNldCkgeworICAgIHN3aXRjaCAob3AtPnR5cGUoKSkgeworICAgICAgICBjYXNlIGtDb3dDb3B5T3A6CisgICAgICAgICAgICAqc291cmNlX29mZnNldCA9IG9wLT5zb3VyY2UoKSAqIGhlYWRlcl8uYmxvY2tfc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIGtDb3dYb3JPcDoKKyAgICAgICAgICAgICpzb3VyY2Vfb2Zmc2V0ID0gb3AtPnNvdXJjZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQogCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY3JlYXRlX2Nvdy5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2NyZWF0ZV9jb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjEwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2NyZWF0ZV9jb3cuY3BwCkBAIC0wLDAgKzEsMzYxIEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X3V0aWxzLmg+CisjaW5jbHVkZSA8c3RvcmFnZV9saXRlcmFscy9zdG9yYWdlX2xpdGVyYWxzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvY2hyb25vX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Njb3BlZ3VhcmQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorCisjaW5jbHVkZSA8Z2ZsYWdzL2dmbGFncy5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKK0RFRklORV9zdHJpbmcoc291cmNlLCAiIiwgIlNvdXJjZSBwYXJ0aXRpb24gaW1hZ2UiKTsKK0RFRklORV9zdHJpbmcodGFyZ2V0LCAiIiwgIlRhcmdldCBwYXJ0aXRpb24gaW1hZ2UiKTsKK0RFRklORV9zdHJpbmcoY29tcHJlc3Npb24sICJsejQiLAorICAgICAgICAgICAgICAiQ29tcHJlc3Npb24gYWxnb3JpdGhtLiBEZWZhdWx0IGlzIHNldCB0byBsejQuIEF2YWlsYWJsZSBvcHRpb25zOiBsejQsIHpzdGQsIGd6Iik7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKK3VzaW5nIGFuZHJvaWQ6OnNuYXBzaG90OjpDcmVhdGVDb3dXcml0ZXI7Cit1c2luZyBhbmRyb2lkOjpzbmFwc2hvdDo6SUNvd1dyaXRlcjsKKworY2xhc3MgQ3JlYXRlU25hcHNob3QgeworICBwdWJsaWM6CisgICAgQ3JlYXRlU25hcHNob3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNyY19maWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGNoX2ZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21wcmVzc2lvbik7CisgICAgYm9vbCBDcmVhdGVTbmFwc2hvdFBhdGNoKCk7CisKKyAgcHJpdmF0ZToKKyAgICAvKiBzb3VyY2UuaW1nICovCisgICAgc3RkOjpzdHJpbmcgc3JjX2ZpbGVfOworICAgIC8qIHRhcmdldC5pbWcgKi8KKyAgICBzdGQ6OnN0cmluZyB0YXJnZXRfZmlsZV87CisgICAgLyogc25hcHNob3QtcGF0Y2ggZ2VuZXJhdGVkICovCisgICAgc3RkOjpzdHJpbmcgcGF0Y2hfZmlsZV87CisKKyAgICAvKgorICAgICAqIEFjdGl2ZSBmaWxlIHdoaWNoIGlzIGJlaW5nIHBhcnNlZCBieSB0aGlzIGluc3RhbmNlLgorICAgICAqIEl0IHdpbGwgZWl0aGVyIGJlIHNvdXJjZS5pbWcgb3IgdGFyZ2V0LmltZy4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyBwYXJzaW5nX2ZpbGVfOworICAgIGJvb2wgY3JlYXRlX3NuYXBzaG90X3BhdGNoXyA9IGZhbHNlOworCisgICAgY29uc3QgaW50IGtOdW1UaHJlYWRzID0gNjsKKyAgICBjb25zdCBzaXplX3Qga0Jsb2NrU2l6ZVRvUmVhZCA9IDFfTWlCOworCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IHNvdXJjZV9ibG9ja19oYXNoXzsKKyAgICBzdGQ6Om11dGV4IHNvdXJjZV9ibG9ja19oYXNoX2xvY2tfOworCisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IHdyaXRlcl87CisgICAgc3RkOjptdXRleCB3cml0ZV9sb2NrXzsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHpibG9ja187CisKKyAgICBzdGQ6OnN0cmluZyBjb21wcmVzc2lvbl8gPSAibHo0IjsKKyAgICB1bmlxdWVfZmQgZmRfOworCisgICAgY29uc3QgaW50IEJMT0NLX1NaID0gNF9LaUI7CisgICAgdm9pZCBTSEEyNTYoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCwgdWludDhfdCBvdXRbMzJdKTsKKyAgICBib29sIElzQmxvY2tBbGlnbmVkKHVpbnQ2NF90IHJlYWRfc2l6ZSkgeyByZXR1cm4gKChyZWFkX3NpemUgJiAoQkxPQ0tfU1ogLSAxKSkgPT0gMCk7IH0KKyAgICBib29sIFJlYWRCbG9ja3Mob2ZmX3Qgb2Zmc2V0LCBjb25zdCBpbnQgc2tpcF9ibG9ja3MsIGNvbnN0IHVpbnQ2NF90IGRldl9zeik7CisgICAgc3RkOjpzdHJpbmcgVG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3QgbGVuKTsKKworICAgIGJvb2wgQ3JlYXRlU25hcHNob3RGaWxlKCk7CisgICAgYm9vbCBGaW5kU291cmNlQmxvY2tIYXNoKCk7CisgICAgYm9vbCBQcmVwYXJlUGFyc2Uoc3RkOjpzdHJpbmcmIHBhcnNpbmdfZmlsZSwgY29uc3QgYm9vbCBjcmVhdGVTbmFwc2hvdCk7CisgICAgYm9vbCBQYXJzZVBhcnRpdGlvbigpOworICAgIGJvb2wgV3JpdGVTbmFwc2hvdChjb25zdCB2b2lkKiBidWZmZXIsIHVpbnQ2NF90IGJsb2NrLCBzdGQ6OnN0cmluZyYgYmxvY2tfaGFzaCk7Cit9OworCit2b2lkIENyZWF0ZVNuYXBzaG90TG9nZ2VyKGFuZHJvaWQ6OmJhc2U6OkxvZ0lkLCBhbmRyb2lkOjpiYXNlOjpMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgICBpZiAoc2V2ZXJpdHkgPT0gYW5kcm9pZDo6YmFzZTo6RVJST1IpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICIlc1xuIiwgbWVzc2FnZSk7CisgICAgfQorfQorCitDcmVhdGVTbmFwc2hvdDo6Q3JlYXRlU25hcHNob3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNyY19maWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGNoX2ZpbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21wcmVzc2lvbikKKyAgICA6IHNyY19maWxlXyhzcmNfZmlsZSksIHRhcmdldF9maWxlXyh0YXJnZXRfZmlsZSksIHBhdGNoX2ZpbGVfKHBhdGNoX2ZpbGUpIHsKKyAgICBpZiAoIWNvbXByZXNzaW9uLmVtcHR5KCkpIHsKKyAgICAgICAgY29tcHJlc3Npb25fID0gY29tcHJlc3Npb247CisgICAgfQorfQorCitib29sIENyZWF0ZVNuYXBzaG90OjpQcmVwYXJlUGFyc2Uoc3RkOjpzdHJpbmcmIHBhcnNpbmdfZmlsZSwgY29uc3QgYm9vbCBjcmVhdGVTbmFwc2hvdCkgeworICAgIHBhcnNpbmdfZmlsZV8gPSBwYXJzaW5nX2ZpbGU7CisgICAgY3JlYXRlX3NuYXBzaG90X3BhdGNoXyA9IGNyZWF0ZVNuYXBzaG90OworCisgICAgaWYgKGNyZWF0ZVNuYXBzaG90KSB7CisgICAgICAgIGZkXy5yZXNldChvcGVuKHBhdGNoX2ZpbGVfLmNfc3RyKCksIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KSk7CisgICAgICAgIGlmIChmZF8gPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gdGhlIHNuYXBzaG90LXBhdGNoIGZpbGU6ICIgPDwgcGF0Y2hfZmlsZV87CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB6YmxvY2tfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KEJMT0NLX1NaKTsKKyAgICAgICAgc3RkOjptZW1zZXQoemJsb2NrXy5nZXQoKSwgMCwgQkxPQ0tfU1opOworCisgICAgICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICAgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uXzsKKyAgICAgICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IDI7CisgICAgICAgIG9wdGlvbnMuYmF0Y2hfd3JpdGUgPSB0cnVlOworICAgICAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNjAwOworICAgICAgICB3cml0ZXJfID0gQ3JlYXRlQ293V3JpdGVyKDIsIG9wdGlvbnMsIHN0ZDo6bW92ZShmZF8pKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBDcmVhdGUgcGVyLWJsb2NrIHNoYTI1NiBoYXNoIG9mIHNvdXJjZSBwYXJ0aXRpb24KKyAqLworYm9vbCBDcmVhdGVTbmFwc2hvdDo6RmluZFNvdXJjZUJsb2NrSGFzaCgpIHsKKyAgICBpZiAoIVByZXBhcmVQYXJzZShzcmNfZmlsZV8sIGZhbHNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBQYXJzZVBhcnRpdGlvbigpOworfQorCisvKgorICogQ3JlYXRlIHNuYXBzaG90IGZpbGUgYnkgY29tcGFyaW5nIHNoYTI1NiBwZXIgYmxvY2sKKyAqIG9mIHRhcmdldC5pbWcgd2l0aCB0aGUgY29uc3RydWN0ZWQgcGVyLWJsb2NrIHNoYTI1NiBoYXNoCisgKiBvZiBzb3VyY2UgcGFydGl0aW9uLgorICovCitib29sIENyZWF0ZVNuYXBzaG90OjpDcmVhdGVTbmFwc2hvdEZpbGUoKSB7CisgICAgaWYgKCFQcmVwYXJlUGFyc2UodGFyZ2V0X2ZpbGVfLCB0cnVlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBQYXJzZVBhcnRpdGlvbigpOworfQorCisvKgorICogQ3JlYXRlcyBzbmFwc2hvdCBwYXRjaCBmaWxlIGJ5IGNvbXBhcmluZyBzb3VyY2UuaW1nIGFuZCB0YXJnZXQuaW1nCisgKi8KK2Jvb2wgQ3JlYXRlU25hcHNob3Q6OkNyZWF0ZVNuYXBzaG90UGF0Y2goKSB7CisgICAgaWYgKCFGaW5kU291cmNlQmxvY2tIYXNoKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlU25hcHNob3RGaWxlKCk7Cit9CisKK3ZvaWQgQ3JlYXRlU25hcHNob3Q6OlNIQTI1Nihjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoLCB1aW50OF90IG91dFszMl0pIHsKKyAgICBTSEEyNTZfQ1RYIGM7CisgICAgU0hBMjU2X0luaXQoJmMpOworICAgIFNIQTI1Nl9VcGRhdGUoJmMsIGRhdGEsIGxlbmd0aCk7CisgICAgU0hBMjU2X0ZpbmFsKG91dCwgJmMpOworfQorCitzdGQ6OnN0cmluZyBDcmVhdGVTbmFwc2hvdDo6VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgY2hhciBsb29rdXBbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICBzdGQ6OnN0cmluZyBvdXQobGVuICogMiArIDEsICdcMCcpOworICAgIGNoYXIqIG91dHAgPSBvdXQuZGF0YSgpOworICAgIGZvciAoOyBsZW4gPiAwOyBsZW4tLSwgYnVmKyspIHsKKyAgICAgICAgKm91dHArKyA9IChjaGFyKWxvb2t1cFsqYnVmID4+IDRdOworICAgICAgICAqb3V0cCsrID0gKGNoYXIpbG9va3VwWypidWYgJiAweGZdOworICAgIH0KKyAgICByZXR1cm4gb3V0OworfQorCitib29sIENyZWF0ZVNuYXBzaG90OjpXcml0ZVNuYXBzaG90KGNvbnN0IHZvaWQqIGJ1ZmZlciwgdWludDY0X3QgYmxvY2ssIHN0ZDo6c3RyaW5nJiBibG9ja19oYXNoKSB7CisgICAgaWYgKHN0ZDo6bWVtY21wKHpibG9ja18uZ2V0KCksIGJ1ZmZlciwgQkxPQ0tfU1opID09IDApIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sod3JpdGVfbG9ja18pOworICAgICAgICByZXR1cm4gd3JpdGVyXy0+QWRkWmVyb0Jsb2NrcyhibG9jaywgMSk7CisgICAgfQorCisgICAgYXV0byBpdGVyID0gc291cmNlX2Jsb2NrX2hhc2hfLmZpbmQoYmxvY2tfaGFzaCk7CisgICAgaWYgKGl0ZXIgIT0gc291cmNlX2Jsb2NrX2hhc2hfLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHdyaXRlX2xvY2tfKTsKKyAgICAgICAgcmV0dXJuIHdyaXRlcl8tPkFkZENvcHkoYmxvY2ssIGl0ZXItPnNlY29uZCwgMSk7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHdyaXRlX2xvY2tfKTsKKyAgICByZXR1cm4gd3JpdGVyXy0+QWRkUmF3QmxvY2tzKGJsb2NrLCBidWZmZXIsIEJMT0NLX1NaKTsKK30KKworYm9vbCBDcmVhdGVTbmFwc2hvdDo6UmVhZEJsb2NrcyhvZmZfdCBvZmZzZXQsIGNvbnN0IGludCBza2lwX2Jsb2NrcywgY29uc3QgdWludDY0X3QgZGV2X3N6KSB7CisgICAgdW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHBhcnNpbmdfZmlsZV8uY19zdHIoKSwgT19SRE9OTFkpKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJvcGVuIGZhaWxlZDogIiA8PCBwYXJzaW5nX2ZpbGVfOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbG9mZl90IGZpbGVfb2Zmc2V0ID0gb2Zmc2V0OworICAgIGNvbnN0IHVpbnQ2NF90IHJlYWRfc3ogPSBrQmxvY2tTaXplVG9SZWFkOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihyZWFkX3N6KTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHNpemVfdCB0b19yZWFkID0gc3RkOjptaW4oKGRldl9zeiAtIGZpbGVfb2Zmc2V0KSwgcmVhZF9zeik7CisKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChmZC5nZXQoKSwgYnVmZmVyLmdldCgpLCB0b19yZWFkLCBmaWxlX29mZnNldCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIGJsb2NrIGZyb20gYmxvY2sgZGV2aWNlOiAiIDw8IHBhcnNpbmdfZmlsZV8KKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhdCBvZmZzZXQ6ICIgPDwgZmlsZV9vZmZzZXQgPDwgIiByZWFkLXNpemU6ICIgPDwgdG9fcmVhZAorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJsb2NrLXNpemU6ICIgPDwgZGV2X3N6OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFJc0Jsb2NrQWxpZ25lZCh0b19yZWFkKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidW5hYmxlIHRvIHBhcnNlIHRoZSB1bi1hbGlnbmVkIHJlcXVlc3Q6ICIgPDwgdG9fcmVhZDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1fYmxvY2tzID0gdG9fcmVhZCAvIEJMT0NLX1NaOworICAgICAgICB1aW50NjRfdCBidWZmZXJfb2Zmc2V0ID0gMDsKKyAgICAgICAgb2ZmX3QgZm9mZnNldCA9IGZpbGVfb2Zmc2V0OworCisgICAgICAgIHdoaWxlIChudW1fYmxvY2tzKSB7CisgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZwdHIgPSAoY2hhciopYnVmZmVyLmdldCgpICsgYnVmZmVyX29mZnNldDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsa2luZGV4ID0gZm9mZnNldCAvIEJMT0NLX1NaOworCisgICAgICAgICAgICB1aW50OF90IGNoZWNrc3VtWzMyXTsKKyAgICAgICAgICAgIFNIQTI1NihidWZwdHIsIEJMT0NLX1NaLCBjaGVja3N1bSk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBoYXNoID0gVG9IZXhTdHJpbmcoY2hlY2tzdW0sIHNpemVvZihjaGVja3N1bSkpOworCisgICAgICAgICAgICBpZiAoY3JlYXRlX3NuYXBzaG90X3BhdGNoXykgeworICAgICAgICAgICAgICAgIGlmICghV3JpdGVTbmFwc2hvdChidWZwdHIsIGJsa2luZGV4LCBoYXNoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJXcml0ZVNuYXBzaG90IGZhaWxlZCBmb3IgYmxvY2s6ICIgPDwgYmxraW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNvdXJjZV9ibG9ja19oYXNoX2xvY2tfKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfYmxvY2tfaGFzaF8uY291bnQoaGFzaCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2Jsb2NrX2hhc2hfW2hhc2hdID0gYmxraW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJfb2Zmc2V0ICs9IEJMT0NLX1NaOworICAgICAgICAgICAgZm9mZnNldCArPSBCTE9DS19TWjsKKyAgICAgICAgICAgIG51bV9ibG9ja3MgLT0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbGVfb2Zmc2V0ICs9IChza2lwX2Jsb2NrcyAqIHRvX3JlYWQpOworICAgICAgICBpZiAoZmlsZV9vZmZzZXQgPj0gZGV2X3N6KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENyZWF0ZVNuYXBzaG90OjpQYXJzZVBhcnRpdGlvbigpIHsKKyAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGFyc2luZ19maWxlXy5jX3N0cigpLCBPX1JET05MWSkpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIm9wZW4gZmFpbGVkOiAiIDw8IHBhcnNpbmdfZmlsZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBkZXZfc3ogPSBsc2VlayhmZC5nZXQoKSwgMCwgU0VFS19FTkQpOworICAgIGlmICghZGV2X3N6KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBkZXRlcm1pbmUgYmxvY2sgZGV2aWNlIHNpemU6ICIgPDwgcGFyc2luZ19maWxlXzsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghSXNCbG9ja0FsaWduZWQoZGV2X3N6KSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJkZXZfc3o6ICIgPDwgZGV2X3N6IDw8ICIgaXMgbm90IGJsb2NrIGFsaWduZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IG51bV90aHJlYWRzID0ga051bVRocmVhZHM7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1dHVyZTxib29sPj4gdGhyZWFkczsKKyAgICBvZmZfdCBzdGFydF9vZmZzZXQgPSAwOworICAgIGNvbnN0IGludCBza2lwX2Jsb2NrcyA9IG51bV90aHJlYWRzOworCisgICAgd2hpbGUgKG51bV90aHJlYWRzKSB7CisgICAgICAgIHRocmVhZHMuZW1wbGFjZV9iYWNrKHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmQ3JlYXRlU25hcHNob3Q6OlJlYWRCbG9ja3MsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfb2Zmc2V0LCBza2lwX2Jsb2NrcywgZGV2X3N6KSk7CisgICAgICAgIHN0YXJ0X29mZnNldCArPSBrQmxvY2tTaXplVG9SZWFkOworICAgICAgICBudW1fdGhyZWFkcyAtPSAxOworICAgICAgICBpZiAoc3RhcnRfb2Zmc2V0ID49IGRldl9zeikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgZm9yIChhdXRvJiB0IDogdGhyZWFkcykgeworICAgICAgICByZXQgPSB0LmdldCgpICYmIHJldDsKKyAgICB9CisKKyAgICBpZiAocmV0ICYmIGNyZWF0ZV9zbmFwc2hvdF9wYXRjaF8gJiYgIXdyaXRlcl8tPkZpbmFsaXplKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmluemFsaXplIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2NvbnN0ZXhwciBjaGFyIGtVc2FnZVtdID0gUiIoCitOQU1FCisgICAgY3JlYXRlX3NuYXBzaG90IC0gQ3JlYXRlIHNuYXBzaG90IHBhdGNoZXMgYnkgY29tcGFyaW5nIHR3byBwYXJ0aXRpb24gaW1hZ2VzCisKK1NZTk9QU0lTCisgICAgY3JlYXRlX3NuYXBzaG90IC0tc291cmNlPTxzb3VyY2UuaW1nPiAtLXRhcmdldD08dGFyZ2V0LmltZz4gLS1jb21wcmVzc2lvbj0iPGNvbXByZXNzaW9uLWFsZ29yaXRobSIKKworICAgIHNvdXJjZS5pbWcgLT4gU291cmNlIHBhcnRpdGlvbiBpbWFnZQorICAgIHRhcmdldC5pbWcgLT4gVGFyZ2V0IHBhcnRpdGlvbiBpbWFnZQorICAgIGNvbXByZXNzb2luIC0+IGNvbXByZXNzaW9uIGFsZ29yaXRobS4gRGVmYXVsdCBzZXQgdG8gbHo0LiBTdXBwb3J0ZWQgdHlwZXMgYXJlIGd6LCBsejQsIHpzdGQuCisKK0VYQU1QTEVTCisKKyAgICQgY3JlYXRlX3NuYXBzaG90ICRTT1VSQ0VfQlVJTEQvc3lzdGVtLmltZyAkVEFSR0VUX0JVSUxEL3N5c3RlbS5pbWcKKyAgICQgY3JlYXRlX3NuYXBzaG90ICRTT1VSQ0VfQlVJTEQvcHJvZHVjdC5pbWcgJFRBUkdFVF9CVUlMRC9wcm9kdWN0LmltZyAtLWNvbXByZXNzaW9uPSJ6c3RkIgorCispIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsICZhbmRyb2lkOjpzbmFwc2hvdDo6Q3JlYXRlU25hcHNob3RMb2dnZXIpOworICAgIDo6Z2ZsYWdzOjpTZXRVc2FnZU1lc3NhZ2Uoa1VzYWdlKTsKKyAgICA6OmdmbGFnczo6UGFyc2VDb21tYW5kTGluZUZsYWdzKCZhcmdjLCAmYXJndiwgdHJ1ZSk7CisKKyAgICBpZiAoRkxBR1Nfc291cmNlLmVtcHR5KCkgfHwgRkxBR1NfdGFyZ2V0LmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKElORk8pIDw8IGtVc2FnZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZm5hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShGTEFHU190YXJnZXQuY19zdHIoKSk7CisgICAgYXV0byBwYXJ0cyA9IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGZuYW1lLCAiLiIpOworICAgIHN0ZDo6c3RyaW5nIHNuYXBzaG90ZmlsZSA9IHBhcnRzWzBdICsgIi5wYXRjaCI7CisgICAgYW5kcm9pZDo6c25hcHNob3Q6OkNyZWF0ZVNuYXBzaG90IHNuYXBzaG90KEZMQUdTX3NvdXJjZSwgRkxBR1NfdGFyZ2V0LCBzbmFwc2hvdGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQUdTX2NvbXByZXNzaW9uKTsKKworICAgIGlmICghc25hcHNob3QuQ3JlYXRlU25hcHNob3RQYXRjaCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlNuYXBzaG90IGNyZWF0aW9uIGZhaWxlZCI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIlNuYXBzaG90IHBhdGNoOiAiIDw8IHNuYXBzaG90ZmlsZSA8PCAiIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IjsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvaW5zcGVjdF9jb3cuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9pbnNwZWN0X2Nvdy5jcHAKaW5kZXggMTY3ZmY4Yy4uMzcxODg1MSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9pbnNwZWN0X2Nvdy5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9pbnNwZWN0X2Nvdy5jcHAKQEAgLTE2LDE4ICsxNiwzNyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8aW9tYW5pcD4KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxnZmxhZ3MvZ2ZsYWdzLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3JlYWRlci5oPgorI2luY2x1ZGUgInBhcnNlcl92Mi5oIgorCitERUZJTkVfYm9vbChzaWxlbnQsIGZhbHNlLCAiUnVuIHNpbGVudGx5Iik7CitERUZJTkVfYm9vbChkZWNvbXByZXNzLCBmYWxzZSwgIkF0dGVtcHQgdG8gZGVjb21wcmVzcyBkYXRhIG9wcyIpOworREVGSU5FX2Jvb2woc2hvd19iYWRfZGF0YSwgZmFsc2UsICJJZiBhbiBvcCBmYWlscyB0byBkZWNvbXByZXNzLCBzaG93IGl0cyBkYXcgZGF0YSIpOworREVGSU5FX2Jvb2woc2hvd19vcHMsIGZhbHNlLCAiUHJpbnQgYWxsIG9wY29kZSBpbmZvcm1hdGlvbiIpOworREVGSU5FX3N0cmluZyhvcmRlciwgIiIsICJJZiBzaG93X29wcyBpcyB0cnVlLCBjaGFuZ2UgdGhlIG9yZGVyIChlaXRoZXIgbWVyZ2Ugb3IgcmV2ZXJzZS1tZXJnZSkiKTsKK0RFRklORV9ib29sKHNob3dfbWVyZ2VkLCBmYWxzZSwKKyAgICAgICAgICAgICJJZiBzaG93X29wcyBpcyB0cnVlLCBhbmQgb3JkZXIgaXMgbWVyZ2Ugb3IgcmV2ZXJzZS1tZXJnZSwgaW5jbHVkZSBtZXJnZWQgb3BzIik7CitERUZJTkVfYm9vbCh2ZXJpZnlfbWVyZ2Vfc2VxdWVuY2UsIGZhbHNlLCAiVmVyaWZ5IG1lcmdlIG9yZGVyIHNlcXVlbmNpbmciKTsKK0RFRklORV9ib29sKHNob3dfbWVyZ2Vfc2VxdWVuY2UsIGZhbHNlLCAiU2hvdyBtZXJnZSBvcmRlciBzZXF1ZW5jZSIpOworREVGSU5FX2Jvb2woc2hvd19yYXdfb3BzLCBmYWxzZSwgIlNob3cgcmF3IG9wcyBkaXJlY3RseSBmcm9tIHRoZSB1bmRlcmx5aW5nIHBhcnNlciIpOworREVGSU5FX3N0cmluZyhleHRyYWN0X3RvLCAiIiwgIkV4dHJhY3QgdGhlIENPVyBjb250ZW50cyB0byB0aGUgZ2l2ZW4gZmlsZSIpOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCit1c2luZyBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKwogdm9pZCBNeUxvZ2dlcihhbmRyb2lkOjpiYXNlOjpMb2dJZCwgYW5kcm9pZDo6YmFzZTo6TG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKICAgICAgICAgICAgICAgdW5zaWduZWQgaW50LCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7CiAgICAgaWYgKHNldmVyaXR5ID09IGFuZHJvaWQ6OmJhc2U6OkVSUk9SKSB7CkBAIC0zNywxMDcgKzU2LDEwOSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgewotICAgIExPRyhFUlJPUikgPDwgIlVzYWdlOiBpbnNwZWN0X2NvdyBbLXNkXSA8Q09XX0ZJTEU+IjsKLSAgICBMT0coRVJST1IpIDw8ICJcdCAtcyBSdW4gU2lsZW50IjsKLSAgICBMT0coRVJST1IpIDw8ICJcdCAtZCBBdHRlbXB0IHRvIGRlY29tcHJlc3MiOwotICAgIExPRyhFUlJPUikgPDwgIlx0IC1iIFNob3cgZGF0YSBmb3IgZmFpbGVkIGRlY29tcHJlc3MiOwotICAgIExPRyhFUlJPUikgPDwgIlx0IC1sIFNob3cgb3BzIjsKLSAgICBMT0coRVJST1IpIDw8ICJcdCAtbSBTaG93IG9wcyBpbiByZXZlcnNlIG1lcmdlIG9yZGVyIjsKLSAgICBMT0coRVJST1IpIDw8ICJcdCAtbiBTaG93IG9wcyBpbiBtZXJnZSBvcmRlciI7Ci0gICAgTE9HKEVSUk9SKSA8PCAiXHQgLWEgSW5jbHVkZSBtZXJnZWQgb3BzIGluIGFueSBtZXJnZSBvcmRlciBsaXN0aW5nIjsKLSAgICBMT0coRVJST1IpIDw8ICJcdCAtbyBTaG93cyBzZXF1ZW5jZSBvcCBibG9jayBvcmRlciI7Ci0gICAgTE9HKEVSUk9SKSA8PCAiXHQgLXYgVmVyaWZpZXMgbWVyZ2Ugb3JkZXIgaGFzIG5vIGNvbmZsaWN0c1xuIjsKLX0KLQotZW51bSBPcEl0ZXIgeyBOb3JtYWwsIFJldk1lcmdlLCBNZXJnZSB9OwotCi1zdHJ1Y3QgT3B0aW9ucyB7Ci0gICAgYm9vbCBzaWxlbnQ7Ci0gICAgYm9vbCBkZWNvbXByZXNzOwotICAgIGJvb2wgc2hvd19vcHM7Ci0gICAgYm9vbCBzaG93X2JhZDsKLSAgICBib29sIHNob3dfc2VxOwotICAgIGJvb2wgdmVyaWZ5X3NlcXVlbmNlOwotICAgIE9wSXRlciBpdGVyX3R5cGU7Ci0gICAgYm9vbCBpbmNsdWRlX21lcmdlZDsKLX07Ci0KLS8vIFNpbmsgdGhhdCBhbHdheXMgYXBwZW5kcyB0byB0aGUgZW5kIG9mIGEgc3RyaW5nLgotY2xhc3MgU3RyaW5nU2luayA6IHB1YmxpYyBJQnl0ZVNpbmsgewotICBwdWJsaWM6Ci0gICAgdm9pZCogR2V0QnVmZmVyKHNpemVfdCByZXF1ZXN0ZWQsIHNpemVfdCogYWN0dWFsKSBvdmVycmlkZSB7Ci0gICAgICAgIHNpemVfdCBvbGRfc2l6ZSA9IHN0cmVhbV8uc2l6ZSgpOwotICAgICAgICBzdHJlYW1fLnJlc2l6ZShvbGRfc2l6ZSArIHJlcXVlc3RlZCwgJ1wwJyk7Ci0gICAgICAgICphY3R1YWwgPSByZXF1ZXN0ZWQ7Ci0gICAgICAgIHJldHVybiBzdHJlYW1fLmRhdGEoKSArIG9sZF9zaXplOwotICAgIH0KLSAgICBib29sIFJldHVybkRhdGEodm9pZCosIHNpemVfdCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZvaWQgUmVzZXQoKSB7IHN0cmVhbV8uY2xlYXIoKTsgfQotCi0gICAgc3RkOjpzdHJpbmcmIHN0cmVhbSgpIHsgcmV0dXJuIHN0cmVhbV87IH0KLQotICBwcml2YXRlOgotICAgIHN0ZDo6c3RyaW5nIHN0cmVhbV87Ci19OwotCi1zdGF0aWMgdm9pZCBTaG93QmFkKENvd1JlYWRlciYgcmVhZGVyLCBjb25zdCBzdHJ1Y3QgQ293T3BlcmF0aW9uJiBvcCkgeworc3RhdGljIHZvaWQgU2hvd0JhZChDb3dSZWFkZXImIHJlYWRlciwgY29uc3QgQ293T3BlcmF0aW9uKiBvcCkgewogICAgIHNpemVfdCBjb3VudDsKLSAgICBhdXRvIGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihvcC5kYXRhX2xlbmd0aCk7CisgICAgYXV0byBidWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4ob3AtPmRhdGFfbGVuZ3RoKTsKIAotICAgIGlmICghcmVhZGVyLkdldFJhd0J5dGVzKG9wLnNvdXJjZSwgYnVmZmVyLmdldCgpLCBvcC5kYXRhX2xlbmd0aCwgJmNvdW50KSkgeworICAgIGlmICghcmVhZGVyLkdldFJhd0J5dGVzKG9wLCBidWZmZXIuZ2V0KCksIG9wLT5kYXRhX2xlbmd0aCwgJmNvdW50KSkgewogICAgICAgICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byByZWFkIGF0IGFsbCFcbiI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJUaGUgQmxvY2sgZGF0YSBpczpcbiI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3AuZGF0YV9sZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wLT5kYXRhX2xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjpoZXggPDwgKGludClidWZmZXJbaV07CiAgICAgICAgIH0KICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZGVjIDw8ICJcblxuIjsKLSAgICAgICAgaWYgKG9wLmRhdGFfbGVuZ3RoID49IHNpemVvZihDb3dPcGVyYXRpb24pKSB7CisgICAgICAgIGlmIChvcC0+ZGF0YV9sZW5ndGggPj0gc2l6ZW9mKENvd09wZXJhdGlvbikpIHsKICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiVGhlIHN0YXJ0LCBhcyBhbiBvcCwgd291bGQgYmUgIiA8PCAqKENvd09wZXJhdGlvbiopYnVmZmVyLmdldCgpIDw8ICJcbiI7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyBib29sIEluc3BlY3QoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIE9wdGlvbnMgb3B0KSB7Ci0gICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKG9wZW4ocGF0aC5jX3N0cigpLCBPX1JET05MWSkpOworc3RhdGljIGJvb2wgU2hvd1Jhd09wU3RyZWFtVjIoYm9ycm93ZWRfZmQgZmQsIGNvbnN0IENvd0hlYWRlclYzJiBoZWFkZXIpIHsKKyAgICBDb3dQYXJzZXJWMiBwYXJzZXI7CisgICAgaWYgKCFwYXJzZXIuUGFyc2UoZmQsIGhlYWRlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAidjIgcGFyc2VyIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBvcCA6ICpwYXJzZXIuZ2V0X3Yyb3BzKCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8IG9wIDw8ICJcbiI7CisgICAgICAgIGlmIChhdXRvIGl0ZXIgPSBwYXJzZXIueG9yX2RhdGFfbG9jKCktPmZpbmQob3AubmV3X2Jsb2NrKTsKKyAgICAgICAgICAgIGl0ZXIgIT0gcGFyc2VyLnhvcl9kYXRhX2xvYygpLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICAgZGF0YSBsb2M6ICIgPDwgaXRlci0+c2Vjb25kIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFNob3dSYXdPcFN0cmVhbShib3Jyb3dlZF9mZCBmZCkgeworICAgIENvd0hlYWRlclYzIGhlYWRlcjsKKyAgICBpZiAoIVJlYWRDb3dIZWFkZXIoZmQsICZoZWFkZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInBhcnNlIGhlYWRlciBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3dpdGNoIChoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gU2hvd1Jhd09wU3RyZWFtVjIoZmQsIGhlYWRlcik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ1bmtub3duIENPVyB2ZXJzaW9uOiAiIDw8IGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3N0YXRpYyBib29sIEluc3BlY3QoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICB1bmlxdWVfZmQgZmQob3BlbihwYXRoLmNfc3RyKCksIE9fUkRPTkxZKSk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbiBmYWlsZWQ6ICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHVuaXF1ZV9mZCBleHRyYWN0X3RvOworICAgIGlmICghRkxBR1NfZXh0cmFjdF90by5lbXB0eSgpKSB7CisgICAgICAgIGV4dHJhY3RfdG8ucmVzZXQob3BlbihGTEFHU19leHRyYWN0X3RvLmNfc3RyKCksIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY0KSk7CisgICAgICAgIGlmIChleHRyYWN0X3RvIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgImNvdWxkIG5vdCBvcGVuICIgPDwgRkxBR1NfZXh0cmFjdF90byA8PCAiIGZvciB3cml0aW5nIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIENvd1JlYWRlciByZWFkZXI7CisKKyAgICBhdXRvIHN0YXJ0X3RpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKICAgICBpZiAoIXJlYWRlci5QYXJzZShmZCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAicGFyc2UgZmFpbGVkOiAiIDw8IHBhdGg7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gcGFyc2VfdGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhcnRfdGltZTsKIAotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgaWYgKCFyZWFkZXIuR2V0SGVhZGVyKCZoZWFkZXIpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgImNvdWxkIG5vdCBnZXQgaGVhZGVyOiAiIDw8IHBhdGg7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgY29uc3QgQ293SGVhZGVyJiBoZWFkZXIgPSByZWFkZXIuR2V0SGVhZGVyKCk7CiAgICAgQ293Rm9vdGVyIGZvb3RlcjsKICAgICBib29sIGhhc19mb290ZXIgPSBmYWxzZTsKICAgICBpZiAocmVhZGVyLkdldEZvb3RlcigmZm9vdGVyKSkgaGFzX2Zvb3RlciA9IHRydWU7CiAKLSAgICBpZiAoIW9wdC5zaWxlbnQpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJNYWpvciB2ZXJzaW9uOiAiIDw8IGhlYWRlci5tYWpvcl92ZXJzaW9uIDw8ICJcbiI7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiTWlub3IgdmVyc2lvbjogIiA8PCBoZWFkZXIubWlub3JfdmVyc2lvbiA8PCAiXG4iOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIkhlYWRlciBzaXplOiAiIDw8IGhlYWRlci5oZWFkZXJfc2l6ZSA8PCAiXG4iOworICAgIGlmICghRkxBR1Nfc2lsZW50KSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiVmVyc2lvbjogIiA8PCBoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24gPDwgIi4iCisgICAgICAgICAgICAgICAgICA8PCBoZWFkZXIucHJlZml4Lm1pbm9yX3ZlcnNpb24gPDwgIlxuIjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJIZWFkZXIgc2l6ZTogIiA8PCBoZWFkZXIucHJlZml4LmhlYWRlcl9zaXplIDw8ICJcbiI7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiRm9vdGVyIHNpemU6ICIgPDwgaGVhZGVyLmZvb3Rlcl9zaXplIDw8ICJcbiI7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiQmxvY2sgc2l6ZTogIiA8PCBoZWFkZXIuYmxvY2tfc2l6ZSA8PCAiXG4iOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIk51bSBtZXJnZSBvcHM6ICIgPDwgaGVhZGVyLm51bV9tZXJnZV9vcHMgPDwgIlxuIjsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJSQSBidWZmZXIgc2l6ZTogIiA8PCBoZWFkZXIuYnVmZmVyX3NpemUgPDwgIlxuIjsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiTWVyZ2Ugb3BzOiAiIDw8IGhlYWRlci5udW1fbWVyZ2Vfb3BzIDw8ICJcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiUmVhZGFoZWFkIGJ1ZmZlcjogIiA8PCBoZWFkZXIuYnVmZmVyX3NpemUgPDwgIiBieXRlc1xuIjsKICAgICAgICAgaWYgKGhhc19mb290ZXIpIHsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiVG90YWwgT3BzIHNpemU6ICIgPDwgZm9vdGVyLm9wLm9wc19zaXplIDw8ICJcbiI7Ci0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk51bWJlciBvZiBPcHM6ICIgPDwgZm9vdGVyLm9wLm51bV9vcHMgPDwgIlxuIjsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJGb290ZXI6IG9wcyB1c2FnZTogIiA8PCBmb290ZXIub3Aub3BzX3NpemUgPDwgIiBieXRlc1xuIjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRm9vdGVyOiBvcCBjb3VudDogIiA8PCBmb290ZXIub3AubnVtX29wcyA8PCAiXG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJGb290ZXI6IG5vbmVcbiI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAob3B0LnZlcmlmeV9zZXF1ZW5jZSkgeworICAgIGlmICghRkxBR1Nfc2lsZW50KSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiUGFyc2UgdGltZTogIiA8PCAocGFyc2VfdGltZS5jb3VudCgpICogMTAwMCkgPDwgIm1zXG4iOworICAgIH0KKworICAgIGlmIChGTEFHU192ZXJpZnlfbWVyZ2Vfc2VxdWVuY2UpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcbiI7CiAgICAgICAgIGlmIChyZWFkZXIuVmVyaWZ5TWVyZ2VPcHMoKSkgewogICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcbk1lcmdlIHNlcXVlbmNlIGlzIGNvbnNpc3RlbnQuXG4iOwogICAgICAgICB9IGVsc2UgewpAQCAtMTQ2LDQxICsxNjcsNjggQEAKICAgICB9CiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd09wSXRlcj4gaXRlcjsKLSAgICBpZiAob3B0Lml0ZXJfdHlwZSA9PSBOb3JtYWwpIHsKKyAgICBpZiAoRkxBR1Nfb3JkZXIuZW1wdHkoKSkgewogICAgICAgICBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIH0gZWxzZSBpZiAob3B0Lml0ZXJfdHlwZSA9PSBSZXZNZXJnZSkgewotICAgICAgICBpdGVyID0gcmVhZGVyLkdldFJldk1lcmdlT3BJdGVyKG9wdC5pbmNsdWRlX21lcmdlZCk7Ci0gICAgfSBlbHNlIGlmIChvcHQuaXRlcl90eXBlID09IE1lcmdlKSB7Ci0gICAgICAgIGl0ZXIgPSByZWFkZXIuR2V0TWVyZ2VPcEl0ZXIob3B0LmluY2x1ZGVfbWVyZ2VkKTsKKyAgICB9IGVsc2UgaWYgKEZMQUdTX29yZGVyID09ICJyZXZlcnNlLW1lcmdlIikgeworICAgICAgICBpdGVyID0gcmVhZGVyLkdldFJldk1lcmdlT3BJdGVyKEZMQUdTX3Nob3dfbWVyZ2VkKTsKKyAgICB9IGVsc2UgaWYgKEZMQUdTX29yZGVyID09ICJtZXJnZSIpIHsKKyAgICAgICAgaXRlciA9IHJlYWRlci5HZXRNZXJnZU9wSXRlcihGTEFHU19zaG93X21lcmdlZCk7CiAgICAgfQotICAgIFN0cmluZ1Npbmsgc2luazsKKworICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihoZWFkZXIuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBpZiAoIUZMQUdTX3NpbGVudCAmJiBGTEFHU19zaG93X3Jhd19vcHMpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiTGlzdGluZyByYXcgb3Agc3RyZWFtOlxuIjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgICBpZiAoIVNob3dSYXdPcFN0cmVhbShmZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghRkxBR1Nfc2lsZW50ICYmIEZMQUdTX3Nob3dfb3BzKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIkxpc3Rpbmcgb3Agc3RyZWFtOlxuIjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICItLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgfQorCiAgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKICAgICB1aW50NjRfdCB4b3Jfb3BzID0gMCwgY29weV9vcHMgPSAwLCByZXBsYWNlX29wcyA9IDAsIHplcm9fb3BzID0gMDsKLSAgICB3aGlsZSAoIWl0ZXItPkRvbmUoKSkgewotICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24mIG9wID0gaXRlci0+R2V0KCk7CisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpKSB7CisgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSBpdGVyLT5HZXQoKTsKIAotICAgICAgICBpZiAoIW9wdC5zaWxlbnQgJiYgb3B0LnNob3dfb3BzKSBzdGQ6OmNvdXQgPDwgb3AgPDwgIlxuIjsKKyAgICAgICAgaWYgKCFGTEFHU19zaWxlbnQgJiYgRkxBR1Nfc2hvd19vcHMpIHN0ZDo6Y291dCA8PCAqb3AgPDwgIlxuIjsKIAotICAgICAgICBpZiAob3B0LmRlY29tcHJlc3MgJiYgb3AudHlwZSA9PSBrQ293UmVwbGFjZU9wICYmIG9wLmNvbXByZXNzaW9uICE9IGtDb3dDb21wcmVzc05vbmUpIHsKLSAgICAgICAgICAgIGlmICghcmVhZGVyLlJlYWREYXRhKG9wLCAmc2luaykpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byBkZWNvbXByZXNzIGZvciA6IiA8PCBvcCA8PCAiXG4iOworICAgICAgICBpZiAoKEZMQUdTX2RlY29tcHJlc3MgfHwgZXh0cmFjdF90byA+PSAwKSAmJiBvcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIuUmVhZERhdGEob3AsIGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpIDwgMCkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIGRlY29tcHJlc3MgZm9yIDoiIDw8ICpvcCA8PCAiXG4iOwogICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAob3B0LnNob3dfYmFkKSBTaG93QmFkKHJlYWRlciwgb3ApOworICAgICAgICAgICAgICAgIGlmIChGTEFHU19zaG93X2JhZF9kYXRhKSBTaG93QmFkKHJlYWRlciwgb3ApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2luay5SZXNldCgpOworICAgICAgICAgICAgaWYgKGV4dHJhY3RfdG8gPj0gMCkgeworICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCA9IHVpbnQ2NF90KG9wLT5uZXdfYmxvY2spICogaGVhZGVyLmJsb2NrX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5QXRPZmZzZXQoZXh0cmFjdF90bywgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gd3JpdGUgYmxvY2sgIiA8PCBvcC0+bmV3X2Jsb2NrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGV4dHJhY3RfdG8gPj0gMCAmJiAhSXNNZXRhZGF0YU9wKCpvcCkgJiYgb3AtPnR5cGUoKSAhPSBrQ293WmVyb09wKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGV4dHJhY3Qgb3AgeWV0OiAiIDw8ICpvcDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChvcC50eXBlID09IGtDb3dTZXF1ZW5jZU9wICYmIG9wdC5zaG93X3NlcSkgeworICAgICAgICBpZiAob3AtPnR5cGUoKSA9PSBrQ293U2VxdWVuY2VPcCAmJiBGTEFHU19zaG93X21lcmdlX3NlcXVlbmNlKSB7CiAgICAgICAgICAgICBzaXplX3QgcmVhZDsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtZXJnZV9vcF9ibG9ja3M7Ci0gICAgICAgICAgICBzaXplX3Qgc2VxX2xlbiA9IG9wLmRhdGFfbGVuZ3RoIC8gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIHNpemVfdCBzZXFfbGVuID0gb3AtPmRhdGFfbGVuZ3RoIC8gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy5yZXNpemUoc2VxX2xlbik7Ci0gICAgICAgICAgICBpZiAoIXJlYWRlci5HZXRSYXdCeXRlcyhvcC5zb3VyY2UsIG1lcmdlX29wX2Jsb2Nrcy5kYXRhKCksIG9wLmRhdGFfbGVuZ3RoLCAmcmVhZCkpIHsKKyAgICAgICAgICAgIGlmICghcmVhZGVyLkdldFJhd0J5dGVzKG9wLCBtZXJnZV9vcF9ibG9ja3MuZGF0YSgpLCBvcC0+ZGF0YV9sZW5ndGgsICZyZWFkKSkgewogICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBzZXF1ZW5jZSBvcCEiOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghb3B0LnNpbGVudCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiU2VxdWVuY2UgZm9yICIgPDwgb3AgPDwgIiBpcyA6XG4iOworICAgICAgICAgICAgaWYgKCFGTEFHU19zaWxlbnQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlNlcXVlbmNlIGZvciAiIDw8ICpvcCA8PCAiIGlzIDpcbiI7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXFfbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg2KSA8PCBtZXJnZV9vcF9ibG9ja3NbaV0gPDwgIiwgIjsKICAgICAgICAgICAgICAgICAgICAgaWYgKChpICsgMSkgJSAxMCA9PSAwIHx8IGkgKyAxID09IHNlcV9sZW4pIHN0ZDo6Y291dCA8PCAiXG4iOwpAQCAtMTg4LDI0ICsyMzYsMjYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChvcC50eXBlID09IGtDb3dDb3B5T3ApIHsKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd0NvcHlPcCkgewogICAgICAgICAgICAgY29weV9vcHMrKzsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgfSBlbHNlIGlmIChvcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKICAgICAgICAgICAgIHJlcGxhY2Vfb3BzKys7Ci0gICAgICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PSBrQ293WmVyb09wKSB7CisgICAgICAgIH0gZWxzZSBpZiAob3AtPnR5cGUoKSA9PSBrQ293WmVyb09wKSB7CiAgICAgICAgICAgICB6ZXJvX29wcysrOwotICAgICAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd1hvck9wKSB7CisgICAgICAgIH0gZWxzZSBpZiAob3AtPnR5cGUoKSA9PSBrQ293WG9yT3ApIHsKICAgICAgICAgICAgIHhvcl9vcHMrKzsKICAgICAgICAgfQogCiAgICAgICAgIGl0ZXItPk5leHQoKTsKICAgICB9CiAKLSAgICBpZiAoIW9wdC5zaWxlbnQpIHsKKyAgICBpZiAoIUZMQUdTX3NpbGVudCkgewogICAgICAgICBhdXRvIHRvdGFsX29wcyA9IHJlcGxhY2Vfb3BzICsgemVyb19vcHMgKyBjb3B5X29wcyArIHhvcl9vcHM7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiVG90YWwtZGF0YS1vcHM6ICIgPDwgdG90YWxfb3BzIDw8ICJSZXBsYWNlLW9wczogIiA8PCByZXBsYWNlX29wcwotICAgICAgICAgICAgICAgICAgPDwgIiBaZXJvLW9wczogIiA8PCB6ZXJvX29wcyA8PCAiIENvcHktb3BzOiAiIDw8IGNvcHlfb3BzCi0gICAgICAgICAgICAgICAgICA8PCAiIFhvcl9vcHM6ICIgPDwgeG9yX29wcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiRGF0YSBvcHM6ICIgPDwgdG90YWxfb3BzIDw8ICJcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiUmVwbGFjZSBvcHM6ICIgPDwgcmVwbGFjZV9vcHMgPDwgIlxuIjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJaZXJvIG9wczogIiA8PCB6ZXJvX29wcyA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIkNvcHkgb3BzOiAiIDw8IGNvcHlfb3BzIDw8ICJcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWG9yIG9wczogIiA8PCB4b3Jfb3BzIDw8ICJcbiI7CiAgICAgfQogCiAgICAgcmV0dXJuIHN1Y2Nlc3M7CkBAIC0yMTUsNTUgKzI2NSwyMCBAQAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgaW50IGNoOwotICAgIHN0cnVjdCBhbmRyb2lkOjpzbmFwc2hvdDo6T3B0aW9ucyBvcHQ7Ci0gICAgb3B0LnNpbGVudCA9IGZhbHNlOwotICAgIG9wdC5kZWNvbXByZXNzID0gZmFsc2U7Ci0gICAgb3B0LnNob3dfYmFkID0gZmFsc2U7Ci0gICAgb3B0Lml0ZXJfdHlwZSA9IGFuZHJvaWQ6OnNuYXBzaG90OjpOb3JtYWw7Ci0gICAgb3B0LnZlcmlmeV9zZXF1ZW5jZSA9IGZhbHNlOwotICAgIG9wdC5pbmNsdWRlX21lcmdlZCA9IGZhbHNlOwotICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgInNkYm1ub2x2YSIpKSAhPSAtMSkgewotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICBvcHQuc2lsZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgIG9wdC5kZWNvbXByZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgIG9wdC5zaG93X2JhZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICBvcHQuaXRlcl90eXBlID0gYW5kcm9pZDo6c25hcHNob3Q6OlJldk1lcmdlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgICAgICAgb3B0Lml0ZXJfdHlwZSA9IGFuZHJvaWQ6OnNuYXBzaG90OjpNZXJnZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgICAgICAgIG9wdC5zaG93X3NlcSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICBvcHQuc2hvd19vcHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAndic6Ci0gICAgICAgICAgICAgICAgb3B0LnZlcmlmeV9zZXF1ZW5jZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICAgICAgICBvcHQuaW5jbHVkZV9tZXJnZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpzbmFwc2hvdDo6dXNhZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCBhbmRyb2lkOjpzbmFwc2hvdDo6TXlMb2dnZXIpOworICAgIGdmbGFnczo6UGFyc2VDb21tYW5kTGluZUZsYWdzKCZhcmdjLCAmYXJndiwgdHJ1ZSk7CiAKLSAgICBpZiAoYXJnYyA8IG9wdGluZCArIDEpIHsKLSAgICAgICAgYW5kcm9pZDo6c25hcHNob3Q6OnVzYWdlKCk7CisgICAgaWYgKGFyZ2MgPCAyKSB7CisgICAgICAgIGdmbGFnczo6U2hvd1VzYWdlV2l0aEZsYWdzKGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKEZMQUdTX29yZGVyICE9ICIiICYmIEZMQUdTX29yZGVyICE9ICJtZXJnZSIgJiYgRkxBR1Nfb3JkZXIgIT0gInJldmVyc2UtbWVyZ2UiKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiT3JkZXIgbXVzdCBlaXRoZXIgYmUgXCJtZXJnZVwiIG9yIFwicmV2ZXJzZS1tZXJnZVwiLlxuIjsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgaWYgKCFhbmRyb2lkOjpzbmFwc2hvdDo6SW5zcGVjdChhcmd2W29wdGluZF0sIG9wdCkpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCBhbmRyb2lkOjpzbmFwc2hvdDo6TXlMb2dnZXIpOworCisgICAgaWYgKCFhbmRyb2lkOjpzbmFwc2hvdDo6SW5zcGVjdChhcmd2WzFdKSkgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl9iYXNlLmggYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3YjMzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX2Jhc2UuaApAQCAtMCwwICsxLDU2IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitzdHJ1Y3QgVHJhbnNsYXRlZENvd09wcyB7CisgICAgQ293SGVhZGVyVjMgaGVhZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb25WMz4+IG9wczsKK307CisKK2NsYXNzIENvd1BhcnNlckJhc2UgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+Q293UGFyc2VyQmFzZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBQYXJzZShhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgY29uc3QgQ293SGVhZGVyVjMmIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwgPSB7fSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBUcmFuc2xhdGUoVHJhbnNsYXRlZENvd09wcyogb3V0KSA9IDA7CisgICAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPENvd0Zvb3Rlcj4gZm9vdGVyKCkgY29uc3QgeyByZXR1cm4gc3RkOjpudWxsb3B0OyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdWludDY0X3Q+PiB4b3JfZGF0YV9sb2MoKSB7CisgICAgICAgIHJldHVybiB4b3JfZGF0YV9sb2NfOworICAgIH07CisKKyAgICB1aW50NjRfdCBmZF9zaXplKCkgY29uc3QgeyByZXR1cm4gZmRfc2l6ZV87IH0KKyAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiYgbGFzdF9sYWJlbCgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfbGFiZWxfOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIENvd0hlYWRlclYzIGhlYWRlcl8gPSB7fTsKKyAgICB1aW50NjRfdCBmZF9zaXplXzsKKyAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYXN0X2xhYmVsXzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4+IHhvcl9kYXRhX2xvY18gPSB7fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk3N2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9wYXJzZXJfdjIuY3BwCkBAIC0wLDAgKzEsMjQzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNpbmNsdWRlICJwYXJzZXJfdjIuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZDsKKworYm9vbCBDb3dQYXJzZXJWMjo6UGFyc2UoYm9ycm93ZWRfZmQgZmQsIGNvbnN0IENvd0hlYWRlclYzJiBoZWFkZXIsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsKSB7CisgICAgYXV0byBwb3MgPSBsc2VlayhmZC5nZXQoKSwgMCwgU0VFS19FTkQpOworICAgIGlmIChwb3MgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBlbmQgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmZF9zaXplXyA9IHBvczsKKyAgICBoZWFkZXJfID0gaGVhZGVyOworCisgICAgaWYgKGhlYWRlcl8uZm9vdGVyX3NpemUgIT0gc2l6ZW9mKENvd0Zvb3RlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRm9vdGVyIHNpemUgdW5rbm93biwgcmVhZCAiIDw8IGhlYWRlcl8uZm9vdGVyX3NpemUgPDwgIiwgZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgICAgIDw8IHNpemVvZihDb3dGb290ZXIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChoZWFkZXJfLm9wX3NpemUgIT0gc2l6ZW9mKENvd09wZXJhdGlvblYyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJPcGVyYXRpb24gc2l6ZSB1bmtub3duLCByZWFkICIgPDwgaGVhZGVyXy5vcF9zaXplIDw8ICIsIGV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICA8PCBzaXplb2YoQ293T3BlcmF0aW9uVjIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChoZWFkZXJfLmNsdXN0ZXJfb3BzID09IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2x1c3RlcnMgbXVzdCBjb250YWluIGF0IGxlYXN0IHR3byBvcGVyYXRpb25zIHRvIGZ1bmN0aW9uLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyXy5wcmVmaXgubWFqb3JfdmVyc2lvbiA+IDIgfHwgaGVhZGVyXy5wcmVmaXgubWlub3JfdmVyc2lvbiAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkhlYWRlciB2ZXJzaW9uIG1pc21hdGNoLCAiCisgICAgICAgICAgICAgICAgICAgPDwgIm1ham9yIHZlcnNpb246ICIgPDwgaGVhZGVyXy5wcmVmaXgubWFqb3JfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGVkOiAiIDw8IGtDb3dWZXJzaW9uTWFqb3IKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBtaW5vciB2ZXJzaW9uOiAiIDw8IGhlYWRlcl8ucHJlZml4Lm1pbm9yX3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICA8PCAiLCBleHBlY3RlZDogIiA8PCBrQ293VmVyc2lvbk1pbm9yOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIFBhcnNlT3BzKGZkLCBsYWJlbCk7Cit9CisKK2Jvb2wgQ293UGFyc2VyVjI6OlBhcnNlT3BzKGJvcnJvd2VkX2ZkIGZkLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgeworICAgIHVpbnQ2NF90IHBvczsKKyAgICBhdXRvIHhvcl9kYXRhX2xvYyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4+KCk7CisKKyAgICAvLyBTa2lwIHRoZSBzY3JhdGNoIHNwYWNlCisgICAgaWYgKGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24gPj0gMiAmJiAoaGVhZGVyXy5idWZmZXJfc2l6ZSA+IDApKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIiBTY3JhdGNoIHNwYWNlIGZvdW5kIG9mIHNpemU6ICIgPDwgaGVhZGVyXy5idWZmZXJfc2l6ZTsKKyAgICAgICAgc2l6ZV90IGluaXRfb2Zmc2V0ID0gaGVhZGVyXy5wcmVmaXguaGVhZGVyX3NpemUgKyBoZWFkZXJfLmJ1ZmZlcl9zaXplOworICAgICAgICBwb3MgPSBsc2VlayhmZC5nZXQoKSwgaW5pdF9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKHBvcyAhPSBpbml0X29mZnNldCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIG9wcyBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcG9zID0gbHNlZWsoZmQuZ2V0KCksIGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplLCBTRUVLX1NFVCk7CisgICAgICAgIGlmIChwb3MgIT0gaGVhZGVyXy5wcmVmaXguaGVhZGVyX3NpemUpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBvcHMgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBSZWFkaW5nIGEgdjEgdmVyc2lvbiBvZiBDT1cgd2hpY2ggZG9lc24ndCBoYXZlIGJ1ZmZlcl9zaXplLgorICAgICAgICBoZWFkZXJfLmJ1ZmZlcl9zaXplID0gMDsKKyAgICB9CisgICAgdWludDY0X3QgZGF0YV9wb3MgPSAwOworCisgICAgaWYgKGhlYWRlcl8uY2x1c3Rlcl9vcHMpIHsKKyAgICAgICAgZGF0YV9wb3MgPSBwb3MgKyBoZWFkZXJfLmNsdXN0ZXJfb3BzICogc2l6ZW9mKENvd09wZXJhdGlvblYyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhX3BvcyA9IHBvcyArIHNpemVvZihDb3dPcGVyYXRpb25WMik7CisgICAgfQorCisgICAgYXV0byBvcHNfYnVmZmVyID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb25WMj4+KCk7CisgICAgdWludDY0X3QgY3VycmVudF9vcF9udW0gPSAwOworICAgIHVpbnQ2NF90IGNsdXN0ZXJfb3BzID0gaGVhZGVyXy5jbHVzdGVyX29wcyA/OiAxOworICAgIGJvb2wgZG9uZSA9IGZhbHNlOworCisgICAgLy8gQWx0ZXJuYXRpbmcgb3AgY2x1c3RlcnMgYW5kIGRhdGEKKyAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgICAgdWludDY0X3QgdG9fYWRkID0gc3RkOjptaW4oY2x1c3Rlcl9vcHMsIChmZF9zaXplXyAtIHBvcykgLyBzaXplb2YoQ293T3BlcmF0aW9uVjIpKTsKKyAgICAgICAgaWYgKHRvX2FkZCA9PSAwKSBicmVhazsKKyAgICAgICAgb3BzX2J1ZmZlci0+cmVzaXplKGN1cnJlbnRfb3BfbnVtICsgdG9fYWRkKTsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkoZmQsICZvcHNfYnVmZmVyLT5kYXRhKClbY3VycmVudF9vcF9udW1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19hZGQgKiBzaXplb2YoQ293T3BlcmF0aW9uVjIpKSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgb3AgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXJzZSBjdXJyZW50IGNsdXN0ZXIgdG8gZmluZCBzdGFydCBvZiBuZXh0IGNsdXN0ZXIKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRfb3BfbnVtIDwgb3BzX2J1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBhdXRvJiBjdXJyZW50X29wID0gb3BzX2J1ZmZlci0+ZGF0YSgpW2N1cnJlbnRfb3BfbnVtXTsKKyAgICAgICAgICAgIGN1cnJlbnRfb3BfbnVtKys7CisgICAgICAgICAgICBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dYb3JPcCkgeworICAgICAgICAgICAgICAgIHhvcl9kYXRhX2xvYy0+aW5zZXJ0KHtjdXJyZW50X29wLm5ld19ibG9jaywgZGF0YV9wb3N9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyArPSBzaXplb2YoQ293T3BlcmF0aW9uVjIpICsgR2V0TmV4dE9wT2Zmc2V0KGN1cnJlbnRfb3AsIGhlYWRlcl8uY2x1c3Rlcl9vcHMpOworICAgICAgICAgICAgZGF0YV9wb3MgKz0gY3VycmVudF9vcC5kYXRhX2xlbmd0aCArIEdldE5leHREYXRhT2Zmc2V0KGN1cnJlbnRfb3AsIGhlYWRlcl8uY2x1c3Rlcl9vcHMpOworCisgICAgICAgICAgICBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dMYWJlbE9wKSB7CisgICAgICAgICAgICAgICAgbGFzdF9sYWJlbF8gPSB7Y3VycmVudF9vcC5zb3VyY2V9OworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2ggdGhlIHJlcXVlc3RlZCBsYWJlbCwgc3RvcCByZWFkaW5nLgorICAgICAgICAgICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC52YWx1ZSgpID09IGN1cnJlbnRfb3Auc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293Rm9vdGVyT3ApIHsKKyAgICAgICAgICAgICAgICBmb290ZXJfLmVtcGxhY2UoKTsKKyAgICAgICAgICAgICAgICBDb3dGb290ZXIqIGZvb3RlciA9ICZmb290ZXJfLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZmb290ZXJfLT5vcCwgJmN1cnJlbnRfb3AsIHNpemVvZihmb290ZXItPm9wKSk7CisgICAgICAgICAgICAgICAgb2ZmX3Qgb2ZmcyA9IGxzZWVrKGZkLmdldCgpLCBwb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBpZiAob2ZmcyA8IDAgfHwgcG9zICE9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihvZmZzKSkgeworICAgICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgbmV4dCBvcCBmYWlsZWQgIiA8PCBvZmZzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGZkLCAmZm9vdGVyLT51bnVzZWQsIHNpemVvZihmb290ZXItPnVudXNlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCByZWFkIENPVyBmb290ZXIiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRHJvcCB0aGUgZm9vdGVyIGZyb20gdGhlIG9wIHN0cmVhbS4KKyAgICAgICAgICAgICAgICBjdXJyZW50X29wX251bS0tOworICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUG9zaXRpb24gZm9yIG5leHQgY2x1c3RlciByZWFkCisgICAgICAgIG9mZl90IG9mZnMgPSBsc2VlayhmZC5nZXQoKSwgcG9zLCBTRUVLX1NFVCk7CisgICAgICAgIGlmIChvZmZzIDwgMCB8fCBwb3MgIT0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG9mZnMpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgbmV4dCBvcCBmYWlsZWQgIiA8PCBvZmZzOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG9wc19idWZmZXItPnJlc2l6ZShjdXJyZW50X29wX251bSk7CisgICAgfQorCisgICAgTE9HKERFQlVHKSA8PCAiQ09XIGZpbGUgcmVhZCBjb21wbGV0ZS4gVG90YWwgb3BzOiAiIDw8IG9wc19idWZmZXItPnNpemUoKTsKKyAgICAvLyBUbyBzdWNjZXNzZnVsbHkgcGFyc2UgYSBDT1cgZmlsZSwgd2UgbmVlZCBlaXRoZXI6CisgICAgLy8gICgxKSBhIGxhYmVsIHRvIHJlYWQgdXAgdG8sIGFuZCBmb3IgdGhhdCBsYWJlbCB0byBiZSBmb3VuZCwgb3IKKyAgICAvLyAgKDIpIGEgdmFsaWQgZm9vdGVyLgorICAgIGlmIChsYWJlbCkgeworICAgICAgICBpZiAoIWxhc3RfbGFiZWxfKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJEaWQgbm90IGZpbmQgbGFiZWwgIiA8PCBsYWJlbC52YWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2hpbGUgcmVhZGluZyBDT1cgKG5vIGxhYmVscyBmb3VuZCkiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChsYXN0X2xhYmVsXy52YWx1ZSgpICE9IGxhYmVsLnZhbHVlKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkRpZCBub3QgZmluZCBsYWJlbCAiIDw8IGxhYmVsLnZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgbGFzdCBsYWJlbD0iIDw8IGxhc3RfbGFiZWxfLnZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFmb290ZXJfKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIENPVyBmb290ZXIgZm91bmQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDhfdCBjc3VtWzMyXTsKKyAgICBtZW1zZXQoY3N1bSwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogMzIpOworCisgICAgaWYgKGZvb3Rlcl8pIHsKKyAgICAgICAgaWYgKG9wc19idWZmZXItPnNpemUoKSAhPSBmb290ZXJfLT5vcC5udW1fb3BzKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJudW0gb3BzIGRvZXMgbm90IG1hdGNoLCBleHBlY3RlZCAiIDw8IGZvb3Rlcl8tPm9wLm51bV9vcHMgPDwgIiwgZm91bmQgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBvcHNfYnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wc19idWZmZXItPnNpemUoKSAqIHNpemVvZihDb3dPcGVyYXRpb25WMikgIT0gZm9vdGVyXy0+b3Aub3BzX3NpemUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIm9wcyBzaXplIGRvZXMgbm90IG1hdGNoICI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2Ml9vcHNfID0gb3BzX2J1ZmZlcjsKKyAgICB2Ml9vcHNfLT5zaHJpbmtfdG9fZml0KCk7CisgICAgeG9yX2RhdGFfbG9jXyA9IHhvcl9kYXRhX2xvYzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3dQYXJzZXJWMjo6VHJhbnNsYXRlKFRyYW5zbGF0ZWRDb3dPcHMqIG91dCkgeworICAgIG91dC0+b3BzID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb25WMz4+KHYyX29wc18tPnNpemUoKSk7CisKKyAgICAvLyBUcmFuc2xhdGUgdGhlIG9wZXJhdGlvbiBidWZmZXIgZnJvbSBvbiBkaXNrIHRvIGluIG1lbW9yeQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0LT5vcHMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIHYyX29wID0gdjJfb3BzXy0+YXQoaSk7CisKKyAgICAgICAgYXV0byYgbmV3X29wID0gb3V0LT5vcHMtPmF0KGkpOworICAgICAgICBuZXdfb3Auc2V0X3R5cGUodjJfb3AudHlwZSk7CisgICAgICAgIG5ld19vcC5kYXRhX2xlbmd0aCA9IHYyX29wLmRhdGFfbGVuZ3RoOworCisgICAgICAgIGlmICh2Ml9vcC5uZXdfYmxvY2sgPiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk91dC1vZi1yYW5nZSBuZXcgYmxvY2sgaW4gQ09XIG9wOiAiIDw8IHYyX29wOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5ld19vcC5uZXdfYmxvY2sgPSB2Ml9vcC5uZXdfYmxvY2s7CisKKyAgICAgICAgdWludDY0X3Qgc291cmNlX2luZm8gPSB2Ml9vcC5zb3VyY2U7CisgICAgICAgIGlmIChuZXdfb3AudHlwZSgpICE9IGtDb3dMYWJlbE9wKSB7CisgICAgICAgICAgICBzb3VyY2VfaW5mbyAmPSBrQ293T3BTb3VyY2VJbmZvRGF0YU1hc2s7CisgICAgICAgICAgICBpZiAoc291cmNlX2luZm8gIT0gdjJfb3Auc291cmNlKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiT3V0LW9mLXJhbmdlIHNvdXJjZSB2YWx1ZSBpbiBDT1cgb3A6ICIgPDwgdjJfb3A7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2Ml9vcC5jb21wcmVzc2lvbiAhPSBrQ293Q29tcHJlc3NOb25lKSB7CisgICAgICAgICAgICBpZiAoaGVhZGVyXy5jb21wcmVzc2lvbl9hbGdvcml0aG0gPT0ga0Nvd0NvbXByZXNzTm9uZSkgeworICAgICAgICAgICAgICAgIGhlYWRlcl8uY29tcHJlc3Npb25fYWxnb3JpdGhtID0gdjJfb3AuY29tcHJlc3Npb247CisgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlcl8uY29tcHJlc3Npb25fYWxnb3JpdGhtICE9IHYyX29wLmNvbXByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ09XIGhhcyBtaXhlZCBjb21wcmVzc2lvbiB0eXBlcyB3aGljaCBpcyBub3Qgc3VwcG9ydGVkOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcHJldmlvdXNseSBzYXcgIiA8PCBoZWFkZXJfLmNvbXByZXNzaW9uX2FsZ29yaXRobSA8PCAiLCBnb3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdjJfb3AuY29tcHJlc3Npb24gPDwgIiwgb3A6ICIgPDwgdjJfb3A7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5ld19vcC5zZXRfc291cmNlKHNvdXJjZV9pbmZvKTsKKyAgICB9CisKKyAgICBvdXQtPmhlYWRlciA9IGhlYWRlcl87CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YyLmggYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZWUyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92Mi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90X2Nvdy9wYXJzZXJfYmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitjbGFzcyBDb3dQYXJzZXJWMiBmaW5hbCA6IHB1YmxpYyBDb3dQYXJzZXJCYXNlIHsKKyAgcHVibGljOgorICAgIGJvb2wgUGFyc2UoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGNvbnN0IENvd0hlYWRlclYzJiBoZWFkZXIsCisgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCA9IHt9KSBvdmVycmlkZTsKKyAgICBib29sIFRyYW5zbGF0ZShUcmFuc2xhdGVkQ293T3BzKiBvdXQpIG92ZXJyaWRlOworICAgIHN0ZDo6b3B0aW9uYWw8Q293Rm9vdGVyPiBmb290ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmb290ZXJfOyB9CisKKyAgICBjb25zdCBDb3dIZWFkZXImIGhlYWRlcigpIGNvbnN0IHsgcmV0dXJuIGhlYWRlcl87IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uVjI+PiBnZXRfdjJvcHMoKSB7IHJldHVybiB2Ml9vcHNfOyB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIFBhcnNlT3BzKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvblYyPj4gdjJfb3BzXzsKKyAgICBzdGQ6Om9wdGlvbmFsPENvd0Zvb3Rlcj4gZm9vdGVyXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZkMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9wYXJzZXJfdjMuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNpbmNsdWRlICJwYXJzZXJfdjMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorCisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQ7CisKK2Jvb2wgQ293UGFyc2VyVjM6OlBhcnNlKGJvcnJvd2VkX2ZkIGZkLCBjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgeworICAgIGF1dG8gcG9zID0gbHNlZWsoZmQuZ2V0KCksIDAsIFNFRUtfRU5EKTsKKyAgICBpZiAocG9zIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgZW5kIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmRfc2l6ZV8gPSBwb3M7CisgICAgaGVhZGVyXyA9IGhlYWRlcjsKKworICAgIGlmIChoZWFkZXJfLmZvb3Rlcl9zaXplICE9IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRm9vdGVyIHNpemUgaXNuJ3QgMCwgcmVhZCAiIDw8IGhlYWRlcl8uZm9vdGVyX3NpemU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyXy5vcF9zaXplICE9IHNpemVvZihDb3dPcGVyYXRpb25WMykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiT3BlcmF0aW9uIHNpemUgdW5rbm93biwgcmVhZCAiIDw8IGhlYWRlcl8ub3Bfc2l6ZSA8PCAiLCBleHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgPDwgc2l6ZW9mKENvd09wZXJhdGlvblYzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaGVhZGVyXy5jbHVzdGVyX29wcyAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNsdXN0ZXIgb3BzIG5vdCBzdXBwb3J0ZWQgaW4gdjMiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24gIT0gMyB8fCBoZWFkZXJfLnByZWZpeC5taW5vcl92ZXJzaW9uICE9IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGVhZGVyIHZlcnNpb24gbWlzbWF0Y2gsICIKKyAgICAgICAgICAgICAgICAgICA8PCAibWFqb3IgdmVyc2lvbjogIiA8PCBoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgPDwgIiwgZXhwZWN0ZWQ6ICIgPDwga0Nvd1ZlcnNpb25NYWpvcgorICAgICAgICAgICAgICAgICAgIDw8ICIsIG1pbm9yIHZlcnNpb246ICIgPDwgaGVhZGVyXy5wcmVmaXgubWlub3JfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGVkOiAiIDw8IGtDb3dWZXJzaW9uTWlub3I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBvcF9pbmRleCA9IGhlYWRlcl8ub3BfY291bnQ7CisgICAgaWYgKGxhYmVsKSB7CisgICAgICAgIGlmICghUmVhZFJlc3VtZUJ1ZmZlcihmZCkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCByZXN1bWUgYnVmZmVyIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBvcF9pbmRleCA9IEZpbmRSZXN1bWVPcChsYWJlbC52YWx1ZSgpKTsKKyAgICAgICAgaWYgKG9wX2luZGV4ID09IHN0ZDo6bnVsbG9wdCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIGdldCBvcCBpbmRleCBmcm9tIGdpdmVuIGxhYmVsOiAiIDw8IGxhYmVsLnZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gUGFyc2VPcHMoZmQsIG9wX2luZGV4LnZhbHVlKCkpOworfQorCitib29sIENvd1BhcnNlclYzOjpSZWFkUmVzdW1lQnVmZmVyKGJvcnJvd2VkX2ZkIGZkKSB7CisgICAgcmVzdW1lX3BvaW50c18gPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPFJlc3VtZVBvaW50Pj4oaGVhZGVyXy5yZXN1bWVfcG9pbnRfY291bnQpOworCisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGZkLCByZXN1bWVfcG9pbnRzXy0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfLnJlc3VtZV9wb2ludF9jb3VudCAqIHNpemVvZihSZXN1bWVQb2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFJlc3VtZU9mZnNldChoZWFkZXJfKSk7Cit9CisKK3N0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IENvd1BhcnNlclYzOjpGaW5kUmVzdW1lT3AoY29uc3QgdWludDY0X3QgbGFiZWwpIHsKKyAgICBmb3IgKGF1dG8mIHJlc3VtZV9wb2ludCA6ICpyZXN1bWVfcG9pbnRzXykgeworICAgICAgICBpZiAocmVzdW1lX3BvaW50LmxhYmVsID09IGxhYmVsKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdW1lX3BvaW50Lm9wX2luZGV4OworICAgICAgICB9CisgICAgfQorICAgIExPRyhFUlJPUikgPDwgImZhaWxlZCB0byBmaW5kIGxhYmVsOiAiIDw8IGxhYmVsIDw8ICJmcm9tIGZvbGxvd2luZyBsYWJlbHMiOworICAgIExPRyhFUlJPUikgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbigqcmVzdW1lX3BvaW50c18sICIgIik7CisKKyAgICByZXR1cm4gc3RkOjpudWxsb3B0OworfQorCitib29sIENvd1BhcnNlclYzOjpQYXJzZU9wcyhib3Jyb3dlZF9mZCBmZCwgY29uc3QgdWludDMyX3Qgb3BfaW5kZXgpIHsKKyAgICBvcHNfID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb25WMz4+KCk7CisgICAgb3BzXy0+cmVzaXplKG9wX2luZGV4KTsKKworICAgIC8vIHJlYWQgYmVnaW5uaW5nIG9mIG9wZXJhdGlvbiBidWZmZXIgLT4gc28gb3BfaW5kZXggPSAwCisgICAgY29uc3Qgb2ZmX3Qgb2Zmc2V0ID0gR2V0T3BPZmZzZXQoMCwgaGVhZGVyXyk7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChmZCwgb3BzXy0+ZGF0YSgpLCBvcHNfLT5zaXplKCkgKiBzaXplb2YoQ293T3BlcmF0aW9uVjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVhZCBvcHMgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGZpbGwgb3V0IG1hcHBpbmcgb2YgWE9SIG9wIGRhdGEgbG9jYXRpb24KKyAgICB1aW50NjRfdCBkYXRhX3BvcyA9IEdldERhdGFPZmZzZXQoaGVhZGVyXyk7CisKKyAgICB4b3JfZGF0YV9sb2NfID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHVpbnQ2NF90Pj4oKTsKKworICAgIGZvciAoYXV0byBvcCA6ICpvcHNfKSB7CisgICAgICAgIGlmIChvcC50eXBlKCkgPT0ga0Nvd1hvck9wKSB7CisgICAgICAgICAgICB4b3JfZGF0YV9sb2NfLT5pbnNlcnQoe29wLm5ld19ibG9jaywgZGF0YV9wb3N9KTsKKyAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgaWYgKGRhdGFfcG9zICE9IG9wLnNvdXJjZSgpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBkYXRhIGxvY2F0aW9uIGZvciBvcGVyYXRpb24gIiA8PCBvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZXhwZWN0ZWQ6ICIgPDwgZGF0YV9wb3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRhdGFfcG9zICs9IG9wLmRhdGFfbGVuZ3RoOworICAgIH0KKyAgICAvLyA6VE9ETzogc2VxdWVuY2UgYnVmZmVyICYgcmVzdW1lIGJ1ZmZlciBmb2xsb3cKKyAgICAvLyBPbmNlIHdlIGltcGxlbWVudCBsYWJlbHMsIHdlJ2xsIGhhdmUgdG8gZGlzY2FyZCB1bnVzZWQgb3BzIGFuZCBhZGp1c3QKKyAgICAvLyB0aGUgaGVhZGVyIGFzIG5lZWRlZC4KKworICAgIG9wc18tPnNocmlua190b19maXQoKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvd1BhcnNlclYzOjpUcmFuc2xhdGUoVHJhbnNsYXRlZENvd09wcyogb3V0KSB7CisgICAgb3V0LT5vcHMgPSBvcHNfOworICAgIG91dC0+aGVhZGVyID0gaGVhZGVyXzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9wYXJzZXJfdjMuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjMDFhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YzLmgKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90X2Nvdy9wYXJzZXJfYmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitjbGFzcyBDb3dQYXJzZXJWMyBmaW5hbCA6IHB1YmxpYyBDb3dQYXJzZXJCYXNlIHsKKyAgcHVibGljOgorICAgIGJvb2wgUGFyc2UoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGNvbnN0IENvd0hlYWRlclYzJiBoZWFkZXIsCisgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCA9IHt9KSBvdmVycmlkZTsKKyAgICBib29sIFRyYW5zbGF0ZShUcmFuc2xhdGVkQ293T3BzKiBvdXQpIG92ZXJyaWRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxSZXN1bWVQb2ludD4+IHJlc3VtZV9wb2ludHMoKSBjb25zdCB7IHJldHVybiByZXN1bWVfcG9pbnRzXzsgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBQYXJzZU9wcyhhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgY29uc3QgdWludDMyX3Qgb3BfaW5kZXgpOworICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IEZpbmRSZXN1bWVPcChjb25zdCB1aW50NjRfdCBsYWJlbCk7CisgICAgQ293SGVhZGVyVjMgaGVhZGVyXyA9IHt9OworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb25WMz4+IG9wc187CisgICAgYm9vbCBSZWFkUmVzdW1lQnVmZmVyKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8UmVzdW1lUG9pbnQ+PiByZXN1bWVfcG9pbnRzXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTkwYTBmCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9zbmFwc2hvdF9yZWFkZXIuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSAic25hcHNob3RfcmVhZGVyLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkOworCitDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OkNvbXByZXNzZWRTbmFwc2hvdFJlYWRlcihzdGQ6OnVuaXF1ZV9wdHI8SUNvd1JlYWRlcj4mJiBjb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc291cmNlX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGJsb2NrX2Rldl9zaXplKQorICAgIDogY293XyhzdGQ6Om1vdmUoY293KSksCisgICAgICBibG9ja19zaXplXyhjb3dfLT5HZXRIZWFkZXIoKS5ibG9ja19zaXplKSwKKyAgICAgIHNvdXJjZV9kZXZpY2VfKHNvdXJjZV9kZXZpY2UpLAorICAgICAgYmxvY2tfZGV2aWNlX3NpemVfKGJsb2NrX2Rldl9zaXplLnZhbHVlX29yKDApKSB7CisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gY293Xy0+R2V0SGVhZGVyKCk7CisgICAgYmxvY2tfc2l6ZV8gPSBoZWFkZXIuYmxvY2tfc2l6ZTsKKworICAgIC8vIFBvcHVsYXRlIHRoZSBvcGVyYXRpb24gbWFwLgorICAgIG9wX2l0ZXJfID0gY293Xy0+R2V0T3BJdGVyKGZhbHNlKTsKKyAgICB3aGlsZSAoIW9wX2l0ZXJfLT5BdEVuZCgpKSB7CisgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSBvcF9pdGVyXy0+R2V0KCk7CisgICAgICAgIGlmIChJc01ldGFkYXRhT3AoKm9wKSkgeworICAgICAgICAgICAgb3BfaXRlcl8tPk5leHQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID49IG9wc18uc2l6ZSgpKSB7CisgICAgICAgICAgICBvcHNfLnJlc2l6ZShvcC0+bmV3X2Jsb2NrICsgMSwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgb3BzX1tvcC0+bmV3X2Jsb2NrXSA9IG9wOworICAgICAgICBvcF9pdGVyXy0+TmV4dCgpOworICAgIH0KK30KKworLy8gTm90IHN1cHBvcnRlZC4KK2Jvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpPcGVuKGNvbnN0IGNoYXIqLCBpbnQsIG1vZGVfdCkgeworICAgIGVycm5vID0gRUlOVkFMOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6Ok9wZW4oY29uc3QgY2hhciosIGludCkgeworICAgIGVycm5vID0gRUlOVkFMOworICAgIHJldHVybiBmYWxzZTsKK30KKworc3NpemVfdCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OldyaXRlKGNvbnN0IHZvaWQqLCBzaXplX3QpIHsKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpCbGtJb2N0bChpbnQsIHVpbnQ2NF90LCB1aW50NjRfdCwgaW50KikgeworICAgIGVycm5vID0gRUlOVkFMOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9ycm93ZWRfZmQgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpHZXRTb3VyY2VGZCgpIHsKKyAgICBpZiAoc291cmNlX2ZkXyA8IDApIHsKKyAgICAgICAgaWYgKCFzb3VyY2VfZGV2aWNlXykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIG5lZWRzIHNvdXJjZSBkZXZpY2UsIGJ1dCBub25lIHdhcyBzZXQiOworICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgICAgICByZXR1cm4gey0xfTsKKyAgICAgICAgfQorICAgICAgICBzb3VyY2VfZmRfLnJlc2V0KG9wZW4oc291cmNlX2RldmljZV8tPmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgICAgIGlmIChzb3VyY2VfZmRfIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIm9wZW4gIiA8PCAqc291cmNlX2RldmljZV87CisgICAgICAgICAgICByZXR1cm4gey0xfTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc291cmNlX2ZkXzsKK30KKworc3NpemVfdCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OlJlYWQodm9pZCogYnVmLCBzaXplX3QgY291bnQpIHsKKyAgICAvLyBGaW5kIHRoZSBzdGFydCBhbmQgZW5kIGNodW5rcywgaW5jbHVzaXZlLgorICAgIHVpbnQ2NF90IHN0YXJ0X2NodW5rID0gb2Zmc2V0XyAvIGJsb2NrX3NpemVfOworICAgIHVpbnQ2NF90IGVuZF9jaHVuayA9IChvZmZzZXRfICsgY291bnQgLSAxKSAvIGJsb2NrX3NpemVfOworCisgICAgLy8gQ2hvcCBvZmYgdGhlIGZpcnN0IE4gYnl0ZXMgaWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBibG9jay1hbGlnbmVkLgorICAgIHNpemVfdCBzdGFydF9vZmZzZXQgPSBvZmZzZXRfICUgYmxvY2tfc2l6ZV87CisKKyAgICB1aW50OF90KiBidWZfcG9zID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmKTsKKyAgICBzaXplX3QgYnVmX3JlbWFpbmluZyA9IGNvdW50OworCisgICAgc2l6ZV90IGluaXRpYWxfYnl0ZXMgPSBzdGQ6Om1pbihibG9ja19zaXplXyAtIHN0YXJ0X29mZnNldCwgYnVmX3JlbWFpbmluZyk7CisgICAgc3NpemVfdCBydiA9IFJlYWRCbG9jayhzdGFydF9jaHVuaywgc3RhcnRfb2Zmc2V0LCBidWZfcG9zLCBpbml0aWFsX2J5dGVzKTsKKyAgICBpZiAocnYgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2Zmc2V0XyArPSBydjsKKyAgICBidWZfcG9zICs9IHJ2OworICAgIGJ1Zl9yZW1haW5pbmcgLT0gcnY7CisKKyAgICBmb3IgKHVpbnQ2NF90IGNodW5rID0gc3RhcnRfY2h1bmsgKyAxOyBjaHVuayA8IGVuZF9jaHVuazsgY2h1bmsrKykgeworICAgICAgICBzc2l6ZV90IHJ2ID0gUmVhZEJsb2NrKGNodW5rLCAwLCBidWZfcG9zLCBidWZfcmVtYWluaW5nKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG9mZnNldF8gKz0gcnY7CisgICAgICAgIGJ1Zl9wb3MgKz0gcnY7CisgICAgICAgIGJ1Zl9yZW1haW5pbmcgLT0gcnY7CisgICAgfQorCisgICAgaWYgKGJ1Zl9yZW1haW5pbmcpIHsKKyAgICAgICAgc3NpemVfdCBydiA9IFJlYWRCbG9jayhlbmRfY2h1bmssIDAsIGJ1Zl9wb3MsIGJ1Zl9yZW1haW5pbmcpOworICAgICAgICBpZiAocnYgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0XyArPSBydjsKKyAgICAgICAgYnVmX3BvcyArPSBydjsKKyAgICAgICAgYnVmX3JlbWFpbmluZyAtPSBydjsKKyAgICB9CisKKyAgICBDSEVDS19FUShidWZfcG9zIC0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmKSwgY291bnQpOworICAgIENIRUNLX0VRKGJ1Zl9yZW1haW5pbmcsIDApOworCisgICAgZXJybm8gPSAwOworICAgIHJldHVybiBjb3VudDsKK30KKworc3NpemVfdCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OlJlYWRCbG9jayh1aW50NjRfdCBjaHVuaywgc2l6ZV90IHN0YXJ0X29mZnNldCwgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUpIHsKKyAgICBzaXplX3QgYnl0ZXNfdG9fcmVhZCA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHNpemVfdD4oYmxvY2tfc2l6ZV8pLCBidWZmZXJfc2l6ZSk7CisKKyAgICAvLyBUaGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBjaHVuazsgd2Ugc2hvdWxkIGJlIHJlYWRpbmcgbm8gbW9yZSB0aGFuCisgICAgLy8gb25lIGNodW5rLgorICAgIENIRUNLKHN0YXJ0X29mZnNldCArIGJ5dGVzX3RvX3JlYWQgPD0gYmxvY2tfc2l6ZV8pOworCisgICAgY29uc3QgQ293T3BlcmF0aW9uKiBvcCA9IG51bGxwdHI7CisgICAgaWYgKGNodW5rIDwgb3BzXy5zaXplKCkpIHsKKyAgICAgICAgb3AgPSBvcHNfW2NodW5rXTsKKyAgICB9CisKKyAgICBpZiAoIW9wIHx8IG9wLT50eXBlKCkgPT0ga0Nvd0NvcHlPcCkgeworICAgICAgICBib3Jyb3dlZF9mZCBmZCA9IEdldFNvdXJjZUZkKCk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIC8vIEdldFNvdXJjZUZkIHNldHMgZXJybm8uCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3ApIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNvdXJjZV9vZmZzZXQ7CisgICAgICAgICAgICBpZiAoIWNvd18tPkdldFNvdXJjZU9mZnNldChvcCwgJnNvdXJjZV9vZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiR2V0U291cmNlT2Zmc2V0IGZhaWxlZCBpbiBDb21wcmVzc2VkU25hcHNob3RSZWFkZXIgZm9yIG9wOiAiIDw8ICpvcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaHVuayA9IEdldEJsb2NrRnJvbU9mZnNldChjb3dfLT5HZXRIZWFkZXIoKSwgc291cmNlX29mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBvZmY2NF90IG9mZnNldCA9IChjaHVuayAqIGJsb2NrX3NpemVfKSArIHN0YXJ0X29mZnNldDsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChmZCwgYnVmZmVyLCBieXRlc190b19yZWFkLCBvZmZzZXQpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVhZCAiIDw8ICpzb3VyY2VfZGV2aWNlXzsKKyAgICAgICAgICAgIC8vIFJlYWRGdWxseUF0T2Zmc2V0IHNldHMgZXJybm8uCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1plcm9PcCkgeworICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBieXRlc190b19yZWFkKTsKKyAgICB9IGVsc2UgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICBpZiAoY293Xy0+UmVhZERhdGEob3AsIGJ1ZmZlciwgYnl0ZXNfdG9fcmVhZCwgc3RhcnRfb2Zmc2V0KSA8IGJ5dGVzX3RvX3JlYWQpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXByZXNzZWRTbmFwc2hvdFJlYWRlciBmYWlsZWQgdG8gcmVhZCByZXBsYWNlIG9wIjsKKyAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvcC0+dHlwZSgpID09IGtDb3dYb3JPcCkgeworICAgICAgICBib3Jyb3dlZF9mZCBmZCA9IEdldFNvdXJjZUZkKCk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIC8vIEdldFNvdXJjZUZkIHNldHMgZXJybm8uCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCBzb3VyY2Vfb2Zmc2V0OworICAgICAgICBpZiAoIWNvd18tPkdldFNvdXJjZU9mZnNldChvcCwgJnNvdXJjZV9vZmZzZXQpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJHZXRTb3VyY2VPZmZzZXQgZmFpbGVkIGluIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlciBmb3Igb3A6ICIgPDwgKm9wOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gc291cmNlX29mZnNldCArIHN0YXJ0X29mZnNldDsKKworICAgICAgICBzdGQ6OnN0cmluZyBkYXRhKGJ5dGVzX3RvX3JlYWQsICdcMCcpOworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGZkLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIG9mZnNldCkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWFkICIgPDwgKnNvdXJjZV9kZXZpY2VfOworICAgICAgICAgICAgLy8gUmVhZEZ1bGx5QXRPZmZzZXQgc2V0cyBlcnJuby4KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3dfLT5SZWFkRGF0YShvcCwgYnVmZmVyLCBieXRlc190b19yZWFkLCBzdGFydF9vZmZzZXQpIDwgYnl0ZXNfdG9fcmVhZCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIGZhaWxlZCB0byByZWFkIHhvciBvcCI7CisgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnl0ZXNfdG9fcmVhZDsgaSsrKSB7CisgICAgICAgICAgICAoKGNoYXIqKWJ1ZmZlcilbaV0gXj0gZGF0YVtpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXByZXNzZWRTbmFwc2hvdFJlYWRlciB1bmtub3duIG9wIHR5cGU6ICIgPDwgdWludDMyX3Qob3AtPnR5cGUoKSk7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gTWVtb3J5Qnl0ZVNpbmsgZG9lc24ndCBkbyBhbnl0aGluZyBpbiBSZXR1cm5CdWZmZXIsIHNvIGRvbid0IGJvdGhlciBjYWxsaW5nIGl0LgorICAgIHJldHVybiBieXRlc190b19yZWFkOworfQorCitvZmY2NF90IENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6U2VlayhvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgeworICAgIHN3aXRjaCAod2hlbmNlKSB7CisgICAgICAgIGNhc2UgU0VFS19TRVQ6CisgICAgICAgICAgICBvZmZzZXRfID0gb2Zmc2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VFS19FTkQ6CisgICAgICAgICAgICBvZmZzZXRfID0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4oYmxvY2tfZGV2aWNlX3NpemVfKSArIG9mZnNldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICAgICAgb2Zmc2V0XyArPSBvZmZzZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBzZWVrIHdoZW5jZTogIiA8PCB3aGVuY2U7CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIG9mZnNldF87Cit9CisKK3VpbnQ2NF90IENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6QmxvY2tEZXZTaXplKCkgeworICAgIHJldHVybiBibG9ja19kZXZpY2Vfc2l6ZV87Cit9CisKK2Jvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpDbG9zZSgpIHsKKyAgICBjb3dfID0gbnVsbHB0cjsKKyAgICBzb3VyY2VfZmRfID0ge307CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpJc1NldHRpbmdFcnJubygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OklzT3BlbigpIHsKKyAgICByZXR1cm4gY293XyAhPSBudWxscHRyOworfQorCitib29sIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6Rmx1c2goKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3JlYWRlci5oCnJlbmFtZSB0byBmc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3NuYXBzaG90X3JlYWRlci5oCmluZGV4IGEzZTdlMjIuLjNkZTYzZWQgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXIuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3NuYXBzaG90X3JlYWRlci5oCkBAIC0yNiwxOCArMjYsMTYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKLWNsYXNzIFJlYWRPbmx5RmlsZURlc2NyaXB0b3IgOiBwdWJsaWMgY2hyb21lb3NfdXBkYXRlX2VuZ2luZTo6RmlsZURlc2NyaXB0b3IgeworY2xhc3MgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIDogcHVibGljIGNocm9tZW9zX3VwZGF0ZV9lbmdpbmU6OkZpbGVEZXNjcmlwdG9yIHsKICAgcHVibGljOgorICAgIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcihzdGQ6OnVuaXF1ZV9wdHI8SUNvd1JlYWRlcj4mJiBjb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzb3VyY2VfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBibG9ja19kZXZfc2l6ZSk7CisKICAgICBib29sIE9wZW4oY29uc3QgY2hhciogcGF0aCwgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CiAgICAgYm9vbCBPcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGludCBmbGFncykgb3ZlcnJpZGU7CiAgICAgc3NpemVfdCBXcml0ZShjb25zdCB2b2lkKiBidWYsIHNpemVfdCBjb3VudCkgb3ZlcnJpZGU7CiAgICAgYm9vbCBCbGtJb2N0bChpbnQgcmVxdWVzdCwgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbmd0aCwgaW50KiByZXN1bHQpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgUmVhZEZkRmlsZURlc2NyaXB0b3IgOiBwdWJsaWMgUmVhZE9ubHlGaWxlRGVzY3JpcHRvciB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBSZWFkRmRGaWxlRGVzY3JpcHRvcihhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCk7Ci0KICAgICBzc2l6ZV90IFJlYWQodm9pZCogYnVmLCBzaXplX3QgY291bnQpIG92ZXJyaWRlOwogICAgIG9mZjY0X3QgU2VlayhvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgb3ZlcnJpZGU7CiAgICAgdWludDY0X3QgQmxvY2tEZXZTaXplKCkgb3ZlcnJpZGU7CkBAIC00NywyOSArNDUsMTAgQEAKICAgICBib29sIEZsdXNoKCkgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmRfOwotfTsKLQotY2xhc3MgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIDogcHVibGljIFJlYWRPbmx5RmlsZURlc2NyaXB0b3IgewotICBwdWJsaWM6Ci0gICAgYm9vbCBTZXRDb3coc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4mJiBjb3cpOwotICAgIHZvaWQgU2V0U291cmNlRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfZGV2aWNlKTsKLSAgICB2b2lkIFNldEJsb2NrRGV2aWNlU2l6ZSh1aW50NjRfdCBibG9ja19kZXZpY2Vfc2l6ZSk7Ci0KLSAgICBzc2l6ZV90IFJlYWQodm9pZCogYnVmLCBzaXplX3QgY291bnQpIG92ZXJyaWRlOwotICAgIG9mZjY0X3QgU2VlayhvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgb3ZlcnJpZGU7Ci0gICAgdWludDY0X3QgQmxvY2tEZXZTaXplKCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBDbG9zZSgpIG92ZXJyaWRlOwotICAgIGJvb2wgSXNTZXR0aW5nRXJybm8oKSBvdmVycmlkZTsKLSAgICBib29sIElzT3BlbigpIG92ZXJyaWRlOwotICAgIGJvb2wgRmx1c2goKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIHNzaXplX3QgUmVhZEJsb2NrKHVpbnQ2NF90IGNodW5rLCBJQnl0ZVNpbmsqIHNpbmssIHNpemVfdCBzdGFydF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4mIG1heF9ieXRlcyA9IHt9KTsKKyAgICBzc2l6ZV90IFJlYWRCbG9jayh1aW50NjRfdCBjaHVuaywgc2l6ZV90IHN0YXJ0X29mZnNldCwgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAgICAgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgR2V0U291cmNlRmQoKTsKIAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IGNvd187CisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dSZWFkZXI+IGNvd187CiAgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dPcEl0ZXI+IG9wX2l0ZXJfOwogICAgIHVpbnQzMl90IGJsb2NrX3NpemVfID0gMDsKIApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3JlYWRlcl90ZXN0LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIGZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXJfdGVzdC5jcHAKcmVuYW1lIHRvIGZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyX3Rlc3QuY3BwCmluZGV4IDlhZGM2NTUuLjEwY2IwNmQgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXJfdGVzdC5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9zbmFwc2hvdF9yZWFkZXJfdGVzdC5jcHAKQEAgLTEyLDggKzEyLDYgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3QuaD4KLQogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgpAQCAtNjEsNyArNTksNyBAQAogICAgICAgICBBU1NFUlRfRVEoZnN5bmMoYmFzZV8tPmZkKSwgMCk7CiAgICAgfQogCi0gICAgdm9pZCBXcml0ZUNvdyhJU25hcHNob3RXcml0ZXIqIHdyaXRlcikgeworICAgIHZvaWQgV3JpdGVDb3coSUNvd1dyaXRlciogd3JpdGVyKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIG5ld19ibG9jayA9IE1ha2VOZXdCbG9ja1N0cmluZygpOwogICAgICAgICBzdGQ6OnN0cmluZyB4b3JfYmxvY2sgPSBNYWtlWG9yQmxvY2tTdHJpbmcoKTsKIApAQCAtNzIsOCArNzAsOCBAQAogICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwogICAgIH0KIAotICAgIHZvaWQgVGVzdEJsb2NrUmVhZHMoSVNuYXBzaG90V3JpdGVyKiB3cml0ZXIpIHsKLSAgICAgICAgYXV0byByZWFkZXIgPSB3cml0ZXItPk9wZW5SZWFkZXIoKTsKKyAgICB2b2lkIFRlc3RCbG9ja1JlYWRzKElDb3dXcml0ZXIqIHdyaXRlcikgeworICAgICAgICBhdXRvIHJlYWRlciA9IHdyaXRlci0+T3BlbkZpbGVEZXNjcmlwdG9yKGJhc2VfLT5wYXRoKTsKICAgICAgICAgQVNTRVJUX05FKHJlYWRlciwgbnVsbHB0cik7CiAKICAgICAgICAgLy8gVGVzdCB0aGF0IHVuY2hhbmdlZCBibG9ja3MgYXJlIG5vdCBtb2RpZmllZC4KQEAgLTExNyw4ICsxMTUsOCBAQAogICAgICAgICBBU1NFUlRfRVEodHdvX2Jsb2NrcywgemVyb2VzKTsKICAgICB9CiAKLSAgICB2b2lkIFRlc3RCeXRlUmVhZHMoSVNuYXBzaG90V3JpdGVyKiB3cml0ZXIpIHsKLSAgICAgICAgYXV0byByZWFkZXIgPSB3cml0ZXItPk9wZW5SZWFkZXIoKTsKKyAgICB2b2lkIFRlc3RCeXRlUmVhZHMoSUNvd1dyaXRlciogd3JpdGVyKSB7CisgICAgICAgIGF1dG8gcmVhZGVyID0gd3JpdGVyLT5PcGVuRmlsZURlc2NyaXB0b3IoYmFzZV8tPnBhdGgpOwogICAgICAgICBBU1NFUlRfTkUocmVhZGVyLCBudWxscHRyKTsKIAogICAgICAgICBzdGQ6OnN0cmluZyBibG9iKGtCbG9ja1NpemUgKiAzLCAneCcpOwpAQCAtMTQwLDkgKzEzOCwyMSBAQAogICAgICAgICBBU1NFUlRfRVEocmVhZGVyLT5TZWVrKG9mZnNldCwgU0VFS19TRVQpLCBvZmZzZXQpOwogICAgICAgICBBU1NFUlRfRVEocmVhZGVyLT5SZWFkKCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSksIHNpemVvZih2YWx1ZSkpOwogICAgICAgICBBU1NFUlRfRVEodmFsdWUsIE1ha2VOZXdCbG9ja1N0cmluZygpWzEwMDBdKTsKKworICAgICAgICAvLyBUZXN0IGEgc2VxdWVuY2Ugb2Ygb25lIGJ5dGUgcmVhZHMuCisgICAgICAgIG9mZnNldCA9IDUgKiBrQmxvY2tTaXplICsgMTA7CisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gTWFrZU5ld0Jsb2NrU3RyaW5nKCkuc3Vic3RyKDEwLCAyMCk7CisgICAgICAgIEFTU0VSVF9FUShyZWFkZXItPlNlZWsob2Zmc2V0LCBTRUVLX1NFVCksIG9mZnNldCk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZ290OworICAgICAgICB3aGlsZSAoZ290LnNpemUoKSA8IGV4cGVjdGVkLnNpemUoKSkgeworICAgICAgICAgICAgQVNTRVJUX0VRKHJlYWRlci0+UmVhZCgmdmFsdWUsIHNpemVvZih2YWx1ZSkpLCBzaXplb2YodmFsdWUpKTsKKyAgICAgICAgICAgIGdvdC5wdXNoX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUShnb3QsIGV4cGVjdGVkKTsKICAgICB9CiAKLSAgICB2b2lkIFRlc3RSZWFkcyhJU25hcHNob3RXcml0ZXIqIHdyaXRlcikgeworICAgIHZvaWQgVGVzdFJlYWRzKElDb3dXcml0ZXIqIHdyaXRlcikgewogICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0QmxvY2tSZWFkcyh3cml0ZXIpKTsKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoVGVzdEJ5dGVSZWFkcyh3cml0ZXIpKTsKICAgICB9CkBAIC0xNzQsMTAgKzE4NCw3IEBACiAgICAgdW5pcXVlX2ZkIGNvd19mZChkdXAoY293Xy0+ZmQpKTsKICAgICBBU1NFUlRfR0UoY293X2ZkLCAwKTsKIAotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc2VkU25hcHNob3RXcml0ZXI+KG9wdGlvbnMpOwotICAgIHdyaXRlci0+U2V0U291cmNlRGV2aWNlKGJhc2VfLT5wYXRoKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPlNldENvd0RldmljZShzdGQ6Om1vdmUoY293X2ZkKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcihrRGVmYXVsdENvd1ZlcnNpb24sIG9wdGlvbnMsIHN0ZDo6bW92ZShjb3dfZmQpKTsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShXcml0ZUNvdyh3cml0ZXIuZ2V0KCkpKTsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0UmVhZHMod3JpdGVyLmdldCgpKSk7CiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3Rlc3RfdjIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy90ZXN0X3YyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDFkMjRjCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy90ZXN0X3YyLmNwcApAQCAtMCwwICsxLDE1NjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfcmVhZGVyLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3dyaXRlci5oPgorI2luY2x1ZGUgImNvd19kZWNvbXByZXNzLmgiCisjaW5jbHVkZSAid3JpdGVyX3YyLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmU7Cit1c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQ7Cit1c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitjbGFzcyBDb3dUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIGNvd18gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KCk7CisgICAgICAgIEFTU0VSVF9HRShjb3dfLT5mZCwgMCkgPDwgc3RyZXJyb3IoZXJybm8pOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgY293XyA9IG51bGxwdHI7IH0KKworICAgIHVuaXF1ZV9mZCBHZXRDb3dGZCgpIHsgcmV0dXJuIHVuaXF1ZV9mZHtkdXAoY293Xy0+ZmQpfTsgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFRlbXBvcmFyeUZpbGU+IGNvd187Cit9OworCisvLyBIZWxwZXIgdG8gY2hlY2sgcmVhZCBzaXplcy4KK3N0YXRpYyBpbmxpbmUgYm9vbCBSZWFkRGF0YShDb3dSZWFkZXImIHJlYWRlciwgY29uc3QgQ293T3BlcmF0aW9uKiBvcCwgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiByZWFkZXIuUmVhZERhdGEob3AsIGJ1ZmZlciwgc2l6ZSkgPT0gc2l6ZTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENvcHlDb250aWd1b3VzKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOworICAgIENvd1dyaXRlclYyIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDEwMDAsIDEwMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLkdldEhlYWRlcigpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1hZ2ljLCBrQ293TWFnaWNOdW1iZXIpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWFqb3IpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1pbm9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWlub3IpOworICAgIEFTU0VSVF9FUShoZWFkZXIuYmxvY2tfc2l6ZSwgb3B0aW9ucy5ibG9ja19zaXplKTsKKworICAgIENvd0Zvb3RlciBmb290ZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldEZvb3RlcigmZm9vdGVyKSk7CisgICAgQVNTRVJUX0VRKGZvb3Rlci5vcC5udW1fb3BzLCAxMDApOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dDb3B5T3ApOworICAgICAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDEwICsgaSk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDEwMDAgKyBpKTsKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgICAgICBpICs9IDE7CisgICAgfQorCisgICAgQVNTRVJUX0VRKGksIDEwMCk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBSZWFkV3JpdGUpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDIwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoNTEsIDIpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLkdldEhlYWRlcigpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1hZ2ljLCBrQ293TWFnaWNOdW1iZXIpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWFqb3IpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1pbm9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWlub3IpOworICAgIEFTU0VSVF9FUShoZWFkZXIuYmxvY2tfc2l6ZSwgb3B0aW9ucy5ibG9ja19zaXplKTsKKworICAgIENvd0Zvb3RlciBmb290ZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldEZvb3RlcigmZm9vdGVyKSk7CisgICAgQVNTRVJUX0VRKGZvb3Rlci5vcC5udW1fb3BzLCA0KTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q29weU9wKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKKyAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDIwKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDQwOTYpOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCk7CisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworCisgICAgLy8gTm90ZTogdGhlIHplcm8gb3BlcmF0aW9uIGdldHMgc3BsaXQgaW50byB0d28gYmxvY2tzLgorICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293WmVyb09wKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKKyAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTEpOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDApOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1Mik7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBSZWFkV3JpdGVYb3IpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDIwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCAyNCwgMTApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg1MSwgMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXIuR2V0SGVhZGVyKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFnaWMsIGtDb3dNYWdpY051bWJlcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NYWpvcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWlub3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NaW5vcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpOworCisgICAgQ293Rm9vdGVyIGZvb3RlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0Rm9vdGVyKCZmb290ZXIpKTsKKyAgICBBU1NFUlRfRVEoZm9vdGVyLm9wLm51bV9vcHMsIDQpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dDb3B5T3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAxMCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMjApOworCisgICAgc3RkOjpzdHJpbmcgc2luayhkYXRhLnNpemUoKSwgJ1wwJyk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1hvck9wKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MDk2KTsKKyAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDk4MzE0KTsgIC8vIDQwOTYgKiAyNCArIDEwCisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworCisgICAgLy8gTm90ZTogdGhlIHplcm8gb3BlcmF0aW9uIGdldHMgc3BsaXQgaW50byB0d28gYmxvY2tzLgorICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293WmVyb09wKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKKyAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTEpOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDApOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1Mik7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBDb21wcmVzc0d6KSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOworICAgIENvd1dyaXRlclYyIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA1Nik7ICAvLyBjb21wcmVzc2VkIQorICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCk7CisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9UUlVFKGl0ZXItPkF0RW5kKCkpOworfQorCitjbGFzcyBDb21wcmVzc2lvblRlc3QgOiBwdWJsaWMgQ293VGVzdCwgcHVibGljIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxjb25zdCBjaGFyKj4ge307CisKK1RFU1RfUChDb21wcmVzc2lvblRlc3QsIFRocmVhZGVkQmF0Y2hXcml0ZXMpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IEdldFBhcmFtKCk7CisgICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IDI7CisKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKworICAgIHN0ZDo6c3RyaW5nIHhvcl9kYXRhID0gIlRoaXMgaXMgdGVzdCBkYXRhLTEuIFRlc3RpbmcgeG9yIjsKKyAgICB4b3JfZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWG9yQmxvY2tzKDUwLCB4b3JfZGF0YS5kYXRhKCksIHhvcl9kYXRhLnNpemUoKSwgMjQsIDEwKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgdGVzdCBkYXRhLTIuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDIwNDgsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMTAwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEyID0gIlRoaXMgaXMgdGVzdCBkYXRhLTMuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOworICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyNTksICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNjAwMCwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEzID0gIlRoaXMgaXMgdGVzdCBkYXRhLTQuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOworICAgIGRhdGEzLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoOTAwMCwgZGF0YTMuZGF0YSgpLCBkYXRhMy5zaXplKCkpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKworICAgIGludCBleHBlY3RlZF9ibG9ja3MgPSAoMSArIDIwNDggKyAyNTkgKyAxKTsKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKworICAgIGludCB0b3RhbF9ibG9ja3MgPSAwOworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1hvck9wKSB7CisgICAgICAgICAgICB0b3RhbF9ibG9ja3MgKz0gMTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsoeG9yX2RhdGEuc2l6ZSgpLCAnXDAnKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCk7CisgICAgICAgICAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCA5ODMxNCk7ICAvLyA0MDk2ICogMjQgKyAxMAorICAgICAgICAgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoc2luaywgeG9yX2RhdGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgdG90YWxfYmxvY2tzICs9IDE7CisgICAgICAgICAgICBpZiAob3AtPm5ld19ibG9jayA9PSAxMDApIHsKKyAgICAgICAgICAgICAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLnNpemUoKSwgZGF0YS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDYwMDApIHsKKyAgICAgICAgICAgICAgICBkYXRhMi5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEyLnNpemUoKSwgJ1wwJyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDkwMDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEzLnNpemUoKSwgJ1wwJyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEodG90YWxfYmxvY2tzLCBleHBlY3RlZF9ibG9ja3MpOworfQorCitURVNUX1AoQ29tcHJlc3Npb25UZXN0LCBOb0JhdGNoV3JpdGVzKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSBHZXRQYXJhbSgpOworICAgIG9wdGlvbnMubnVtX2NvbXByZXNzX3RocmVhZHMgPSAxOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOworCisgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRlc3RpbmcgcmVwbGFjZSBvcHMgd2l0aG91dCBiYXRjaCB3cml0ZXMiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDEwMjQsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiVGVzdGluZyBvZGQgYmxvY2tzIHdpdGhvdXQgYmF0Y2ggd3JpdGVzIjsKKyAgICBkYXRhMi5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMTExLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDMwMDAsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhMyA9ICJUZXN0aW5nIHNpbmdsZSA0ayBibG9jayI7CisgICAgZGF0YTMucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MDAwLCBkYXRhMy5kYXRhKCksIGRhdGEzLnNpemUoKSkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgaW50IGV4cGVjdGVkX2Jsb2NrcyA9ICgxMDI0ICsgMTExICsgMSk7CisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBpbnQgdG90YWxfYmxvY2tzID0gMDsKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkpIHsKKyAgICAgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworCisgICAgICAgIGlmIChvcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgICAgIHRvdGFsX2Jsb2NrcyArPSAxOworICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNTApIHsKKyAgICAgICAgICAgICAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDMwMDApIHsKKyAgICAgICAgICAgICAgICBkYXRhMi5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEyLnNpemUoKSwgJ1wwJyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDUwMDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEzLnNpemUoKSwgJ1wwJyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEodG90YWxfYmxvY2tzLCBleHBlY3RlZF9ibG9ja3MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEhvcnJpYmxlU3RyZWFtIDogcHVibGljIElCeXRlU3RyZWFtIHsKKyAgcHVibGljOgorICAgIEhvcnJpYmxlU3RyZWFtKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPFQ+JiBpbnB1dCkgOiBpbnB1dF8oaW5wdXQpIHt9CisKKyAgICBzc2l6ZV90IFJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChwb3NfID49IGlucHV0Xy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChsZW5ndGgpIHsKKyAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXIpID0gaW5wdXRfW3Bvc19dOworICAgICAgICB9CisgICAgICAgIHBvc18rKzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHNpemVfdCBTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gaW5wdXRfLnNpemUoKTsgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpiYXNpY19zdHJpbmc8VD4gaW5wdXRfOworICAgIHNpemVfdCBwb3NfID0gMDsKK307CisKK1RFU1QoSG9ycmlibGVTdHJlYW0sIFJlYWRGdWxseSkgeworICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gInRoaXMgaXMgc29tZSBkYXRhIjsKKworICAgIEhvcnJpYmxlU3RyZWFtPGNoYXI+IHN0cmVhbShleHBlY3RlZCk7CisKKyAgICBzdGQ6OnN0cmluZyBidWZmZXIoZXhwZWN0ZWQuc2l6ZSgpLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW0uUmVhZEZ1bGx5KGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoYnVmZmVyLCBleHBlY3RlZCk7Cit9CisKK1RFU1RfUChDb21wcmVzc2lvblRlc3QsIEhvcnJpYmxlU3RyZWFtKSB7CisgICAgaWYgKHN0cmNtcChHZXRQYXJhbSgpLCAibm9uZSIpID09IDApIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpOworICAgIH0KKyAgICBDb3dDb21wcmVzc2lvbiBjb21wcmVzc2lvbjsKKyAgICBhdXRvIGFsZ29yaXRobSA9IENvbXByZXNzaW9uQWxnb3JpdGhtRnJvbVN0cmluZyhHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfVFJVRShhbGdvcml0aG0uaGFzX3ZhbHVlKCkpOworICAgIGNvbXByZXNzaW9uLmFsZ29yaXRobSA9IGFsZ29yaXRobS52YWx1ZSgpOworCisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4iOworICAgIGV4cGVjdGVkLnJlc2l6ZSg0MDk2LCAnXDAnKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ29tcHJlc3Nvcj4gY29tcHJlc3NvciA9IElDb21wcmVzc29yOjpDcmVhdGUoY29tcHJlc3Npb24sIDQwOTYpOworICAgIGF1dG8gcmVzdWx0ID0gY29tcHJlc3Nvci0+Q29tcHJlc3MoZXhwZWN0ZWQuZGF0YSgpLCBleHBlY3RlZC5zaXplKCkpOworICAgIEFTU0VSVF9GQUxTRShyZXN1bHQuZW1wdHkoKSk7CisKKyAgICBIb3JyaWJsZVN0cmVhbTx1aW50OF90PiBzdHJlYW0ocmVzdWx0KTsKKyAgICBhdXRvIGRlY29tcCA9IElEZWNvbXByZXNzb3I6OkZyb21TdHJpbmcoR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX05FKGRlY29tcCwgbnVsbHB0cik7CisgICAgZGVjb21wLT5zZXRfc3RyZWFtKCZzdHJlYW0pOworCisgICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5zdWJzdHIoMTAsIDUwMCk7CisKKyAgICBzdGQ6OnN0cmluZyBidWZmZXIoZXhwZWN0ZWQuc2l6ZSgpLCAnXDAnKTsKKyAgICBBU1NFUlRfRVEoZGVjb21wLT5EZWNvbXByZXNzKGJ1ZmZlci5kYXRhKCksIDUwMCwgNDA5NiwgMTApLCA1MDApOworICAgIEFTU0VSVF9FUShidWZmZXIsIGV4cGVjdGVkKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEFsbENvbXByZXNzb3JzLCBDb21wcmVzc2lvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKCJub25lIiwgImd6IiwgImJyb3RsaSIsICJsejQiKSk7CisKK1RFU1RfRihDb3dUZXN0LCBDbHVzdGVyQ29tcHJlc3NHeikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMjsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhMiA9ICJNb3JlIGRhdGEhIjsKKyAgICBkYXRhMi5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUxLCBkYXRhMi5kYXRhKCksIGRhdGEyLnNpemUoKSkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDU2KTsgIC8vIGNvbXByZXNzZWQhCisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0NsdXN0ZXJPcCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBzaW5rID0ge307CisgICAgc2luay5yZXNpemUoZGF0YTIuc2l6ZSgpLCAnXDAnKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MSk7ICAvLyBjb21wcmVzc2VkIQorICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MSk7CisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEyKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q2x1c3Rlck9wKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENvbXByZXNzVHdvQmxvY2tzKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOworICAgIENvd1dyaXRlclYyIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMiwgJ1wwJyk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1JlcGxhY2VPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUxKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIEdldFNpemUpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIGlmIChmdHJ1bmNhdGUoY293Xy0+ZmQsIDApIDwgMCkgeworICAgICAgICBwZXJyb3IoIkZhaWxzIHRvIHNldCB0ZW1wIGZpbGUgc2l6ZSIpOworICAgICAgICBGQUlMKCk7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwLCAyMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDUxLCAyKSk7CisgICAgYXV0byBzaXplX2JlZm9yZSA9IHdyaXRlci5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBhdXRvIHNpemVfYWZ0ZXIgPSB3cml0ZXIuR2V0Q293U2l6ZUluZm8oKS5jb3dfc2l6ZTsKKyAgICBBU1NFUlRfRVEoc2l6ZV9iZWZvcmUsIHNpemVfYWZ0ZXIpOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKworICAgIEFTU0VSVF9HRShmc3RhdChjb3dfLT5mZCwgJmJ1ZiksIDApIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgICBBU1NFUlRfRVEoYnVmLnN0X3NpemUsIHdyaXRlci5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIEFwcGVuZExhYmVsU21hbGwpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDMpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKHszfSkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7CisgICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBBU1NFUlRfRVEoZnN0YXQoY293Xy0+ZmQsICZidWYpLCAwKTsKKyAgICBBU1NFUlRfRVEoYnVmLnN0X3NpemUsIHdyaXRlci0+R2V0Q293U2l6ZUluZm8oKS5jb3dfc2l6ZSk7CisKKyAgICAvLyBSZWFkIGJhY2sgYm90aCBvcGVyYXRpb25zLCBhbmQgbGFiZWwuCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICB1aW50NjRfdCBsYWJlbDsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0TGFzdExhYmVsKCZsYWJlbCkpOworICAgIEFTU0VSVF9FUShsYWJlbCwgMyk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgc2luayA9IHt9OworICAgIHNpbmsucmVzaXplKGRhdGEyLnNpemUoKSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0xhYmVsT3ApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDMpOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhMik7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBBcHBlbmRMYWJlbE1pc3NpbmcpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDApKTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDEpKTsKKyAgICAvLyBEcm9wIHRoZSB0YWlsIGVuZCBvZiB0aGUgbGFzdCBvcCBoZWFkZXIsIGNvcnJ1cHRpbmcgaXQuCisgICAgZnRydW5jYXRlKGNvd18tPmZkLCB3cml0ZXItPkdldENvd1NpemVJbmZvKCkuY293X3NpemUgLSBzaXplb2YoQ293Rm9vdGVyKSAtIDMpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX0ZBTFNFKHdyaXRlci0+SW5pdGlhbGl6ZSh7MX0pKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezB9KSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoNTEsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIEFTU0VSVF9FUShmc3RhdChjb3dfLT5mZCwgJmJ1ZiksIDApOworICAgIEFTU0VSVF9FUShidWYuc3Rfc2l6ZSwgd3JpdGVyLT5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplKTsKKworICAgIC8vIFJlYWQgYmFjayBib3RoIG9wZXJhdGlvbnMuCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293TGFiZWxPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1plcm9PcCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIEFwcGVuZEV4dGVuZGVkQ29ycnVwdGVkKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg1KSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg2KSk7CisKKyAgICAvLyBmYWlsIHRvIHdyaXRlIHRoZSBmb290ZXIuIENvdyBGb3JtYXQgZG9lcyBub3Qga25vdyBpZiBMYWJlbCA2IGlzIHZhbGlkCisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICAvLyBHZXQgdGhlIGxhc3Qga25vd24gZ29vZCBsYWJlbAorICAgIENvd1JlYWRlciBsYWJlbF9yZWFkZXI7CisgICAgdWludDY0X3QgbGFiZWw7CisgICAgQVNTRVJUX1RSVUUobGFiZWxfcmVhZGVyLlBhcnNlKGNvd18tPmZkLCB7NX0pKTsKKyAgICBBU1NFUlRfVFJVRShsYWJlbF9yZWFkZXIuR2V0TGFzdExhYmVsKCZsYWJlbCkpOworICAgIEFTU0VSVF9FUShsYWJlbCwgNSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezV9KSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIEFTU0VSVF9FUShmc3RhdChjb3dfLT5mZCwgJmJ1ZiksIDApOworICAgIEFTU0VSVF9FUShidWYuc3Rfc2l6ZSwgd3JpdGVyLT5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplKTsKKworICAgIC8vIFJlYWQgYmFjayBhbGwgdmFsaWQgb3BlcmF0aW9ucworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0xhYmVsT3ApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDUpOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9UUlVFKGl0ZXItPkF0RW5kKCkpOworfQorCitURVNUX0YoQ293VGVzdCwgQXBwZW5kYnlMYWJlbCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDIsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDUwLCAyKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDUpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSg1LCA2KSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDYpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9GQUxTRSh3cml0ZXItPkluaXRpYWxpemUoezEyfSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSh7NX0pKTsKKworICAgIC8vIFRoaXMgc2hvdWxkIGRyb3AgbGFiZWwgNgorICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgQVNTRVJUX0VRKGZzdGF0KGNvd18tPmZkLCAmYnVmKSwgMCk7CisgICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXItPkdldENvd1NpemVJbmZvKCkuY293X3NpemUpOworCisgICAgLy8gUmVhZCBiYWNrIGFsbCBvcHMKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgc3RkOjpzdHJpbmcgc2luayhvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhLnN1YnN0cigwLCBvcHRpb25zLmJsb2NrX3NpemUpKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBzaW5rID0ge307CisgICAgc2luay5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YS5zdWJzdHIob3B0aW9ucy5ibG9ja19zaXplLCAyICogb3B0aW9ucy5ibG9ja19zaXplKSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0xhYmVsT3ApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDQpOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293TGFiZWxPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgNSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENsdXN0ZXJUZXN0KSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSA0OworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDQpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2Nrcyg1MCwgMikpOyAgLy8gQ2x1c3RlciBzcGxpdCBpbiBtaWRkbGUKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNSkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDUsIDYpKTsKKworICAgIC8vIENsdXN0ZXIgc3BsaXQKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNikpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsgIC8vIE5vIGRhdGEgZm9yIGNsdXN0ZXIsIHNvIG5vIGNsdXN0ZXIgc3BsaXQgbmVlZGVkCisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICAvLyBSZWFkIGJhY2sgYWxsIG9wcworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YS5zdWJzdHIoMCwgb3B0aW9ucy5ibG9ja19zaXplKSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0xhYmVsT3ApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDQpOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dDbHVzdGVyT3ApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dMYWJlbE9wKTsKKyAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCA1KTsKKworICAgIGl0ZXItPk5leHQoKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q29weU9wKTsKKworICAgIGl0ZXItPk5leHQoKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q2x1c3Rlck9wKTsKKworICAgIGl0ZXItPk5leHQoKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293TGFiZWxPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgNik7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENsdXN0ZXJBcHBlbmRUZXN0KSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAzOworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg1MCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7ICAvLyBBZGRzIGEgY2x1c3RlciBvcCwgc2hvdWxkIGJlIGRyb3BwZWQgb24gYXBwZW5kCisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezUwfSkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7CisgICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsgIC8vIEFkZHMgYSBjbHVzdGVyIG9wCisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgQVNTRVJUX0VRKGZzdGF0KGNvd18tPmZkLCAmYnVmKSwgMCk7CisgICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXItPkdldENvd1NpemVJbmZvKCkuY293X3NpemUpOworCisgICAgLy8gUmVhZCBiYWNrIGJvdGggb3BlcmF0aW9ucywgcGx1cyBjbHVzdGVyIG9wIGF0IGVuZAorICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgdWludDY0X3QgbGFiZWw7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldExhc3RMYWJlbCgmbGFiZWwpKTsKKyAgICBBU1NFUlRfRVEobGFiZWwsIDUwKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YTIuc2l6ZSgpLCAnXDAnKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293TGFiZWxPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgNTApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhMik7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0NsdXN0ZXJPcCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIEFwcGVuZEFmdGVyRmluYWxpemUpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDMpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7CisgICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIC8vIENPVyBzaG91bGQgYmUgdmFsaWQuCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IFdyaXRlRGF0YUJsb2NrKElDb3dXcml0ZXIqIHdyaXRlciwgdWludDY0X3QgbmV3X2Jsb2NrLCBzdGQ6OnN0cmluZyBkYXRhKSB7CisgICAgZGF0YS5yZXNpemUod3JpdGVyLT5HZXRCbG9ja1NpemUoKSwgJ1wwJyk7CisgICAgaWYgKCF3cml0ZXItPkFkZFJhd0Jsb2NrcyhuZXdfYmxvY2ssIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRmFpbGVkIHRvIGFkZCByYXcgYmxvY2siOworICAgIH0KKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworfQorCitBc3NlcnRpb25SZXN1bHQgQ29tcGFyZURhdGFCbG9jayhDb3dSZWFkZXIqIHJlYWRlciwgY29uc3QgQ293T3BlcmF0aW9uKiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKSB7CisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLT5HZXRIZWFkZXIoKTsKKworICAgIHN0ZDo6c3RyaW5nIGNtcCA9IGRhdGE7CisgICAgY21wLnJlc2l6ZShoZWFkZXIuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGNtcC5zaXplKCksICdcMCcpOworICAgIGlmICghcmVhZGVyLT5SZWFkRGF0YShvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJGYWlsZWQgdG8gcmVhZCBkYXRhIGJsb2NrIjsKKyAgICB9CisgICAgaWYgKGNtcCAhPSBzaW5rKSB7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkRhdGEgYmxvY2tzIGRpZCBub3QgbWF0Y2gsIGV4cGVjdGVkICIgPDwgY21wIDw8ICIsIGdvdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2luazsKKyAgICB9CisKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworfQorCitURVNUX0YoQ293VGVzdCwgUmVzdW1lTWlkQ2x1c3RlcikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNzsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMSwgIkJsb2NrIDEiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAyLCAiQmxvY2sgMiIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDMsICJCbG9jayAzIikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezF9KSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDUsICJCbG9jayA1IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNiwgIkJsb2NrIDYiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA3LCAiQmxvY2sgNyIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDgsICJCbG9jayA4IikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBzaXplX3QgbnVtX3JlcGxhY2UgPSAwOworICAgIHNpemVfdCBtYXhfaW5fY2x1c3RlciA9IDA7CisgICAgc2l6ZV90IG51bV9pbl9jbHVzdGVyID0gMDsKKyAgICBzaXplX3QgbnVtX2NsdXN0ZXJzID0gMDsKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgICAgICBudW1faW5fY2x1c3RlcisrOworICAgICAgICBtYXhfaW5fY2x1c3RlciA9IHN0ZDo6bWF4KG1heF9pbl9jbHVzdGVyLCBudW1faW5fY2x1c3Rlcik7CisKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgbnVtX3JlcGxhY2UrKzsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIG51bV9yZXBsYWNlKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKENvbXBhcmVEYXRhQmxvY2soJnJlYWRlciwgb3AsICJCbG9jayAiICsgc3RkOjp0b19zdHJpbmcobnVtX3JlcGxhY2UpKSk7CisgICAgICAgIH0gZWxzZSBpZiAob3AtPnR5cGUoKSA9PSBrQ293Q2x1c3Rlck9wKSB7CisgICAgICAgICAgICBudW1faW5fY2x1c3RlciA9IDA7CisgICAgICAgICAgICBudW1fY2x1c3RlcnMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG51bV9yZXBsYWNlLCA4KTsKKyAgICBBU1NFUlRfRVEobWF4X2luX2NsdXN0ZXIsIDcpOworICAgIEFTU0VSVF9FUShudW1fY2x1c3RlcnMsIDIpOworfQorCitURVNUX0YoQ293VGVzdCwgUmVzdW1lRW5kQ2x1c3RlcikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBpbnQgY2x1c3Rlcl9vcHMgPSA1OworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSBjbHVzdGVyX29wczsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMSwgIkJsb2NrIDEiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAyLCAiQmxvY2sgMiIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDMsICJCbG9jayAzIikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDUsICJCbG9jayA1IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNiwgIkJsb2NrIDYiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA3LCAiQmxvY2sgNyIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDgsICJCbG9jayA4IikpOworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSh7MX0pKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDQsICJCbG9jayA0IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNSwgIkJsb2NrIDUiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA2LCAiQmxvY2sgNiIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDcsICJCbG9jayA3IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgOCwgIkJsb2NrIDgiKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCgyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIHNpemVfdCBudW1fcmVwbGFjZSA9IDA7CisgICAgc2l6ZV90IG1heF9pbl9jbHVzdGVyID0gMDsKKyAgICBzaXplX3QgbnVtX2luX2NsdXN0ZXIgPSAwOworICAgIHNpemVfdCBudW1fY2x1c3RlcnMgPSAwOworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOworCisgICAgICAgIG51bV9pbl9jbHVzdGVyKys7CisgICAgICAgIG1heF9pbl9jbHVzdGVyID0gc3RkOjptYXgobWF4X2luX2NsdXN0ZXIsIG51bV9pbl9jbHVzdGVyKTsKKworICAgICAgICBpZiAob3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CisgICAgICAgICAgICBudW1fcmVwbGFjZSsrOworCisgICAgICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgbnVtX3JlcGxhY2UpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoQ29tcGFyZURhdGFCbG9jaygmcmVhZGVyLCBvcCwgIkJsb2NrICIgKyBzdGQ6OnRvX3N0cmluZyhudW1fcmVwbGFjZSkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcC0+dHlwZSgpID09IGtDb3dDbHVzdGVyT3ApIHsKKyAgICAgICAgICAgIG51bV9pbl9jbHVzdGVyID0gMDsKKyAgICAgICAgICAgIG51bV9jbHVzdGVycysrOworICAgICAgICB9CisKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKyAgICBBU1NFUlRfRVEobnVtX3JlcGxhY2UsIDgpOworICAgIEFTU0VSVF9FUShtYXhfaW5fY2x1c3RlciwgY2x1c3Rlcl9vcHMpOworICAgIEFTU0VSVF9FUShudW1fY2x1c3RlcnMsIDMpOworfQorCitURVNUX0YoQ293VGVzdCwgRGVsZXRlTWlkQ2x1c3RlcikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNzsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMSwgIkJsb2NrIDEiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAyLCAiQmxvY2sgMiIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDMsICJCbG9jayAzIikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDUsICJCbG9jayA1IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNiwgIkJsb2NrIDYiKSk7CisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKHsxfSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBzaXplX3QgbnVtX3JlcGxhY2UgPSAwOworICAgIHNpemVfdCBtYXhfaW5fY2x1c3RlciA9IDA7CisgICAgc2l6ZV90IG51bV9pbl9jbHVzdGVyID0gMDsKKyAgICBzaXplX3QgbnVtX2NsdXN0ZXJzID0gMDsKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgICAgICBudW1faW5fY2x1c3RlcisrOworICAgICAgICBtYXhfaW5fY2x1c3RlciA9IHN0ZDo6bWF4KG1heF9pbl9jbHVzdGVyLCBudW1faW5fY2x1c3Rlcik7CisgICAgICAgIGlmIChvcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgICAgIG51bV9yZXBsYWNlKys7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCBudW1fcmVwbGFjZSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShDb21wYXJlRGF0YUJsb2NrKCZyZWFkZXIsIG9wLCAiQmxvY2sgIiArIHN0ZDo6dG9fc3RyaW5nKG51bV9yZXBsYWNlKSkpOworICAgICAgICB9IGVsc2UgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd0NsdXN0ZXJPcCkgeworICAgICAgICAgICAgbnVtX2luX2NsdXN0ZXIgPSAwOworICAgICAgICAgICAgbnVtX2NsdXN0ZXJzKys7CisgICAgICAgIH0KKworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgfQorICAgIEFTU0VSVF9FUShudW1fcmVwbGFjZSwgMyk7CisgICAgQVNTRVJUX0VRKG1heF9pbl9jbHVzdGVyLCA1KTsgIC8vIDMgZGF0YSwgMSBsYWJlbCwgMSBjbHVzdGVyIG9wCisgICAgQVNTRVJUX0VRKG51bV9jbHVzdGVycywgMSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBCaWdTZXFPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgY29uc3QgaW50IHNlcV9sZW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkgLyBzaXplb2YodWludDMyX3QpICsgMTsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgeworICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDEsIHNlcV9sZW4pKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRSZXZNZXJnZU9wSXRlcigpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFfbGVuOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoIWl0ZXItPkF0RW5kKCkpOworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOworCisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCBzZXFfbGVuIC0gaSk7CisKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIE1pc3NpbmdTZXFPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgY29uc3QgaW50IHNlcV9sZW4gPSAxMDsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgeworICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDEsIHNlcV9sZW4gLSAxKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfRkFMU0UocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBSZXN1bWVTZXFPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIGNvbnN0IGludCBzZXFfbGVuID0gMTA7CisgICAgdWludDMyX3Qgc2VxdWVuY2Vbc2VxX2xlbl07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFfbGVuOyBpKyspIHsKKyAgICAgICAgc2VxdWVuY2VbaV0gPSBpICsgMTsKKyAgICB9CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuIC8gMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxICsgc2VxX2xlbiAvIDIsIDEpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKyAgICBhdXRvIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci0+UGFyc2UoY293Xy0+ZmQsIDEpKTsKKyAgICBhdXRvIGl0ciA9IHJlYWRlci0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKKyAgICBBU1NFUlRfVFJVRShpdHItPkF0RW5kKCkpOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKHsxfSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxICsgc2VxX2xlbiAvIDIsIHNlcV9sZW4gLyAyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci0+UGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKKworICAgIHVpbnQ2NF90IGV4cGVjdGVkX2Jsb2NrID0gMTA7CisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpICYmIGV4cGVjdGVkX2Jsb2NrID4gMCkgeworICAgICAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgICAgIGNvbnN0IGF1dG8mIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIGV4cGVjdGVkX2Jsb2NrKTsKKworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgICAgIGV4cGVjdGVkX2Jsb2NrLS07CisgICAgfQorICAgIEFTU0VSVF9FUShleHBlY3RlZF9ibG9jaywgMCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBSZXZNZXJnZU9wSXRyVGVzdCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNTsKKyAgICBvcHRpb25zLm51bV9tZXJnZV9vcHMgPSAxOworICAgIENvd1dyaXRlclYyIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtdID0gezIsIDEwLCA2LCA3LCAzLCA1fTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFNlcXVlbmNlRGF0YSg2LCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDYsIDEzKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoMTIsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg4LCAxKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoMTEsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgzLCAxNSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDIsIDExKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoNCwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDksIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg1LCAxNikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDEsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMCwgMTIpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg3LCAxNCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKworICAgIC8vIE5ldyBibG9jayBpbiBjb3cgb3JkZXIgaXMgNiwgMTIsIDgsIDExLCAzLCAyLCA0LCA5LCA1LCAxLCAxMCwgNworICAgIC8vIE5ldyBibG9jayBpbiBtZXJnZSBvcmRlciBpcyAyLCAxMCwgNiwgNywgMywgNSwgMTIsIDExLCA5LCA4LCA0LCAxCisgICAgLy8gUmV2TWVyZ2VPcmRlciBpcyAxLCA0LCA4LCA5LCAxMSwgMTIsIDUsIDMsIDcsIDYsIDEwLCAyCisgICAgLy8gbmV3IGJsb2NrIDIgaXMgImFscmVhZHkgbWVyZ2VkIiwgc28gd2lsbCBiZSBsZWZ0IG91dC4KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiByZXZNZXJnZU9wU2VxdWVuY2UgPSB7MSwgNCwgOCwgOSwgMTEsIDEyLCA1LCAzLCA3LCA2LCAxMH07CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRSZXZNZXJnZU9wSXRlcigpOworICAgIGF1dG8gZXhwZWN0ZWRfbmV3X2Jsb2NrID0gcmV2TWVyZ2VPcFNlcXVlbmNlLmJlZ2luKCk7CisKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkgJiYgZXhwZWN0ZWRfbmV3X2Jsb2NrICE9IHJldk1lcmdlT3BTZXF1ZW5jZS5lbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOworCisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAqZXhwZWN0ZWRfbmV3X2Jsb2NrKTsKKworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgICAgIGV4cGVjdGVkX25ld19ibG9jaysrOworICAgIH0KKyAgICBBU1NFUlRfRVEoZXhwZWN0ZWRfbmV3X2Jsb2NrLCByZXZNZXJnZU9wU2VxdWVuY2UuZW5kKCkpOworICAgIEFTU0VSVF9UUlVFKGl0ZXItPkF0RW5kKCkpOworfQorCitURVNUX0YoQ293VGVzdCwgUGFyc2VPcHRpb25zVGVzdCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGJvb2w+PiB0ZXN0Y2FzZXMgPSB7CisgICAgICAgICAgICB7Imd6LDQiLCB0cnVlfSwgICB7Imd6LDQsNCIsIGZhbHNlfSwgeyJsejQsNCIsIHRydWV9LCB7ImJyb3RsaSw0IiwgdHJ1ZX0sCisgICAgICAgICAgICB7InpzdGQsNCIsIHRydWV9LCB7InpzdGQseCIsIGZhbHNlfSwgeyJ6cyw0IiwgZmFsc2V9LCB7InpzdGQuNCIsIGZhbHNlfX07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0Y2FzZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IHRlc3RjYXNlc1tpXS5maXJzdDsKKyAgICAgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgICAgICBBU1NFUlRfRVEod3JpdGVyLkluaXRpYWxpemUoKSwgdGVzdGNhc2VzW2ldLnNlY29uZCk7CisgICAgfQorfQorCitURVNUX0YoQ293VGVzdCwgTGVnYWN5UmV2TWVyZ2VPcEl0clRlc3QpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDU7CisgICAgb3B0aW9ucy5udW1fbWVyZ2Vfb3BzID0gMTsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDIsIDExKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDEyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNiwgMTMpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg3LCAxNCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDMsIDE1KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNSwgMTYpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxMiwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDgsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxMSwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDQsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg5LCAxKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoMSwgMSkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgLy8gTmV3IGJsb2NrIGluIGNvdyBvcmRlciBpcyAyLCAxMCwgNiwgNywgMywgNSwgMTIsIDgsIDExLCA0LCA5LCAxCisgICAgLy8gTmV3IGJsb2NrIGluIG1lcmdlIG9yZGVyIGlzIDIsIDEwLCA2LCA3LCAzLCA1LCAxMiwgMTEsIDksIDgsIDQsIDEKKyAgICAvLyBSZXZNZXJnZU9yZGVyIGlzIDEsIDQsIDgsIDksIDExLCAxMiwgNSwgMywgNywgNiwgMTAsIDIKKyAgICAvLyBuZXcgYmxvY2sgMiBpcyAiYWxyZWFkeSBtZXJnZWQiLCBzbyB3aWxsIGJlIGxlZnQgb3V0LgorCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHJldk1lcmdlT3BTZXF1ZW5jZSA9IHsxLCA0LCA4LCA5LCAxMSwgMTIsIDUsIDMsIDcsIDYsIDEwfTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldFJldk1lcmdlT3BJdGVyKCk7CisgICAgYXV0byBleHBlY3RlZF9uZXdfYmxvY2sgPSByZXZNZXJnZU9wU2VxdWVuY2UuYmVnaW4oKTsKKworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSAmJiBleHBlY3RlZF9uZXdfYmxvY2sgIT0gcmV2TWVyZ2VPcFNlcXVlbmNlLmVuZCgpKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssICpleHBlY3RlZF9uZXdfYmxvY2spOworCisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICAgICAgZXhwZWN0ZWRfbmV3X2Jsb2NrKys7CisgICAgfQorICAgIEFTU0VSVF9FUShleHBlY3RlZF9uZXdfYmxvY2ssIHJldk1lcmdlT3BTZXF1ZW5jZS5lbmQoKSk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBJbnZhbGlkTWVyZ2VPcmRlclRlc3QpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDU7CisgICAgb3B0aW9ucy5udW1fbWVyZ2Vfb3BzID0gMTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQ293UmVhZGVyIHJlYWRlcjsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSgzLCAyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDIsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5WZXJpZnlNZXJnZU9wcygpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSh7MX0pKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoNCwgMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgQVNTRVJUX0ZBTFNFKHJlYWRlci5WZXJpZnlNZXJnZU9wcygpKTsKKworICAgIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoMiwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKDMsICZkYXRhLCBkYXRhLnNpemUoKSwgMSwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgQVNTRVJUX0ZBTFNFKHJlYWRlci5WZXJpZnlNZXJnZU9wcygpKTsKK30KKwordW5pcXVlX2ZkIE9wZW5UZXN0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgaW50IGZsYWdzKSB7CisgICAgc3RkOjpzdHJpbmcgcGF0aCA9ICJ0b29scy90ZXN0ZGF0YS8iICsgZmlsZTsKKworICAgIHVuaXF1ZV9mZCBmZChvcGVuKHBhdGguY19zdHIoKSwgZmxhZ3MpKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICByZXR1cm4gZmQ7CisgICAgfQorCisgICAgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKSArICIvIiArIHBhdGg7CisgICAgcmV0dXJuIHVuaXF1ZV9mZHtvcGVuKHBhdGguY19zdHIoKSwgZmxhZ3MpfTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENvbXBhdGliaWxpdHlUZXN0KSB7CisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSAiY293X3YyIjsKKyAgICBhdXRvIGZkID0gT3BlblRlc3RGaWxlKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKGZkLmdldCgpID09IC0xKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgZmlsZW5hbWUgPDwgIiBub3QgZm91bmQiOworICAgICAgICBHVEVTVF9TS0lQKCk7CisgICAgfQorICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgcmVhZGVyLlBhcnNlKGZkKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5HZXRIZWFkZXIoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1ham9yKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1pbm9yKTsKKworICAgIENvd0Zvb3RlciBmb290ZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldEZvb3RlcigmZm9vdGVyKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBEZWNvbXByZXNzSW5jb21wcmVzc2libGVCbG9jaykgeworICAgIGF1dG8gZmQgPSBPcGVuVGVzdEZpbGUoImluY29tcHJlc3NpYmxlX2Jsb2NrIiwgT19SRE9OTFkpOworICAgIEFTU0VSVF9HRShmZCwgMCk7CisKKyAgICBzdGQ6OnN0cmluZyBvcmlnaW5hbDsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkRmRUb1N0cmluZyhmZCwgJm9yaWdpbmFsKSkgPDwgc3RyZXJyb3IoZXJybm8pOworICAgIEFTU0VSVF9FUShvcmlnaW5hbC5zaXplKCksIDQwOTYpOworCisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDIsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDAsIG9yaWdpbmFsLmRhdGEoKSwgb3JpZ2luYWwuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGJsb2NrKG9yaWdpbmFsLnNpemUoKSwgJ1wwJyk7CisgICAgQVNTRVJUX0VRKGl0ZXItPkdldCgpLT5kYXRhX2xlbmd0aCwgNDA5Nik7CisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBpdGVyLT5HZXQoKSwgYmxvY2suZGF0YSgpLCBibG9jay5zaXplKCkpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmxvY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX0VRKGJsb2NrW2ldLCBvcmlnaW5hbFtpXSkgPDwgIm1pc21hdGNoIGF0IGJ5dGUgIiA8PCBpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy90ZXN0X3YzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvdGVzdF92My5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmNDZmNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvdGVzdF92My5jcHAKQEAgLTAsMCArMSw3MDIgQEAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3JlYWRlci5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KKyNpbmNsdWRlICJ3cml0ZXJfdjIuaCIKKyNpbmNsdWRlICJ3cml0ZXJfdjMuaCIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZTsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3M7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIENvd1Rlc3RWMyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBjb3dfID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wb3JhcnlGaWxlPigpOworICAgICAgICBBU1NFUlRfR0UoY293Xy0+ZmQsIDApIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IGNvd18gPSBudWxscHRyOyB9CisKKyAgICB1bmlxdWVfZmQgR2V0Q293RmQoKSB7IHJldHVybiB1bmlxdWVfZmR7ZHVwKGNvd18tPmZkKX07IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW1wb3JhcnlGaWxlPiBjb3dfOworfTsKKworLy8gSGVscGVyIHRvIGNoZWNrIHJlYWQgc2l6ZXMuCitzdGF0aWMgaW5saW5lIGJvb2wgUmVhZERhdGEoQ293UmVhZGVyJiByZWFkZXIsIGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gcmVhZGVyLlJlYWREYXRhKG9wLCBidWZmZXIsIHNpemUpID09IHNpemU7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIENvd0hlYWRlclYyVGVzdCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNTsKKyAgICBvcHRpb25zLm51bV9tZXJnZV9vcHMgPSAxOworICAgIG9wdGlvbnMuYmxvY2tfc2l6ZSA9IDQwOTY7CisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICBhdXRvIHdyaXRlcl92MiA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlcl92Mi0+SW5pdGlhbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXJfdjItPkZpbmFsaXplKCkpOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5HZXRIZWFkZXIoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCAyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCAwKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5jbHVzdGVyX29wcywgb3B0aW9ucy5jbHVzdGVyX29wcyk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIEhlYWRlcikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5HZXRIZWFkZXIoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCAzKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCAwKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5jbHVzdGVyX29wcywgMCk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIE1heE9wKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMjA7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX0ZBTFNFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCAyMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCAyMCkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfRkFMU0Uod3JpdGVyLT5BZGRSYXdCbG9ja3MoNSwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKyAgICBBU1NFUlRfRVEocmVhZGVyLmhlYWRlcl92MygpLm9wX2NvdW50LCAyMCk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIFplcm9PcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDIwOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCAyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgQVNTRVJUX0VRKHJlYWRlci5oZWFkZXJfdjMoKS5vcF9jb3VudCwgMik7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1plcm9PcCk7CisgICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7CisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDEpOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDApOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAyKTsKKyAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCAwKTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgUmVwbGFjZU9wKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMjA7CisgICAgb3B0aW9ucy5zY3JhdGNoX3NwYWNlID0gZmFsc2U7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1hZ2ljLCBrQ293TWFnaWNOdW1iZXIpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24sIDMpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1pbm9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWlub3IpOworICAgIEFTU0VSVF9FUShoZWFkZXIuYmxvY2tfc2l6ZSwgb3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm9wX2NvdW50LCAxKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworCisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDQwOTYpOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1KTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIENvbnNlY3V0aXZlUmVwbGFjZU9wKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMjA7CisgICAgb3B0aW9ucy5zY3JhdGNoX3NwYWNlID0gZmFsc2U7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiA1KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXSA9IHN0YXRpY19jYXN0PGNoYXI+KCdBJyArIGkgLyBvcHRpb25zLmJsb2NrX3NpemUpOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1hZ2ljLCBrQ293TWFnaWNOdW1iZXIpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24sIDMpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1pbm9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWlub3IpOworICAgIEFTU0VSVF9FUShoZWFkZXIuYmxvY2tfc2l6ZSwgb3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm9wX2NvdW50LCA1KTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworCisgICAgc2l6ZV90IGkgPSAwOworCisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2luayhvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgICAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1JlcGxhY2VPcCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1ICsgaSk7CisgICAgICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBvcHRpb25zLmJsb2NrX3NpemUpKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0ZDo6c3RyaW5nX3ZpZXcoc2luayksCisgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ192aWV3KGRhdGEpLnN1YnN0cihpICogb3B0aW9ucy5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpKQorICAgICAgICAgICAgICAgIDw8ICIgcmVhZGJhY2sgZGF0YSBmb3IgIiA8PCBpIDw8ICJ0aCBibG9jayBkb2VzIG5vdCBtYXRjaCI7CisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIEFTU0VSVF9FUShpLCA1KTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgQ29weU9wKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMTAwOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDEwLCAxMDAwLCAxMDApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXIuaGVhZGVyX3YzKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFnaWMsIGtDb3dNYWdpY051bWJlcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiwgMyk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWlub3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NaW5vcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dDb3B5T3ApOworICAgICAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDEwICsgaSk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDEwMDAgKyBpKTsKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgICAgICBpICs9IDE7CisgICAgfQorCisgICAgQVNTRVJUX0VRKGksIDEwMCk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIFhvck9wKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMTAwOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHRlc3QgZGF0YS0xLiBUZXN0aW5nIHhvciI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFhvckJsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCAyNCwgMTApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgIEFTU0VSVF9FUShoZWFkZXIub3BfY291bnQsIDEpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dYb3JPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgNDA5Nik7CisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKKyAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCA5ODMxNCk7ICAvLyA0MDk2ICogMjQgKyAxMAorICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhKTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgQ29uc2VjdXRpdmVYb3JPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDEwMDsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogNSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gPSBjaGFyKHJhbmQoKSAlIDI1Nik7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRYb3JCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwgMjQsIDEwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm9wX2NvdW50LCA1KTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworCisgICAgc3RkOjpzdHJpbmcgc2luayhkYXRhLnNpemUoKSwgJ1wwJyk7CisgICAgc2l6ZV90IGkgPSAwOworCisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dYb3JPcCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDQwOTYpOworICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTAgKyBpKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgOTgzMTQgKyAoaSAqIG9wdGlvbnMuYmxvY2tfc2l6ZSkpOyAgLy8gNDA5NiAqIDI0ICsgMTAKKyAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCkgKyAoaSAqIG9wdGlvbnMuYmxvY2tfc2l6ZSksIG9wdGlvbnMuYmxvY2tfc2l6ZSkpOworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworCisgICAgQVNTRVJUX0VRKGksIDUpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBBbGxPcHNXaXRoQ29tcHJlc3Npb24pIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxMDA7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICBkYXRhW2ldID0gY2hhcihyYW5kKCkgJSA0KTsKKyAgICB9CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMTAsIDUpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoMTUsIDMsIDUpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2NrcygxOCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRYb3JCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwgMjQsIDEwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCAzKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1pbm9yKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5idWZmZXJfc2l6ZSwgQlVGRkVSX1JFR0lPTl9ERUZBVUxUX1NJWkUpOworICAgIEFTU0VSVF9FUShoZWFkZXIub3BfY291bnQsIDIwKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm9wX2NvdW50X21heCwgMTAwKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgICAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1plcm9PcCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAxMCArIGkpOworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dDb3B5T3ApOworICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTUgKyBpKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMyArIGkpOworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgICAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1JlcGxhY2VPcCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAxOCArIGkpOworICAgICAgICBBU1NFUlRfRVEocmVhZGVyLlJlYWREYXRhKG9wLCBzaW5rLmRhdGEoKSArIChpICogb3B0aW9ucy5ibG9ja19zaXplKSwgb3B0aW9ucy5ibG9ja19zaXplKSwKKyAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworCisgICAgc3RkOjpmaWxsKHNpbmsuYmVnaW4oKSwgc2luay5lbmQoKSwgJ1wwJyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgICAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1hvck9wKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwICsgaSk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDk4MzE0ICsgKGkgKiBvcHRpb25zLmJsb2NrX3NpemUpKTsgIC8vIDQwOTYgKiAyNCArIDEwCisgICAgICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgICAgIFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpICsgKGkgKiBvcHRpb25zLmJsb2NrX3NpemUpLCBvcHRpb25zLmJsb2NrX3NpemUpKTsKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIEd6Q29tcHJlc3Npb24pIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxMDA7CisgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBoZWFkZXIgPSByZWFkZXIuaGVhZGVyX3YzKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5jb21wcmVzc2lvbl9hbGdvcml0aG0sIGtDb3dDb21wcmVzc0d6KTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDU2KTsgIC8vIGNvbXByZXNzZWQhCisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIFJlc3VtZVBvaW50VGVzdCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDEwMDsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygwLCAxNSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxNSwgMTUpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgIEFTU0VSVF9FUShoZWFkZXIub3BfY291bnQsIDMwKTsKKworICAgIENvd1dyaXRlclYzIHNlY29uZF93cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUoc2Vjb25kX3dyaXRlci5Jbml0aWFsaXplKDApKTsKKyAgICBBU1NFUlRfVFJVRShzZWNvbmRfd3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgIEFTU0VSVF9FUShoZWFkZXIub3BfY291bnQsIDE1KTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgQnVmZmVyTWV0YWRhdGFTeW5jVGVzdCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDEwMDsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICAvKgorICAgIEhlYWRlciBtZXRhZGFmaWVsZHMKKyAgICBzZXF1ZW5jZV9kYXRhX2NvdW50ID0gMDsKKyAgICByZXN1bWVfcG9pbnRfY291bnQgPSAwOworICAgIHJlc3VtZV9wb2ludF9tYXggPSA0OworICAgICovCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBhdXRvIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnNlcXVlbmNlX2RhdGFfY291bnQsIDApOworICAgIEFTU0VSVF9FUShoZWFkZXIucmVzdW1lX3BvaW50X2NvdW50LCAwKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnJlc3VtZV9wb2ludF9tYXgsIDQpOworCisgICAgd3JpdGVyLT5BZGRMYWJlbCgwKTsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKyAgICBoZWFkZXIgPSByZWFkZXIuaGVhZGVyX3YzKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5zZXF1ZW5jZV9kYXRhX2NvdW50LCAwKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnJlc3VtZV9wb2ludF9jb3VudCwgMSk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5yZXN1bWVfcG9pbnRfbWF4LCA0KTsKKworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKworICAgIC8qCisgICAgSGVhZGVyIG1ldGFkYWZpZWxkcworICAgIHNlcXVlbmNlX2RhdGFfY291bnQgPSAxOworICAgIHJlc3VtZV9wb2ludF9jb3VudCA9IDA7CisgICAgcmVzdW1lX3BvaW50X21heCA9IDQ7CisgICAgKi8KK30KKworVEVTVF9GKENvd1Rlc3RWMywgU2VxdWVuY2VUZXN0KSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIGNvbnN0ZXhwciBpbnQgc2VxX2xlbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSAvIHNpemVvZih1aW50MzJfdCkgKyAxOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gc2VxX2xlbjsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICAvLyBzZXF1ZW5jZSBkYXRhLiBUaGlzIGp1c3QgYW4gYXJiaXRyYXJ5IHNldCBvZiBpbnRlZ2VycyB0aGF0IHNwZWNpZnkgdGhlIG1lcmdlIG9yZGVyLiBUaGUKKyAgICAvLyBhY3R1YWwgY2FsY3VsYXRpb24gaXMgZG9uZSBieSB1cGRhdGVfZW5naW5lIGFuZCBwYXNzZWQgdG8gd3JpdGVyLiBBbGwgd2UgY2FyZSBhYm91dCBoZXJlIGlzCisgICAgLy8gd3JpdGluZyB0aGF0IGRhdGEgY29ycmVjdGx5CisgICAgdWludDMyX3Qgc2VxdWVuY2Vbc2VxX2xlbl07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFfbGVuOyBpKyspIHsKKyAgICAgICAgc2VxdWVuY2VbaV0gPSBpICsgMTsKKyAgICB9CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuIC0gMSkpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEod3JpdGVyLT5HZXRCbG9ja1NpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihpICYgMHhGRik7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKHNlcV9sZW4sIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRSZXZNZXJnZU9wSXRlcigpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFfbGVuOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoIWl0ZXItPkF0RW5kKCkpOworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOworCisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCBzZXFfbGVuIC0gaSk7CisgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IHNlcV9sZW4pIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlYWRfYmFjayh3cml0ZXItPkdldEJsb2NrU2l6ZSgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShyZWFkZXIuUmVhZERhdGEob3AsIHJlYWRfYmFjay5kYXRhKCksIHJlYWRfYmFjay5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlYWRfYmFjay5zaXplKCkpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShyZWFkX2JhY2ssIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgTWlzc2luZ1NlcU9wKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIGNvbnN0IGludCBzZXFfbGVuID0gMTA7CisgICAgdWludDMyX3Qgc2VxdWVuY2Vbc2VxX2xlbl07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFfbGVuOyBpKyspIHsKKyAgICAgICAgc2VxdWVuY2VbaV0gPSBpICsgMTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRTZXF1ZW5jZURhdGEoc2VxX2xlbiwgc2VxdWVuY2UpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMSwgc2VxX2xlbiAtIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfRkFMU0UocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIFJlc3VtZVNlcU9wKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpOworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMz4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgY29uc3QgaW50IHNlcV9sZW4gPSAxMDsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgeworICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOworICAgIH0KKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuIC8gMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxICsgc2VxX2xlbiAvIDIsIDEpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKyAgICBhdXRvIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci0+UGFyc2UoY293Xy0+ZmQsIDEpKTsKKyAgICBhdXRvIGl0ciA9IHJlYWRlci0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKKyAgICBBU1NFUlRfVFJVRShpdHItPkF0RW5kKCkpOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMz4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKHsxfSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxICsgc2VxX2xlbiAvIDIsIHNlcV9sZW4gLyAyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci0+UGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKKworICAgIHVpbnQ2NF90IGV4cGVjdGVkX2Jsb2NrID0gMTA7CisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpICYmIGV4cGVjdGVkX2Jsb2NrID4gMCkgeworICAgICAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgICAgIGNvbnN0IGF1dG8mIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIGV4cGVjdGVkX2Jsb2NrKTsKKworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgICAgIGV4cGVjdGVkX2Jsb2NrLS07CisgICAgfQorICAgIEFTU0VSVF9FUShleHBlY3RlZF9ibG9jaywgMCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIFNldFNvdXJjZU1hbnlUaW1lcykgeworICAgIENvd09wZXJhdGlvblYzIG9we307CisgICAgb3Auc2V0X3NvdXJjZSgxKTsKKyAgICBBU1NFUlRfRVEob3Auc291cmNlKCksIDEpOworICAgIG9wLnNldF9zb3VyY2UoMik7CisgICAgQVNTRVJUX0VRKG9wLnNvdXJjZSgpLCAyKTsKKyAgICBvcC5zZXRfc291cmNlKDQpOworICAgIEFTU0VSVF9FUShvcC5zb3VyY2UoKSwgNCk7CisgICAgb3Auc2V0X3NvdXJjZSg4KTsKKyAgICBBU1NFUlRfRVEob3Auc291cmNlKCksIDgpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBTZXRUeXBlTWFueVRpbWVzKSB7CisgICAgQ293T3BlcmF0aW9uVjMgb3B7fTsKKyAgICBvcC5zZXRfdHlwZShrQ293Q29weU9wKTsKKyAgICBBU1NFUlRfRVEob3AudHlwZSgpLCBrQ293Q29weU9wKTsKKyAgICBvcC5zZXRfdHlwZShrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfRVEob3AudHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBvcC5zZXRfdHlwZShrQ293WmVyb09wKTsKKyAgICBBU1NFUlRfRVEob3AudHlwZSgpLCBrQ293WmVyb09wKTsKKyAgICBvcC5zZXRfdHlwZShrQ293WG9yT3ApOworICAgIEFTU0VSVF9FUShvcC50eXBlKCksIGtDb3dYb3JPcCk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIFNldFR5cGVTb3VyY2VJbnZlcmxlYXZlKSB7CisgICAgQ293T3BlcmF0aW9uVjMgb3B7fTsKKyAgICBvcC5zZXRfdHlwZShrQ293Q29weU9wKTsKKyAgICBBU1NFUlRfRVEob3AudHlwZSgpLCBrQ293Q29weU9wKTsKKyAgICBvcC5zZXRfc291cmNlKDB4MDEwMjAzMDQwNTA2KTsKKyAgICBBU1NFUlRfRVEob3Auc291cmNlKCksIDB4MDEwMjAzMDQwNTA2KTsKKyAgICBBU1NFUlRfRVEob3AudHlwZSgpLCBrQ293Q29weU9wKTsKKyAgICBvcC5zZXRfdHlwZShrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfRVEob3Auc291cmNlKCksIDB4MDEwMjAzMDQwNTA2KTsKKyAgICBBU1NFUlRfRVEob3AudHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgQ293U2l6ZUVzdGltYXRlKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25ze307CisgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJub25lIjsKKyAgICBhdXRvIGVzdGltYXRvciA9IGFuZHJvaWQ6OnNuYXBzaG90OjpDcmVhdGVDb3dFc3RpbWF0b3IoMywgb3B0aW9ucyk7CisgICAgQVNTRVJUX1RSVUUoZXN0aW1hdG9yLT5BZGRaZXJvQmxvY2tzKDAsIDEwMjQgKiAxMDI0KSk7CisgICAgY29uc3QgYXV0byBjb3dfc2l6ZSA9IGVzdGltYXRvci0+R2V0Q293U2l6ZUluZm8oKS5jb3dfc2l6ZTsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDEwMjQgKiAxMDI0OworICAgIG9wdGlvbnMubWF4X2Jsb2NrcyA9IDEwMjQgKiAxMDI0OworICAgIENvd1dyaXRlclYzIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygwLCAxMDI0ICogMTAyNCkpOworCisgICAgQVNTRVJUX0xFKHdyaXRlci5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplLCBjb3dfc2l6ZSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIENvcHlPcE1hbnkpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxMDA7CisgICAgQ293V3JpdGVyVjMgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIHdyaXRlci5Jbml0aWFsaXplKCk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAwLCA1MCwgNTApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxNTAsIDEwMCwgNTApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoR2V0Q293RmQoKSkpOworICAgIGF1dG8gaXQgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICBBU1NFUlRfRkFMU0UoaXQtPkF0RW5kKCkpIDw8ICIgb3AgaXRlcmF0b3IgZW5kZWQgYXQgIiA8PCBpOworICAgICAgICBjb25zdCBhdXRvIG9wID0gKml0LT5HZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLnR5cGUoKSwga0Nvd0NvcHlPcCk7CisgICAgICAgIEFTU0VSVF9FUShvcC5uZXdfYmxvY2ssIDEwMCArIGkpOworICAgICAgICBpdC0+TmV4dCgpOworICAgIH0KK30KKworVEVTVF9GKENvd1Rlc3RWMywgQ2hlY2tPcENvdW50KSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMjA7CisgICAgb3B0aW9ucy5iYXRjaF93cml0ZSA9IHRydWU7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDIwMDsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMCwgMTkpKTsKKyAgICBBU1NFUlRfRkFMU0Uod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDAsIDE5KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX2Jhc2UuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmYzM3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX2Jhc2UuY3BwCkBAIC0wLDAgKzEsMjA2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIndyaXRlcl9iYXNlLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSAic25hcHNob3RfcmVhZGVyLmgiCisKKy8vIFRoZSBpbmZvIG1lc3NhZ2VzIGhlcmUgYXJlIHNwYW1teSwgYnV0IGFzIHVzZWZ1bCBmb3IgdXBkYXRlX2VuZ2luZS4gRGlzYWJsZQorLy8gdGhlbSB3aGVuIHJ1bm5pbmcgb24gdGhlIGhvc3QuCisjaWZkZWYgX19BTkRST0lEX18KKyNkZWZpbmUgTE9HX0lORk8gTE9HKElORk8pCisjZWxzZQorI2RlZmluZSBMT0dfSU5GTyBMT0coVkVSQk9TRSkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworbmFtZXNwYWNlIHsKK3N0ZDo6c3RyaW5nIEdldEZkUGF0aChib3Jyb3dlZF9mZCBmZCkgeworICAgIGNvbnN0IGF1dG8gZmRfcGF0aCA9ICIvcHJvYy9zZWxmL2ZkLyIgKyBzdGQ6OnRvX3N0cmluZyhmZC5nZXQoKSk7CisgICAgc3RkOjpzdHJpbmcgZmlsZV9wYXRoKDUxMiwgJ1wwJyk7CisgICAgY29uc3QgYXV0byBlcnIgPSByZWFkbGluayhmZF9wYXRoLmNfc3RyKCksIGZpbGVfcGF0aC5kYXRhKCksIGZpbGVfcGF0aC5zaXplKCkpOworICAgIGlmIChlcnIgPD0gMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRldGVybWluZSBwYXRoIGZvciBmZCAiIDw8IGZkLmdldCgpOworICAgICAgICBmaWxlX3BhdGguY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxlX3BhdGgucmVzaXplKGVycik7CisgICAgfQorICAgIHJldHVybiBmaWxlX3BhdGg7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworQ293V3JpdGVyQmFzZTo6Q293V3JpdGVyQmFzZShjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zLCB1bmlxdWVfZmQmJiBmZCkKKyAgICA6IG9wdGlvbnNfKG9wdGlvbnMpLCBmZF8oc3RkOjptb3ZlKGZkKSkge30KKworYm9vbCBDb3dXcml0ZXJCYXNlOjpJbml0RmQoKSB7CisgICAgaWYgKGZkXy5nZXQoKSA8IDApIHsKKyAgICAgICAgZmRfLnJlc2V0KG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUiB8IE9fQ0xPRVhFQykpOworICAgICAgICBpZiAoZmRfIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIm9wZW4gL2Rldi9udWxsIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaXNfZGV2X251bGxfID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RydWN0IHN0YXQgc3RhdCB7fTsKKyAgICBpZiAoZnN0YXQoZmRfLmdldCgpLCAmc3RhdCkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJmc3RhdCBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IGF1dG8gZmlsZV9wYXRoID0gR2V0RmRQYXRoKGZkXyk7CisgICAgaXNfYmxvY2tfZGV2aWNlXyA9IFNfSVNCTEsoc3RhdC5zdF9tb2RlKTsKKyAgICBpZiAoaXNfYmxvY2tfZGV2aWNlXykgeworICAgICAgICB1aW50NjRfdCBzaXplX2luX2J5dGVzID0gMDsKKyAgICAgICAgaWYgKGlvY3RsKGZkXy5nZXQoKSwgQkxLR0VUU0laRTY0LCAmc2l6ZV9pbl9ieXRlcykpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IHRvdGFsIHNpemUgZm9yOiAiIDw8IGZkXy5nZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjb3dfaW1hZ2Vfc2l6ZV8gPSBzaXplX2luX2J5dGVzOworICAgICAgICBMT0dfSU5GTyA8PCAiQ09XIGltYWdlICIgPDwgZmlsZV9wYXRoIDw8ICIgaGFzIHNpemUgIiA8PCBzaXplX2luX2J5dGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR19JTkZPIDw8ICJDT1cgaW1hZ2UgIiA8PCBmaWxlX3BhdGgKKyAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgYSBibG9jayBkZXZpY2UsIGFzc3VtaW5nIHVubGltaXRlZCBzcGFjZS4iOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3dXcml0ZXJCYXNlOjpBZGRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzKSB7CisgICAgQ0hFQ0sobnVtX2Jsb2NrcyAhPSAwKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CisgICAgICAgIGlmICghVmFsaWRhdGVOZXdCbG9jayhuZXdfYmxvY2sgKyBpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEVtaXRDb3B5KG5ld19ibG9jaywgb2xkX2Jsb2NrLCBudW1fYmxvY2tzKTsKK30KKworYm9vbCBDb3dXcml0ZXJCYXNlOjpBZGRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplICUgb3B0aW9uc18uYmxvY2tfc2l6ZSAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkFkZFJhd0Jsb2Nrczogc2l6ZSAiIDw8IHNpemUgPDwgIiBpcyBub3QgYSBtdWx0aXBsZSBvZiAiCisgICAgICAgICAgICAgICAgICAgPDwgb3B0aW9uc18uYmxvY2tfc2l6ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ2NF90IG51bV9ibG9ja3MgPSBzaXplIC8gb3B0aW9uc18uYmxvY2tfc2l6ZTsKKyAgICB1aW50NjRfdCBsYXN0X2Jsb2NrID0gbmV3X2Jsb2NrX3N0YXJ0ICsgbnVtX2Jsb2NrcyAtIDE7CisgICAgaWYgKCFWYWxpZGF0ZU5ld0Jsb2NrKGxhc3RfYmxvY2spKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEVtaXRSYXdCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplKTsKK30KKworYm9vbCBDb3dXcml0ZXJCYXNlOjpBZGRYb3JCbG9ja3ModWludDMyX3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSB7CisgICAgaWYgKHNpemUgJSBvcHRpb25zXy5ibG9ja19zaXplICE9IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQWRkUmF3QmxvY2tzOiBzaXplICIgPDwgc2l6ZSA8PCAiIGlzIG5vdCBhIG11bHRpcGxlIG9mICIKKyAgICAgICAgICAgICAgICAgICA8PCBvcHRpb25zXy5ibG9ja19zaXplOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDY0X3QgbnVtX2Jsb2NrcyA9IHNpemUgLyBvcHRpb25zXy5ibG9ja19zaXplOworICAgIHVpbnQ2NF90IGxhc3RfYmxvY2sgPSBuZXdfYmxvY2tfc3RhcnQgKyBudW1fYmxvY2tzIC0gMTsKKyAgICBpZiAoIVZhbGlkYXRlTmV3QmxvY2sobGFzdF9ibG9jaykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAob2Zmc2V0ID49IG9wdGlvbnNfLmJsb2NrX3NpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQWRkWG9yQmxvY2tzOiBvZmZzZXQgIiA8PCBvZmZzZXQgPDwgIiBpcyBub3QgbGVzcyB0aGFuICIKKyAgICAgICAgICAgICAgICAgICA8PCBvcHRpb25zXy5ibG9ja19zaXplOworICAgIH0KKyAgICByZXR1cm4gRW1pdFhvckJsb2NrcyhuZXdfYmxvY2tfc3RhcnQsIGRhdGEsIHNpemUsIG9sZF9ibG9jaywgb2Zmc2V0KTsKK30KKworYm9vbCBDb3dXcml0ZXJCYXNlOjpBZGRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2NrcykgeworICAgIHVpbnQ2NF90IGxhc3RfYmxvY2sgPSBuZXdfYmxvY2tfc3RhcnQgKyBudW1fYmxvY2tzIC0gMTsKKyAgICBpZiAoIVZhbGlkYXRlTmV3QmxvY2sobGFzdF9ibG9jaykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gRW1pdFplcm9CbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBudW1fYmxvY2tzKTsKK30KKworYm9vbCBDb3dXcml0ZXJCYXNlOjpBZGRMYWJlbCh1aW50NjRfdCBsYWJlbCkgeworICAgIHJldHVybiBFbWl0TGFiZWwobGFiZWwpOworfQorCitib29sIENvd1dyaXRlckJhc2U6OkFkZFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIHsKKyAgICByZXR1cm4gRW1pdFNlcXVlbmNlRGF0YShudW1fb3BzLCBkYXRhKTsKK30KKworYm9vbCBDb3dXcml0ZXJCYXNlOjpWYWxpZGF0ZU5ld0Jsb2NrKHVpbnQ2NF90IG5ld19ibG9jaykgeworICAgIGlmIChvcHRpb25zXy5tYXhfYmxvY2tzICYmIG5ld19ibG9jayA+PSBvcHRpb25zXy5tYXhfYmxvY2tzLnZhbHVlKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTmV3IGJsb2NrICIgPDwgbmV3X2Jsb2NrIDw8ICIgZXhjZWVkcyBtYXhpbXVtIGJsb2NrIGNvdW50ICIKKyAgICAgICAgICAgICAgICAgICA8PCBvcHRpb25zXy5tYXhfYmxvY2tzLnZhbHVlKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJQ293UmVhZGVyPiBDb3dXcml0ZXJCYXNlOjpPcGVuUmVhZGVyKCkgeworICAgIHVuaXF1ZV9mZCBjb3dfZmQoZmNudGwoZmRfLmdldCgpLCBGX0RVUEZEIHwgRl9EVVBGRF9DTE9FWEVDLCAwKSk7CisgICAgaWYgKGNvd19mZCA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvd1dyaXRlclYyOjpPcGVuUmVhbmRlcjogZHVwIENPVyBkZXZpY2UiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBhdXRvIGNvdyA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOworICAgIGlmICghY293LT5QYXJzZShzdGQ6Om1vdmUoY293X2ZkKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ293V3JpdGVyVjI6Ok9wZW5SZWFkZXI6IHVuYWJsZSB0byByZWFkIENPVyI7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY293OworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Y2hyb21lb3NfdXBkYXRlX2VuZ2luZTo6RmlsZURlc2NyaXB0b3I+IENvd1dyaXRlckJhc2U6Ok9wZW5GaWxlRGVzY3JpcHRvcigKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UpIHsKKyAgICBhdXRvIHJlYWRlciA9IE9wZW5SZWFkZXIoKTsKKyAgICBpZiAoIXJlYWRlcikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBibG9ja19kZXZfc2l6ZTsKKyAgICBpZiAob3B0aW9uc18ubWF4X2Jsb2NrcykgeworICAgICAgICBibG9ja19kZXZfc2l6ZSA9IHsqb3B0aW9uc18ubWF4X2Jsb2NrcyAqIG9wdGlvbnNfLmJsb2NrX3NpemV9OworICAgIH0KKworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcj4oc3RkOjptb3ZlKHJlYWRlciksIHNvdXJjZV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19kZXZfc2l6ZSk7Cit9CisKK2Jvb2wgQ293V3JpdGVyQmFzZTo6U3luYygpIHsKKyAgICBpZiAoaXNfZGV2X251bGxfKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZnN5bmMoZmRfLmdldCgpKSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImZzeW5jIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX2Jhc2UuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjc0NDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfYmFzZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgQ293V3JpdGVyQmFzZSA6IHB1YmxpYyBJQ293V3JpdGVyIHsKKyAgcHVibGljOgorICAgIENvd1dyaXRlckJhc2UoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucywgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgZmQpOworICAgIHZpcnR1YWwgfkNvd1dyaXRlckJhc2UoKSB7fQorCisgICAgLy8gU2V0IHVwIHRoZSB3cml0ZXIuCisgICAgLy8gVGhlIGZpbGUgc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZy4KKyAgICAvLworICAgIC8vIElmIGZkIGlzIDwgMCwgdGhlIENvd1dyaXRlciB3aWxsIGJlIG9wZW5lZCBhZ2FpbnN0IC9kZXYvbnVsbC4gVGhpcyBpcyBmb3IKKyAgICAvLyBjb21wdXRpbmcgQ09XIHNpemVzIHdpdGhvdXQgdXNpbmcgc3RvcmFnZSBzcGFjZS4KKyAgICAvLworICAgIC8vIElmIGEgbGFiZWwgaXMgZ2l2ZW4sIGFueSBvcGVyYXRpb25zIGFmdGVyIHRoZSBnaXZlbiBsYWJlbCB3aWxsIGJlIGRyb3BwZWQuCisgICAgLy8gSWYgdGhlIGdpdmVuIGxhYmVsIGlzIG5vdCBmb3VuZCwgSW5pdGlhbGl6ZSB3aWxsIGZhaWwuCisgICAgdmlydHVhbCBib29sIEluaXRpYWxpemUoc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwgPSB7fSkgPSAwOworCisgICAgYm9vbCBTeW5jKCk7CisgICAgYm9vbCBBZGRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzID0gMSkgb3ZlcnJpZGU7CisgICAgYm9vbCBBZGRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBBZGRYb3JCbG9ja3ModWludDMyX3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgb2xkX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCkgb3ZlcnJpZGU7CisgICAgYm9vbCBBZGRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2Nrcykgb3ZlcnJpZGU7CisgICAgYm9vbCBBZGRMYWJlbCh1aW50NjRfdCBsYWJlbCkgb3ZlcnJpZGU7CisgICAgYm9vbCBBZGRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKSBvdmVycmlkZTsKKyAgICB1aW50MzJfdCBHZXRCbG9ja1NpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBvcHRpb25zXy5ibG9ja19zaXplOyB9CisgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gR2V0TWF4QmxvY2tzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gb3B0aW9uc18ubWF4X2Jsb2NrczsgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293UmVhZGVyPiBPcGVuUmVhZGVyKCkgb3ZlcnJpZGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpbGVEZXNjcmlwdG9yPiBPcGVuRmlsZURlc2NyaXB0b3IoCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc291cmNlX2RldmljZSkgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKCkgY29uc3QgeyByZXR1cm4gb3B0aW9uc187IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIEVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzID0gMSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSA9IDA7CisgICAgdmlydHVhbCBib29sIEVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2NrcykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpID0gMDsKKworICAgIGJvb2wgSW5pdEZkKCk7CisgICAgYm9vbCBWYWxpZGF0ZU5ld0Jsb2NrKHVpbnQ2NF90IG5ld19ibG9jayk7CisKKyAgICBib29sIElzRXN0aW1hdGluZygpIGNvbnN0IHsgcmV0dXJuIGlzX2Rldl9udWxsXzsgfQorCisgICAgQ293T3B0aW9ucyBvcHRpb25zXzsKKworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZF87CisgICAgYm9vbCBpc19kZXZfbnVsbF8gPSBmYWxzZTsKKyAgICBib29sIGlzX2Jsb2NrX2RldmljZV8gPSBmYWxzZTsKKyAgICB1aW50NjRfdCBjb3dfaW1hZ2Vfc2l6ZV8gPSBJTlQ2NF9NQVg7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd193cml0ZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjIuY3BwCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X3dyaXRlci5jcHAKcmVuYW1lIHRvIGZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YyLmNwcAppbmRleCA1NmI0OGYwLi43NWNkMTExIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd193cml0ZXIuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YyLmNwcApAQCAtMTQsMTIgKzE0LDE0IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKKyNpbmNsdWRlICJ3cml0ZXJfdjIuaCIKKwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy91aW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGZ1dHVyZT4KICNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8cXVldWU+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC0zNywxMDcgKzM5LDMyIEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlICJhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oIgorI2luY2x1ZGUgInBhcnNlcl92Mi5oIgorCisvLyBUaGUgaW5mbyBtZXNzYWdlcyBoZXJlIGFyZSBzcGFtbXksIGJ1dCBhcyB1c2VmdWwgZm9yIHVwZGF0ZV9lbmdpbmUuIERpc2FibGUKKy8vIHRoZW0gd2hlbiBydW5uaW5nIG9uIHRoZSBob3N0LgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIExPR19JTkZPIExPRyhJTkZPKQorI2Vsc2UKKyNkZWZpbmUgTE9HX0lORk8gTE9HKFZFUkJPU0UpCisjZW5kaWYKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAotbmFtZXNwYWNlIHsKLXN0ZDo6c3RyaW5nIEdldEZkUGF0aChpbnQgZmQpIHsKLSAgICBjb25zdCBhdXRvIGZkX3BhdGggPSAiL3Byb2Mvc2VsZi9mZC8iICsgc3RkOjp0b19zdHJpbmcoZmQpOwotICAgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aCg1MTIsICdcMCcpOwotICAgIGNvbnN0IGF1dG8gZXJyID0gcmVhZGxpbmsoZmRfcGF0aC5jX3N0cigpLCBmaWxlX3BhdGguZGF0YSgpLCBmaWxlX3BhdGguc2l6ZSgpKTsKLSAgICBpZiAoZXJyIDw9IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBkZXRlcm1pbmUgcGF0aCBmb3IgZmQgIiA8PCBmZDsKLSAgICAgICAgZmlsZV9wYXRoLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZmlsZV9wYXRoLnJlc2l6ZShlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZmlsZV9wYXRoOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KIHN0YXRpY19hc3NlcnQoc2l6ZW9mKG9mZl90KSA9PSBzaXplb2YodWludDY0X3QpKTsKIAotdXNpbmcgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKLWJvb2wgSUNvd1dyaXRlcjo6QWRkQ29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcykgewotICAgIENIRUNLKG51bV9ibG9ja3MgIT0gMCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewotICAgICAgICBpZiAoIVZhbGlkYXRlTmV3QmxvY2sobmV3X2Jsb2NrICsgaSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBFbWl0Q29weShuZXdfYmxvY2ssIG9sZF9ibG9jaywgbnVtX2Jsb2Nrcyk7Ci19Ci0KLWJvb2wgSUNvd1dyaXRlcjo6QWRkUmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoc2l6ZSAlIG9wdGlvbnNfLmJsb2NrX3NpemUgIT0gMCkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBZGRSYXdCbG9ja3M6IHNpemUgIiA8PCBzaXplIDw8ICIgaXMgbm90IGEgbXVsdGlwbGUgb2YgIgotICAgICAgICAgICAgICAgICAgIDw8IG9wdGlvbnNfLmJsb2NrX3NpemU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBudW1fYmxvY2tzID0gc2l6ZSAvIG9wdGlvbnNfLmJsb2NrX3NpemU7Ci0gICAgdWludDY0X3QgbGFzdF9ibG9jayA9IG5ld19ibG9ja19zdGFydCArIG51bV9ibG9ja3MgLSAxOwotICAgIGlmICghVmFsaWRhdGVOZXdCbG9jayhsYXN0X2Jsb2NrKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBFbWl0UmF3QmxvY2tzKG5ld19ibG9ja19zdGFydCwgZGF0YSwgc2l6ZSk7Ci19Ci0KLWJvb2wgSUNvd1dyaXRlcjo6QWRkWG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCkgewotICAgIGlmIChzaXplICUgb3B0aW9uc18uYmxvY2tfc2l6ZSAhPSAwKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkFkZFJhd0Jsb2Nrczogc2l6ZSAiIDw8IHNpemUgPDwgIiBpcyBub3QgYSBtdWx0aXBsZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgPDwgb3B0aW9uc18uYmxvY2tfc2l6ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVpbnQ2NF90IG51bV9ibG9ja3MgPSBzaXplIC8gb3B0aW9uc18uYmxvY2tfc2l6ZTsKLSAgICB1aW50NjRfdCBsYXN0X2Jsb2NrID0gbmV3X2Jsb2NrX3N0YXJ0ICsgbnVtX2Jsb2NrcyAtIDE7Ci0gICAgaWYgKCFWYWxpZGF0ZU5ld0Jsb2NrKGxhc3RfYmxvY2spKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG9mZnNldCA+PSBvcHRpb25zXy5ibG9ja19zaXplKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkFkZFhvckJsb2Nrczogb2Zmc2V0ICIgPDwgb2Zmc2V0IDw8ICIgaXMgbm90IGxlc3MgdGhhbiAiCi0gICAgICAgICAgICAgICAgICAgPDwgb3B0aW9uc18uYmxvY2tfc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIEVtaXRYb3JCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplLCBvbGRfYmxvY2ssIG9mZnNldCk7Ci19Ci0KLWJvb2wgSUNvd1dyaXRlcjo6QWRkWmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIHsKLSAgICB1aW50NjRfdCBsYXN0X2Jsb2NrID0gbmV3X2Jsb2NrX3N0YXJ0ICsgbnVtX2Jsb2NrcyAtIDE7Ci0gICAgaWYgKCFWYWxpZGF0ZU5ld0Jsb2NrKGxhc3RfYmxvY2spKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIEVtaXRaZXJvQmxvY2tzKG5ld19ibG9ja19zdGFydCwgbnVtX2Jsb2Nrcyk7Ci19Ci0KLWJvb2wgSUNvd1dyaXRlcjo6QWRkTGFiZWwodWludDY0X3QgbGFiZWwpIHsKLSAgICByZXR1cm4gRW1pdExhYmVsKGxhYmVsKTsKLX0KLQotYm9vbCBJQ293V3JpdGVyOjpBZGRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKSB7Ci0gICAgcmV0dXJuIEVtaXRTZXF1ZW5jZURhdGEobnVtX29wcywgZGF0YSk7Ci19Ci0KLWJvb2wgSUNvd1dyaXRlcjo6VmFsaWRhdGVOZXdCbG9jayh1aW50NjRfdCBuZXdfYmxvY2spIHsKLSAgICBpZiAob3B0aW9uc18ubWF4X2Jsb2NrcyAmJiBuZXdfYmxvY2sgPj0gb3B0aW9uc18ubWF4X2Jsb2Nrcy52YWx1ZSgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIk5ldyBibG9jayAiIDw8IG5ld19ibG9jayA8PCAiIGV4Y2VlZHMgbWF4aW11bSBibG9jayBjb3VudCAiCi0gICAgICAgICAgICAgICAgICAgPDwgb3B0aW9uc18ubWF4X2Jsb2Nrcy52YWx1ZSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1Db3dXcml0ZXI6OkNvd1dyaXRlcihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKSA6IElDb3dXcml0ZXIob3B0aW9ucyksIGZkXygtMSkgeworQ293V3JpdGVyVjI6OkNvd1dyaXRlclYyKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMsIHVuaXF1ZV9mZCYmIGZkKQorICAgIDogQ293V3JpdGVyQmFzZShvcHRpb25zLCBzdGQ6Om1vdmUoZmQpKSB7CiAgICAgU2V0dXBIZWFkZXJzKCk7CiAgICAgU2V0dXBXcml0ZU9wdGlvbnMoKTsKIH0KIAotQ293V3JpdGVyOjp+Q293V3JpdGVyKCkgeworQ293V3JpdGVyVjI6On5Db3dXcml0ZXJWMigpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXByZXNzX3RocmVhZHNfLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIENvbXByZXNzV29ya2VyKiB3b3JrZXIgPSBjb21wcmVzc190aHJlYWRzX1tpXS5nZXQoKTsKICAgICAgICAgaWYgKHdvcmtlcikgewpAQCAtMTU2LDcgKzgzLDcgQEAKICAgICBjb21wcmVzc190aHJlYWRzXy5jbGVhcigpOwogfQogCi12b2lkIENvd1dyaXRlcjo6U2V0dXBXcml0ZU9wdGlvbnMoKSB7Cit2b2lkIENvd1dyaXRlclYyOjpTZXR1cFdyaXRlT3B0aW9ucygpIHsKICAgICBudW1fY29tcHJlc3NfdGhyZWFkc18gPSBvcHRpb25zXy5udW1fY29tcHJlc3NfdGhyZWFkczsKIAogICAgIGlmICghbnVtX2NvbXByZXNzX3RocmVhZHNfKSB7CkBAIC0xNzYsMTQgKzEwMywxNCBAQAogICAgIH0KIH0KIAotdm9pZCBDb3dXcml0ZXI6OlNldHVwSGVhZGVycygpIHsKK3ZvaWQgQ293V3JpdGVyVjI6OlNldHVwSGVhZGVycygpIHsKICAgICBoZWFkZXJfID0ge307Ci0gICAgaGVhZGVyXy5tYWdpYyA9IGtDb3dNYWdpY051bWJlcjsKLSAgICBoZWFkZXJfLm1ham9yX3ZlcnNpb24gPSBrQ293VmVyc2lvbk1ham9yOwotICAgIGhlYWRlcl8ubWlub3JfdmVyc2lvbiA9IGtDb3dWZXJzaW9uTWlub3I7Ci0gICAgaGVhZGVyXy5oZWFkZXJfc2l6ZSA9IHNpemVvZihDb3dIZWFkZXIpOworICAgIGhlYWRlcl8ucHJlZml4Lm1hZ2ljID0ga0Nvd01hZ2ljTnVtYmVyOworICAgIGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24gPSBrQ293VmVyc2lvbk1ham9yOworICAgIGhlYWRlcl8ucHJlZml4Lm1pbm9yX3ZlcnNpb24gPSBrQ293VmVyc2lvbk1pbm9yOworICAgIGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplID0gc2l6ZW9mKENvd0hlYWRlcik7CiAgICAgaGVhZGVyXy5mb290ZXJfc2l6ZSA9IHNpemVvZihDb3dGb290ZXIpOwotICAgIGhlYWRlcl8ub3Bfc2l6ZSA9IHNpemVvZihDb3dPcGVyYXRpb24pOworICAgIGhlYWRlcl8ub3Bfc2l6ZSA9IHNpemVvZihDb3dPcGVyYXRpb25WMik7CiAgICAgaGVhZGVyXy5ibG9ja19zaXplID0gb3B0aW9uc18uYmxvY2tfc2l6ZTsKICAgICBoZWFkZXJfLm51bV9tZXJnZV9vcHMgPSBvcHRpb25zXy5udW1fbWVyZ2Vfb3BzOwogICAgIGhlYWRlcl8uY2x1c3Rlcl9vcHMgPSBvcHRpb25zXy5jbHVzdGVyX29wczsKQEAgLTE5MywxOSArMTIwLDMxIEBACiAgICAgZm9vdGVyXy5vcC50eXBlID0ga0Nvd0Zvb3Rlck9wOwogfQogCi1ib29sIENvd1dyaXRlcjo6UGFyc2VPcHRpb25zKCkgewotICAgIGlmIChvcHRpb25zXy5jb21wcmVzc2lvbiA9PSAiZ3oiKSB7Ci0gICAgICAgIGNvbXByZXNzaW9uXyA9IGtDb3dDb21wcmVzc0d6OwotICAgIH0gZWxzZSBpZiAob3B0aW9uc18uY29tcHJlc3Npb24gPT0gImJyb3RsaSIpIHsKLSAgICAgICAgY29tcHJlc3Npb25fID0ga0Nvd0NvbXByZXNzQnJvdGxpOwotICAgIH0gZWxzZSBpZiAob3B0aW9uc18uY29tcHJlc3Npb24gPT0gImx6NCIpIHsKLSAgICAgICAgY29tcHJlc3Npb25fID0ga0Nvd0NvbXByZXNzTHo0OwotICAgIH0gZWxzZSBpZiAob3B0aW9uc18uY29tcHJlc3Npb24gPT0gIm5vbmUiKSB7Ci0gICAgICAgIGNvbXByZXNzaW9uXyA9IGtDb3dDb21wcmVzc05vbmU7Ci0gICAgfSBlbHNlIGlmICghb3B0aW9uc18uY29tcHJlc3Npb24uZW1wdHkoKSkgeworYm9vbCBDb3dXcml0ZXJWMjo6UGFyc2VPcHRpb25zKCkgeworICAgIGF1dG8gcGFydHMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChvcHRpb25zXy5jb21wcmVzc2lvbiwgIiwiKTsKKworICAgIGlmIChwYXJ0cy5zaXplKCkgPiAyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImZhaWxlZCB0byBwYXJzZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzOiBpbnZhbGlkIGFyZ3VtZW50IGNvdW50OiAiCisgICAgICAgICAgICAgICAgICAgPDwgcGFydHMuc2l6ZSgpIDw8ICIgIiA8PCBvcHRpb25zXy5jb21wcmVzc2lvbjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGFsZ29yaXRobSA9IENvbXByZXNzaW9uQWxnb3JpdGhtRnJvbVN0cmluZyhwYXJ0c1swXSk7CisgICAgaWYgKCFhbGdvcml0aG0pIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAidW5yZWNvZ25pemVkIGNvbXByZXNzaW9uOiAiIDw8IG9wdGlvbnNfLmNvbXByZXNzaW9uOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGlmIChwYXJ0cy5zaXplKCkgPiAxKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KHBhcnRzWzFdLCAmY29tcHJlc3Npb25fLmNvbXByZXNzaW9uX2xldmVsKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHBhcnNlIGNvbXByZXNzaW9uIGxldmVsIGludmFsaWQgdHlwZTogIiA8PCBwYXJ0c1sxXTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbXByZXNzaW9uXy5jb21wcmVzc2lvbl9sZXZlbCA9CisgICAgICAgICAgICAgICAgQ29tcHJlc3NXb3JrZXI6OkdldERlZmF1bHRDb21wcmVzc2lvbkxldmVsKGFsZ29yaXRobS52YWx1ZSgpKTsKKyAgICB9CisKKyAgICBjb21wcmVzc2lvbl8uYWxnb3JpdGhtID0gKmFsZ29yaXRobTsKKwogICAgIGlmIChvcHRpb25zXy5jbHVzdGVyX29wcyA9PSAxKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkNsdXN0ZXJzIG11c3QgY29udGFpbiBhdCBsZWFzdCB0d28gb3BlcmF0aW9ucyB0byBmdW5jdGlvbi4iOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMTMsNTEgKzE1MiwxNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6U2V0RmQoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQpIHsKLSAgICBpZiAoZmQuZ2V0KCkgPCAwKSB7Ci0gICAgICAgIG93bmVkX2ZkXy5yZXNldChvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKLSAgICAgICAgaWYgKG93bmVkX2ZkXyA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuIC9kZXYvbnVsbCBmYWlsZWQiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZkXyA9IG93bmVkX2ZkXzsKLSAgICAgICAgaXNfZGV2X251bGxfID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBmZF8gPSBmZDsKLQotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0IHt9OwotICAgICAgICBpZiAoZnN0YXQoZmQuZ2V0KCksICZzdGF0KSA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJmc3RhdCBmYWlsZWQiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGF1dG8gZmlsZV9wYXRoID0gR2V0RmRQYXRoKGZkLmdldCgpKTsKLSAgICAgICAgaXNfYmxvY2tfZGV2aWNlXyA9IFNfSVNCTEsoc3RhdC5zdF9tb2RlKTsKLSAgICAgICAgaWYgKGlzX2Jsb2NrX2RldmljZV8pIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IHNpemVfaW5fYnl0ZXMgPSAwOwotICAgICAgICAgICAgaWYgKGlvY3RsKGZkLmdldCgpLCBCTEtHRVRTSVpFNjQsICZzaXplX2luX2J5dGVzKSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IHRvdGFsIHNpemUgZm9yOiAiIDw8IGZkLmdldCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvd19pbWFnZV9zaXplXyA9IHNpemVfaW5fYnl0ZXM7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIkNPVyBpbWFnZSAiIDw8IGZpbGVfcGF0aCA8PCAiIGhhcyBzaXplICIgPDwgc2l6ZV9pbl9ieXRlczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQ09XIGltYWdlICIgPDwgZmlsZV9wYXRoCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgYSBibG9jayBkZXZpY2UsIGFzc3VtaW5nIHVubGltaXRlZCBzcGFjZS4iOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIENvd1dyaXRlcjo6SW5pdEJhdGNoV3JpdGVzKCkgewordm9pZCBDb3dXcml0ZXJWMjo6SW5pdEJhdGNoV3JpdGVzKCkgewogICAgIGlmIChiYXRjaF93cml0ZV8pIHsKICAgICAgICAgY293b3BfdmVjXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RydWN0IGlvdmVjW10+KGhlYWRlcl8uY2x1c3Rlcl9vcHMpOwogICAgICAgICBkYXRhX3ZlY18gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0cnVjdCBpb3ZlY1tdPihoZWFkZXJfLmNsdXN0ZXJfb3BzKTsKICAgICAgICAgc3RydWN0IGlvdmVjKiBjb3dvcF9wdHIgPSBjb3dvcF92ZWNfLmdldCgpOwogICAgICAgICBzdHJ1Y3QgaW92ZWMqIGRhdGFfcHRyID0gZGF0YV92ZWNfLmdldCgpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlYWRlcl8uY2x1c3Rlcl9vcHM7IGkrKykgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvd09wZXJhdGlvbj4gb3AgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd09wZXJhdGlvbj4oKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dPcGVyYXRpb25WMj4gb3AgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd09wZXJhdGlvblYyPigpOwogICAgICAgICAgICAgY293b3BfcHRyW2ldLmlvdl9iYXNlID0gb3AuZ2V0KCk7Ci0gICAgICAgICAgICBjb3dvcF9wdHJbaV0uaW92X2xlbiA9IHNpemVvZihDb3dPcGVyYXRpb24pOworICAgICAgICAgICAgY293b3BfcHRyW2ldLmlvdl9sZW4gPSBzaXplb2YoQ293T3BlcmF0aW9uVjIpOwogICAgICAgICAgICAgb3BidWZmZXJfdmVjXy5wdXNoX2JhY2soc3RkOjptb3ZlKG9wKSk7CiAKICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihoZWFkZXJfLmJsb2NrX3NpemUgKiAyKTsKQEAgLTI3MCw3NSArMTc0LDU5IEBACiAgICAgICAgIGN1cnJlbnRfZGF0YV9wb3NfID0gbmV4dF9kYXRhX3Bvc187CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgYmF0Y2hfd3JpdGUgPSBiYXRjaF93cml0ZV8gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiOwotICAgIExPRyhJTkZPKSA8PCAiQmF0Y2ggd3JpdGVzOiAiIDw8IGJhdGNoX3dyaXRlOworICAgIExPR19JTkZPIDw8ICJCYXRjaCB3cml0ZXM6ICIgPDwgKGJhdGNoX3dyaXRlXyA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogfQogCi12b2lkIENvd1dyaXRlcjo6SW5pdFdvcmtlcnMoKSB7Cit2b2lkIENvd1dyaXRlclYyOjpJbml0V29ya2VycygpIHsKICAgICBpZiAobnVtX2NvbXByZXNzX3RocmVhZHNfIDw9IDEpIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJOb3QgY3JlYXRpbmcgbmV3IHRocmVhZHMgZm9yIGNvbXByZXNzaW9uLiI7CisgICAgICAgIExPR19JTkZPIDw8ICJOb3QgY3JlYXRpbmcgbmV3IHRocmVhZHMgZm9yIGNvbXByZXNzaW9uLiI7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY29tcHJlc3NfdGhyZWFkc187IGkrKykgewotICAgICAgICBhdXRvIHd0ID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc1dvcmtlcj4oY29tcHJlc3Npb25fLCBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IGNvbXByZXNzb3IgPQorICAgICAgICAgICAgICAgIElDb21wcmVzc29yOjpDcmVhdGUoY29tcHJlc3Npb25fLCBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICBhdXRvIHd0ID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc1dvcmtlcj4oc3RkOjptb3ZlKGNvbXByZXNzb3IpLCBoZWFkZXJfLmJsb2NrX3NpemUpOwogICAgICAgICB0aHJlYWRzXy5lbXBsYWNlX2JhY2soc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZDb21wcmVzc1dvcmtlcjo6UnVuVGhyZWFkLCB3dC5nZXQoKSkpOwogICAgICAgICBjb21wcmVzc190aHJlYWRzXy5wdXNoX2JhY2soc3RkOjptb3ZlKHd0KSk7CiAgICAgfQogCi0gICAgTE9HKElORk8pIDw8IG51bV9jb21wcmVzc190aHJlYWRzXyA8PCAiIHRocmVhZCB1c2VkIGZvciBjb21wcmVzc2lvbiI7CisgICAgTE9HX0lORk8gPDwgbnVtX2NvbXByZXNzX3RocmVhZHNfIDw8ICIgdGhyZWFkIHVzZWQgZm9yIGNvbXByZXNzaW9uIjsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkluaXRpYWxpemUodW5pcXVlX2ZkJiYgZmQpIHsKLSAgICBvd25lZF9mZF8gPSBzdGQ6Om1vdmUoZmQpOwotICAgIHJldHVybiBJbml0aWFsaXplKGJvcnJvd2VkX2Zke293bmVkX2ZkX30pOwotfQotCi1ib29sIENvd1dyaXRlcjo6SW5pdGlhbGl6ZShib3Jyb3dlZF9mZCBmZCkgewotICAgIGlmICghU2V0RmQoZmQpIHx8ICFQYXJzZU9wdGlvbnMoKSkgeworYm9vbCBDb3dXcml0ZXJWMjo6SW5pdGlhbGl6ZShzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgeworICAgIGlmICghSW5pdEZkKCkgfHwgIVBhcnNlT3B0aW9ucygpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0KLSAgICBpZiAoIU9wZW5Gb3JXcml0ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWxhYmVsKSB7CisgICAgICAgIGlmICghT3BlbkZvcldyaXRlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghT3BlbkZvckFwcGVuZCgqbGFiZWwpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBJbml0V29ya2VycygpOworICAgIGlmICghY29tcHJlc3NfdGhyZWFkc18uc2l6ZSgpKSB7CisgICAgICAgIEluaXRXb3JrZXJzKCk7CisgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6SW5pdGlhbGl6ZUFwcGVuZChhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCwgdWludDY0X3QgbGFiZWwpIHsKLSAgICBvd25lZF9mZF8gPSBzdGQ6Om1vdmUoZmQpOwotICAgIHJldHVybiBJbml0aWFsaXplQXBwZW5kKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2Zke293bmVkX2ZkX30sIGxhYmVsKTsKLX0KLQotYm9vbCBDb3dXcml0ZXI6OkluaXRpYWxpemVBcHBlbmQoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIHVpbnQ2NF90IGxhYmVsKSB7Ci0gICAgaWYgKCFTZXRGZChmZCkgfHwgIVBhcnNlT3B0aW9ucygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIHJldCA9IE9wZW5Gb3JBcHBlbmQobGFiZWwpOwotCi0gICAgaWYgKHJldCAmJiAhY29tcHJlc3NfdGhyZWFkc18uc2l6ZSgpKSB7Ci0gICAgICAgIEluaXRXb3JrZXJzKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBDb3dXcml0ZXI6OkluaXRQb3MoKSB7Ci0gICAgbmV4dF9vcF9wb3NfID0gc2l6ZW9mKGhlYWRlcl8pICsgaGVhZGVyXy5idWZmZXJfc2l6ZTsKLSAgICBjbHVzdGVyX3NpemVfID0gaGVhZGVyXy5jbHVzdGVyX29wcyAqIHNpemVvZihDb3dPcGVyYXRpb24pOwordm9pZCBDb3dXcml0ZXJWMjo6SW5pdFBvcygpIHsKKyAgICBuZXh0X29wX3Bvc18gPSBzaXplb2YoQ293SGVhZGVyKSArIGhlYWRlcl8uYnVmZmVyX3NpemU7CisgICAgY2x1c3Rlcl9zaXplXyA9IGhlYWRlcl8uY2x1c3Rlcl9vcHMgKiBzaXplb2YoQ293T3BlcmF0aW9uVjIpOwogICAgIGlmIChoZWFkZXJfLmNsdXN0ZXJfb3BzKSB7CiAgICAgICAgIG5leHRfZGF0YV9wb3NfID0gbmV4dF9vcF9wb3NfICsgY2x1c3Rlcl9zaXplXzsKICAgICB9IGVsc2UgewotICAgICAgICBuZXh0X2RhdGFfcG9zXyA9IG5leHRfb3BfcG9zXyArIHNpemVvZihDb3dPcGVyYXRpb24pOworICAgICAgICBuZXh0X2RhdGFfcG9zXyA9IG5leHRfb3BfcG9zXyArIHNpemVvZihDb3dPcGVyYXRpb25WMik7CiAgICAgfQogICAgIGN1cnJlbnRfY2x1c3Rlcl9zaXplXyA9IDA7CiAgICAgY3VycmVudF9kYXRhX3NpemVfID0gMDsKIH0KIAotYm9vbCBDb3dXcml0ZXI6Ok9wZW5Gb3JXcml0ZSgpIHsKLSAgICAvLyBUaGlzIGxpbWl0YXRpb24gaXMgdGllZCB0byB0aGUgZGF0YSBmaWVsZCBzaXplIGluIENvd09wZXJhdGlvbi4KK2Jvb2wgQ293V3JpdGVyVjI6Ok9wZW5Gb3JXcml0ZSgpIHsKKyAgICAvLyBUaGlzIGxpbWl0YXRpb24gaXMgdGllZCB0byB0aGUgZGF0YSBmaWVsZCBzaXplIGluIENvd09wZXJhdGlvblYyLgogICAgIGlmIChoZWFkZXJfLmJsb2NrX3NpemUgPiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQmxvY2sgc2l6ZSBpcyB0b28gbGFyZ2UiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNTUsNyArMjQzLDcgQEAKIAogICAgIC8vIEhlYWRlcnMgYXJlIG5vdCBjb21wbGV0ZSwgYnV0IHRoaXMgZW5zdXJlcyB0aGUgZmlsZSBpcyBhdCB0aGUgcmlnaHQKICAgICAvLyBwb3NpdGlvbi4KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoZmRfLCAmaGVhZGVyXywgc2l6ZW9mKGhlYWRlcl8pKSkgeworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShmZF8sICZoZWFkZXJfLCBzaXplb2YoQ293SGVhZGVyKSkpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRlIGZhaWxlZCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0zNzQsMjIgKzI2MiwyNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKGxzZWVrKGZkXy5nZXQoKSwgc2l6ZW9mKGhlYWRlcl8pICsgaGVhZGVyXy5idWZmZXJfc2l6ZSwgU0VFS19TRVQpIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgZmFpbGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICAgIEluaXRQb3MoKTsKICAgICBJbml0QmF0Y2hXcml0ZXMoKTsKIAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6T3BlbkZvckFwcGVuZCh1aW50NjRfdCBsYWJlbCkgewotICAgIGF1dG8gcmVhZGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dSZWFkZXI+KCk7Ci0gICAgc3RkOjpxdWV1ZTxDb3dPcGVyYXRpb24+IHRvQWRkOworYm9vbCBDb3dXcml0ZXJWMjo6T3BlbkZvckFwcGVuZCh1aW50NjRfdCBsYWJlbCkgeworICAgIENvd0hlYWRlclYzIGhlYWRlcl92MzsKKyAgICBpZiAoIVJlYWRDb3dIZWFkZXIoZmRfLCAmaGVhZGVyX3YzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0gICAgaWYgKCFyZWFkZXItPlBhcnNlKGZkXywge2xhYmVsfSkgfHwgIXJlYWRlci0+R2V0SGVhZGVyKCZoZWFkZXJfKSkgeworICAgIGhlYWRlcl8gPSBoZWFkZXJfdjM7CisKKyAgICBDb3dQYXJzZXJWMiBwYXJzZXI7CisgICAgaWYgKCFwYXJzZXIuUGFyc2UoZmRfLCBoZWFkZXJfdjMsIHtsYWJlbH0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24gPiAyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvd1dyaXRlclYyIHRyaWVkIHRvIG9wZW4gaW5jb21wYXRpYmxlIHZlcnNpb24gIgorICAgICAgICAgICAgICAgICAgIDw8IGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb247CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTQwMCwxNiArMjkzLDEwIEBACiAgICAgZm9vdGVyXy5vcC5udW1fb3BzID0gMDsKICAgICBJbml0UG9zKCk7CiAKLSAgICBhdXRvIGl0ZXIgPSByZWFkZXItPkdldE9wSXRlcigpOwotCi0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgQWRkT3BlcmF0aW9uKGl0ZXItPkdldCgpKTsKLSAgICAgICAgaXRlci0+TmV4dCgpOworICAgIGZvciAoY29uc3QgYXV0byYgb3AgOiAqcGFyc2VyLmdldF92Mm9wcygpKSB7CisgICAgICAgIEFkZE9wZXJhdGlvbihvcCk7CiAgICAgfQogCi0gICAgLy8gRnJlZSByZWFkZXIgc28gd2Ugb3duIHRoZSBkZXNjcmlwdG9yIHBvc2l0aW9uIGFnYWluLgotICAgIHJlYWRlciA9IG51bGxwdHI7Ci0KICAgICBpZiAobHNlZWsoZmRfLmdldCgpLCBuZXh0X29wX3Bvc18sIFNFRUtfU0VUKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGZhaWxlZCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQyMCwxMSArMzA3LDExIEBACiAgICAgcmV0dXJuIEVtaXRDbHVzdGVySWZOZWVkZWQoKTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzKSB7Citib29sIENvd1dyaXRlclYyOjpFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcykgewogICAgIENIRUNLKCFtZXJnZV9pbl9wcm9ncmVzc18pOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgQ293T3BlcmF0aW9uIG9wID0ge307CisgICAgICAgIENvd09wZXJhdGlvblYyIG9wID0ge307CiAgICAgICAgIG9wLnR5cGUgPSBrQ293Q29weU9wOwogICAgICAgICBvcC5uZXdfYmxvY2sgPSBuZXdfYmxvY2sgKyBpOwogICAgICAgICBvcC5zb3VyY2UgPSBvbGRfYmxvY2sgKyBpOwpAQCAtNDM2LDI1ICszMjMsMjcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkVtaXRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworYm9vbCBDb3dXcml0ZXJWMjo6RW1pdFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgcmV0dXJuIEVtaXRCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplLCAwLCAwLCBrQ293UmVwbGFjZU9wKTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkVtaXRYb3JCbG9ja3ModWludDMyX3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSB7Citib29sIENvd1dyaXRlclYyOjpFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSB7CiAgICAgcmV0dXJuIEVtaXRCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplLCBvbGRfYmxvY2ssIG9mZnNldCwga0Nvd1hvck9wKTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkNvbXByZXNzQmxvY2tzKHNpemVfdCBudW1fYmxvY2tzLCBjb25zdCB2b2lkKiBkYXRhKSB7Citib29sIENvd1dyaXRlclYyOjpDb21wcmVzc0Jsb2NrcyhzaXplX3QgbnVtX2Jsb2NrcywgY29uc3Qgdm9pZCogZGF0YSkgewogICAgIHNpemVfdCBudW1fdGhyZWFkcyA9IChudW1fYmxvY2tzID09IDEpID8gMSA6IG51bV9jb21wcmVzc190aHJlYWRzXzsKICAgICBzaXplX3QgbnVtX2Jsb2Nrc19wZXJfdGhyZWFkID0gbnVtX2Jsb2NrcyAvIG51bV90aHJlYWRzOwogICAgIGNvbnN0IHVpbnQ4X3QqIGl0ZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKTsKICAgICBjb21wcmVzc2VkX2J1Zl8uY2xlYXIoKTsKICAgICBpZiAobnVtX3RocmVhZHMgPD0gMSkgewotICAgICAgICByZXR1cm4gQ29tcHJlc3NXb3JrZXI6OkNvbXByZXNzQmxvY2tzKGNvbXByZXNzaW9uXywgb3B0aW9uc18uYmxvY2tfc2l6ZSwgZGF0YSwgbnVtX2Jsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NlZF9idWZfKTsKKyAgICAgICAgaWYgKCFjb21wcmVzc29yXykgeworICAgICAgICAgICAgY29tcHJlc3Nvcl8gPSBJQ29tcHJlc3Nvcjo6Q3JlYXRlKGNvbXByZXNzaW9uXywgaGVhZGVyXy5ibG9ja19zaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29tcHJlc3NXb3JrZXI6OkNvbXByZXNzQmxvY2tzKGNvbXByZXNzb3JfLmdldCgpLCBvcHRpb25zXy5ibG9ja19zaXplLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ibG9ja3MsICZjb21wcmVzc2VkX2J1Zl8pOwogICAgIH0KLQogICAgIC8vIFN1Ym1pdCB0aGUgYmxvY2tzIHBlciB0aHJlYWQuIFRoZSByZXRyaWV2YWwgb2YKICAgICAvLyBjb21wcmVzc2VkIGJ1ZmZlcnMgaGFzIHRvIGJlIGRvbmUgaW4gdGhlIHNhbWUgb3JkZXIuCiAgICAgLy8gV2Ugc2hvdWxkIG5vdCBwb2xsIGZvciBjb21wbGV0ZWQgYnVmZmVycyBpbiBhIGRpZmZlcmVudCBvcmRlciBhcyB0aGUKQEAgLTQ3OSw4ICszNjgsOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6RW1pdEJsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQsIHVpbnQ4X3QgdHlwZSkgeworYm9vbCBDb3dXcml0ZXJWMjo6RW1pdEJsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCwgQ293T3BlcmF0aW9uVHlwZSB0eXBlKSB7CiAgICAgQ0hFQ0soIW1lcmdlX2luX3Byb2dyZXNzXyk7CiAgICAgY29uc3QgdWludDhfdCogaXRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpOwogCkBAIC00OTcsNyArMzg2LDcgQEAKICAgICB3aGlsZSAobnVtX2Jsb2NrcykgewogICAgICAgICBzaXplX3QgcGVuZGluZ19ibG9ja3MgPSAoc3RkOjptaW4oa1Byb2Nlc3NpbmdCbG9ja3MsIG51bV9ibG9ja3MpKTsKIAotICAgICAgICBpZiAoY29tcHJlc3Npb25fICYmIG51bV9jb21wcmVzc190aHJlYWRzXyA+IDEpIHsKKyAgICAgICAgaWYgKGNvbXByZXNzaW9uXy5hbGdvcml0aG0gJiYgbnVtX2NvbXByZXNzX3RocmVhZHNfID4gMSkgewogICAgICAgICAgICAgaWYgKCFDb21wcmVzc0Jsb2NrcyhwZW5kaW5nX2Jsb2NrcywgaXRlcikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC01MDgsNyArMzk3LDcgQEAKICAgICAgICAgbnVtX2Jsb2NrcyAtPSBwZW5kaW5nX2Jsb2NrczsKIAogICAgICAgICB3aGlsZSAoaSA8IHNpemUgLyBoZWFkZXJfLmJsb2NrX3NpemUgJiYgcGVuZGluZ19ibG9ja3MpIHsKLSAgICAgICAgICAgIENvd09wZXJhdGlvbiBvcCA9IHt9OworICAgICAgICAgICAgQ293T3BlcmF0aW9uVjIgb3AgPSB7fTsKICAgICAgICAgICAgIG9wLm5ld19ibG9jayA9IG5ld19ibG9ja19zdGFydCArIGk7CiAgICAgICAgICAgICBvcC50eXBlID0gdHlwZTsKICAgICAgICAgICAgIGlmICh0eXBlID09IGtDb3dYb3JPcCkgewpAQCAtNTE3LDE5ICs0MDYsMjIgQEAKICAgICAgICAgICAgICAgICBvcC5zb3VyY2UgPSBuZXh0X2RhdGFfcG9zXzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uXykgeworICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uXy5hbGdvcml0aG0pIHsKICAgICAgICAgICAgICAgICBhdXRvIGRhdGEgPSBbJiwgdGhpc10oKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChudW1fY29tcHJlc3NfdGhyZWFkc18gPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGRhdGEgPSBzdGQ6Om1vdmUoKmJ1Zl9pdGVyXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBidWZfaXRlcl8rKzsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBkYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3NXb3JrZXI6OkNvbXByZXNzKGNvbXByZXNzaW9uXywgaXRlciwgaGVhZGVyXy5ibG9ja19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcHJlc3Nvcl8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yXyA9IElDb21wcmVzc29yOjpDcmVhdGUoY29tcHJlc3Npb25fLCBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGRhdGEgPSBjb21wcmVzc29yXy0+Q29tcHJlc3MoaXRlciwgaGVhZGVyXy5ibG9ja19zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSgpOwotICAgICAgICAgICAgICAgIG9wLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb25fOworICAgICAgICAgICAgICAgIG9wLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb25fLmFsZ29yaXRobTsKICAgICAgICAgICAgICAgICBvcC5kYXRhX2xlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihkYXRhLnNpemUoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIVdyaXRlT3BlcmF0aW9uKG9wLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKSB7CkBAIC01NTQsMTAgKzQ0NiwxMCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6RW1pdFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCB1aW50NjRfdCBudW1fYmxvY2tzKSB7Citib29sIENvd1dyaXRlclYyOjpFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIHsKICAgICBDSEVDSyghbWVyZ2VfaW5fcHJvZ3Jlc3NfKTsKICAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0gICAgICAgIENvd09wZXJhdGlvbiBvcCA9IHt9OworICAgICAgICBDb3dPcGVyYXRpb25WMiBvcCA9IHt9OwogICAgICAgICBvcC50eXBlID0ga0Nvd1plcm9PcDsKICAgICAgICAgb3AubmV3X2Jsb2NrID0gbmV3X2Jsb2NrX3N0YXJ0ICsgaTsKICAgICAgICAgb3Auc291cmNlID0gMDsKQEAgLTU2NiwyMCArNDU4LDIwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkVtaXRMYWJlbCh1aW50NjRfdCBsYWJlbCkgewogICAgIENIRUNLKCFtZXJnZV9pbl9wcm9ncmVzc18pOwotICAgIENvd09wZXJhdGlvbiBvcCA9IHt9OworICAgIENvd09wZXJhdGlvblYyIG9wID0ge307CiAgICAgb3AudHlwZSA9IGtDb3dMYWJlbE9wOwogICAgIG9wLnNvdXJjZSA9IGxhYmVsOwogICAgIHJldHVybiBXcml0ZU9wZXJhdGlvbihvcCkgJiYgU3luYygpOwogfQogCi1ib29sIENvd1dyaXRlcjo6RW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkVtaXRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKSB7CiAgICAgQ0hFQ0soIW1lcmdlX2luX3Byb2dyZXNzXyk7CiAgICAgc2l6ZV90IHRvX2FkZCA9IDA7CiAgICAgc2l6ZV90IG1heF9vcHMgPSAoaGVhZGVyXy5ibG9ja19zaXplICogMikgLyBzaXplb2YodWludDMyX3QpOwogICAgIHdoaWxlIChudW1fb3BzID4gMCkgewotICAgICAgICBDb3dPcGVyYXRpb24gb3AgPSB7fTsKKyAgICAgICAgQ293T3BlcmF0aW9uVjIgb3AgPSB7fTsKICAgICAgICAgb3AudHlwZSA9IGtDb3dTZXF1ZW5jZU9wOwogICAgICAgICBvcC5zb3VyY2UgPSBuZXh0X2RhdGFfcG9zXzsKICAgICAgICAgdG9fYWRkID0gc3RkOjptaW4obnVtX29wcywgbWF4X29wcyk7CkBAIC01OTQsMzQgKzQ4NiwyMyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6RW1pdENsdXN0ZXIoKSB7Ci0gICAgQ293T3BlcmF0aW9uIG9wID0ge307Citib29sIENvd1dyaXRlclYyOjpFbWl0Q2x1c3RlcigpIHsKKyAgICBDb3dPcGVyYXRpb25WMiBvcCA9IHt9OwogICAgIG9wLnR5cGUgPSBrQ293Q2x1c3Rlck9wOwogICAgIC8vIE5leHQgY2x1c3RlciBzdGFydHMgYWZ0ZXIgcmVtYWluZGVyIG9mIGN1cnJlbnQgY2x1c3RlciBhbmQgdGhlIG5leHQgZGF0YSBibG9jay4KLSAgICBvcC5zb3VyY2UgPSBjdXJyZW50X2RhdGFfc2l6ZV8gKyBjbHVzdGVyX3NpemVfIC0gY3VycmVudF9jbHVzdGVyX3NpemVfIC0gc2l6ZW9mKENvd09wZXJhdGlvbik7CisgICAgb3Auc291cmNlID0gY3VycmVudF9kYXRhX3NpemVfICsgY2x1c3Rlcl9zaXplXyAtIGN1cnJlbnRfY2x1c3Rlcl9zaXplXyAtIHNpemVvZihDb3dPcGVyYXRpb25WMik7CiAgICAgcmV0dXJuIFdyaXRlT3BlcmF0aW9uKG9wKTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkVtaXRDbHVzdGVySWZOZWVkZWQoKSB7Citib29sIENvd1dyaXRlclYyOjpFbWl0Q2x1c3RlcklmTmVlZGVkKCkgewogICAgIC8vIElmIHRoZXJlIGlzbid0IHJvb20gZm9yIGFub3RoZXIgb3AgYW5kIHRoZSBjbHVzdGVyIGVuZCBvcCwgZW5kIHRoZSBjdXJyZW50IGNsdXN0ZXIKLSAgICBpZiAoY2x1c3Rlcl9zaXplXyAmJiBjbHVzdGVyX3NpemVfIDwgY3VycmVudF9jbHVzdGVyX3NpemVfICsgMiAqIHNpemVvZihDb3dPcGVyYXRpb24pKSB7CisgICAgaWYgKGNsdXN0ZXJfc2l6ZV8gJiYgY2x1c3Rlcl9zaXplXyA8IGN1cnJlbnRfY2x1c3Rlcl9zaXplXyArIDIgKiBzaXplb2YoQ293T3BlcmF0aW9uVjIpKSB7CiAgICAgICAgIGlmICghRW1pdENsdXN0ZXIoKSkgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLy8gVE9ETzogRml4IGNvbXBpbGF0aW9uIGlzc3VlcyB3aGVuIGxpbmtpbmcgbGliY3J5cHRvIGxpYnJhcnkKLS8vIHdoZW4gc25hcHVzZXJkIGlzIGNvbXBpbGVkIGFzIHBhcnQgb2YgcmFtZGlzay4KLXN0YXRpYyB2b2lkIFNIQTI1Nihjb25zdCB2b2lkKiwgc2l6ZV90LCB1aW50OF90W10pIHsKLSNpZiAwCi0gICAgU0hBMjU2X0NUWCBjOwotICAgIFNIQTI1Nl9Jbml0KCZjKTsKLSAgICBTSEEyNTZfVXBkYXRlKCZjLCBkYXRhLCBsZW5ndGgpOwotICAgIFNIQTI1Nl9GaW5hbChvdXQsICZjKTsKLSNlbmRpZgotfQotCi1ib29sIENvd1dyaXRlcjo6RmluYWxpemUoKSB7Citib29sIENvd1dyaXRlclYyOjpGaW5hbGl6ZSgpIHsKICAgICBpZiAoIUZsdXNoQ2x1c3RlcigpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZpbmFsaXplOiBGbHVzaENsdXN0ZXIoKSBmYWlsZWQiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02NDksMjIgKzUzMCwyMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gRm9vdGVyIHNob3VsZCBiZSBhdCB0aGUgZW5kIG9mIGEgZmlsZSwgc28gaWYgdGhlcmUgaXMgZGF0YSBhZnRlciB0aGUgY3VycmVudCBibG9jaywgZW5kIGl0Ci0gICAgLy8gYW5kIHN0YXJ0IGEgbmV3IGNsdXN0ZXIuCisgICAgLy8gRm9vdGVyIHNob3VsZCBiZSBhdCB0aGUgZW5kIG9mIGEgZmlsZSwgc28gaWYgdGhlcmUgaXMgZGF0YSBhZnRlciB0aGUgY3VycmVudCBibG9jaywgZW5kCisgICAgLy8gaXQgYW5kIHN0YXJ0IGEgbmV3IGNsdXN0ZXIuCiAgICAgaWYgKGNsdXN0ZXJfc2l6ZV8gJiYgY3VycmVudF9kYXRhX3NpemVfID4gMCkgewogICAgICAgICBFbWl0Q2x1c3RlcigpOwogICAgICAgICBleHRyYV9jbHVzdGVyID0gdHJ1ZTsKICAgICB9CiAKLSAgICBmb290ZXJfLm9wLm9wc19zaXplID0gZm9vdGVyXy5vcC5udW1fb3BzICogc2l6ZW9mKENvd09wZXJhdGlvbik7CisgICAgZm9vdGVyXy5vcC5vcHNfc2l6ZSA9IGZvb3Rlcl8ub3AubnVtX29wcyAqIHNpemVvZihDb3dPcGVyYXRpb25WMik7CiAgICAgaWYgKGxzZWVrKGZkXy5nZXQoKSwgbmV4dF9vcF9wb3NfLCBTRUVLX1NFVCkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2VlayB0byBmb290ZXIgcG9zaXRpb24uIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtZW1zZXQoJmZvb3Rlcl8uZGF0YS5vcHNfY2hlY2tzdW0sIDAsIHNpemVvZih1aW50OF90KSAqIDMyKTsKLSAgICBtZW1zZXQoJmZvb3Rlcl8uZGF0YS5mb290ZXJfY2hlY2tzdW0sIDAsIHNpemVvZih1aW50OF90KSAqIDMyKTsKKyAgICBtZW1zZXQoJmZvb3Rlcl8udW51c2VkLCAwLCBzaXplb2YoZm9vdGVyXy51bnVzZWQpKTsKIAotICAgIFNIQTI1NigmZm9vdGVyXy5vcCwgc2l6ZW9mKGZvb3Rlcl8ub3ApLCBmb290ZXJfLmRhdGEuZm9vdGVyX2NoZWNrc3VtKTsKICAgICAvLyBXcml0ZSBvdXQgZm9vdGVyIGF0IGVuZCBvZiBmaWxlCiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGZkXywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJmZvb3Rlcl8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZm9vdGVyXykpKSB7CkBAIC02OTcsMTUgKzU3NiwxNyBAQAogICAgIHJldHVybiBTeW5jKCk7CiB9CiAKLXVpbnQ2NF90IENvd1dyaXRlcjo6R2V0Q293U2l6ZSgpIHsKK0Nvd1NpemVJbmZvIENvd1dyaXRlclYyOjpHZXRDb3dTaXplSW5mbygpIGNvbnN0IHsKKyAgICBDb3dTaXplSW5mbyBpbmZvOwogICAgIGlmIChjdXJyZW50X2RhdGFfc2l6ZV8gPiAwKSB7Ci0gICAgICAgIHJldHVybiBuZXh0X2RhdGFfcG9zXyArIHNpemVvZihmb290ZXJfKTsKKyAgICAgICAgaW5mby5jb3dfc2l6ZSA9IG5leHRfZGF0YV9wb3NfICsgc2l6ZW9mKGZvb3Rlcl8pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXh0X29wX3Bvc18gKyBzaXplb2YoZm9vdGVyXyk7CisgICAgICAgIGluZm8uY293X3NpemUgPSBuZXh0X29wX3Bvc18gKyBzaXplb2YoZm9vdGVyXyk7CiAgICAgfQorICAgIHJldHVybiBpbmZvOwogfQogCi1ib29sIENvd1dyaXRlcjo6R2V0RGF0YVBvcyh1aW50NjRfdCogcG9zKSB7Citib29sIENvd1dyaXRlclYyOjpHZXREYXRhUG9zKHVpbnQ2NF90KiBwb3MpIHsKICAgICBvZmZfdCBvZmZzID0gbHNlZWsoZmRfLmdldCgpLCAwLCBTRUVLX0NVUik7CiAgICAgaWYgKG9mZnMgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBmYWlsZWQiOwpAQCAtNzE1LDcgKzU5Niw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbnN1cmVTcGFjZUF2YWlsYWJsZShjb25zdCB1aW50NjRfdCBieXRlc19uZWVkZWQpIGNvbnN0IHsKK2Jvb2wgQ293V3JpdGVyVjI6OkVuc3VyZVNwYWNlQXZhaWxhYmxlKGNvbnN0IHVpbnQ2NF90IGJ5dGVzX25lZWRlZCkgY29uc3QgewogICAgIGlmIChieXRlc19uZWVkZWQgPiBjb3dfaW1hZ2Vfc2l6ZV8pIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gc3BhY2UgbGVmdCBvbiBDT1cgZGV2aWNlLiBSZXF1aXJlZDogIiA8PCBieXRlc19uZWVkZWQKICAgICAgICAgICAgICAgICAgICA8PCAiLCBhdmFpbGFibGU6ICIgPDwgY293X2ltYWdlX3NpemVfOwpAQCAtNzI1LDE0ICs2MDYsMTQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkZsdXNoQ2x1c3RlcigpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkZsdXNoQ2x1c3RlcigpIHsKICAgICBzc2l6ZV90IHJldDsKIAogICAgIGlmIChvcF92ZWNfaW5kZXhfKSB7CiAgICAgICAgIHJldCA9IHB3cml0ZXYoZmRfLmdldCgpLCBjb3dvcF92ZWNfLmdldCgpLCBvcF92ZWNfaW5kZXhfLCBjdXJyZW50X29wX3Bvc18pOwotICAgICAgICBpZiAocmV0ICE9IChvcF92ZWNfaW5kZXhfICogc2l6ZW9mKENvd09wZXJhdGlvbikpKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicHdyaXRldiBmYWlsZWQgZm9yIENvd09wZXJhdGlvbi4gRXhwZWN0ZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IChvcF92ZWNfaW5kZXhfICogc2l6ZW9mKENvd09wZXJhdGlvbikpOworICAgICAgICBpZiAocmV0ICE9IChvcF92ZWNfaW5kZXhfICogc2l6ZW9mKENvd09wZXJhdGlvblYyKSkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJwd3JpdGV2IGZhaWxlZCBmb3IgQ293T3BlcmF0aW9uVjIuIEV4cGVjdGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAob3BfdmVjX2luZGV4XyAqIHNpemVvZihDb3dPcGVyYXRpb25WMikpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtNzU0LDE3ICs2MzUsMTYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OldyaXRlT3BlcmF0aW9uKGNvbnN0IENvd09wZXJhdGlvbiYgb3AsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKCFFbnN1cmVTcGFjZUF2YWlsYWJsZShuZXh0X29wX3Bvc18gKyBzaXplb2Yob3ApKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghRW5zdXJlU3BhY2VBdmFpbGFibGUobmV4dF9kYXRhX3Bvc18gKyBzaXplKSkgeworYm9vbCBDb3dXcml0ZXJWMjo6V3JpdGVPcGVyYXRpb24oY29uc3QgQ293T3BlcmF0aW9uVjImIG9wLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmICghRW5zdXJlU3BhY2VBdmFpbGFibGUobmV4dF9vcF9wb3NfICsgc2l6ZW9mKG9wKSkgfHwKKyAgICAgICAgIUVuc3VyZVNwYWNlQXZhaWxhYmxlKG5leHRfZGF0YV9wb3NfICsgc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGlmIChiYXRjaF93cml0ZV8pIHsKLSAgICAgICAgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSByZWludGVycHJldF9jYXN0PENvd09wZXJhdGlvbio+KGNvd29wX3ZlY19bb3BfdmVjX2luZGV4X10uaW92X2Jhc2UpOwotICAgICAgICBzdGQ6Om1lbWNweShjb3dfb3AsICZvcCwgc2l6ZW9mKENvd09wZXJhdGlvbikpOworICAgICAgICBDb3dPcGVyYXRpb25WMiogY293X29wID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENvd09wZXJhdGlvblYyKj4oY293b3BfdmVjX1tvcF92ZWNfaW5kZXhfXS5pb3ZfYmFzZSk7CisgICAgICAgIHN0ZDo6bWVtY3B5KGNvd19vcCwgJm9wLCBzaXplb2YoQ293T3BlcmF0aW9uVjIpKTsKICAgICAgICAgb3BfdmVjX2luZGV4XyArPSAxOwogCiAgICAgICAgIGlmIChkYXRhICE9IG51bGxwdHIgJiYgc2l6ZSA+IDApIHsKQEAgLTgwMiw3ICs2ODIsNyBAQAogICAgIHJldHVybiBFbWl0Q2x1c3RlcklmTmVlZGVkKCk7CiB9CiAKLXZvaWQgQ293V3JpdGVyOjpBZGRPcGVyYXRpb24oY29uc3QgQ293T3BlcmF0aW9uJiBvcCkgewordm9pZCBDb3dXcml0ZXJWMjo6QWRkT3BlcmF0aW9uKGNvbnN0IENvd09wZXJhdGlvblYyJiBvcCkgewogICAgIGZvb3Rlcl8ub3AubnVtX29wcysrOwogCiAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd0NsdXN0ZXJPcCkgewpAQCAtODE0LDI4ICs2OTQsMTcgQEAKICAgICB9CiAKICAgICBuZXh0X2RhdGFfcG9zXyArPSBvcC5kYXRhX2xlbmd0aCArIEdldE5leHREYXRhT2Zmc2V0KG9wLCBoZWFkZXJfLmNsdXN0ZXJfb3BzKTsKLSAgICBuZXh0X29wX3Bvc18gKz0gc2l6ZW9mKENvd09wZXJhdGlvbikgKyBHZXROZXh0T3BPZmZzZXQob3AsIGhlYWRlcl8uY2x1c3Rlcl9vcHMpOworICAgIG5leHRfb3BfcG9zXyArPSBzaXplb2YoQ293T3BlcmF0aW9uVjIpICsgR2V0TmV4dE9wT2Zmc2V0KG9wLCBoZWFkZXJfLmNsdXN0ZXJfb3BzKTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OldyaXRlUmF3RGF0YShjb25zdCB2b2lkKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSkgeworYm9vbCBDb3dXcml0ZXJWMjo6V3JpdGVSYXdEYXRhKGNvbnN0IHZvaWQqIGRhdGEsIGNvbnN0IHNpemVfdCBzaXplKSB7CiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5QXRPZmZzZXQoZmRfLCBkYXRhLCBzaXplLCBuZXh0X2RhdGFfcG9zXykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OlN5bmMoKSB7Ci0gICAgaWYgKGlzX2Rldl9udWxsXykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGZzeW5jKGZkXy5nZXQoKSkgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJmc3luYyBmYWlsZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvd1dyaXRlcjo6VHJ1bmNhdGUob2ZmX3QgbGVuZ3RoKSB7Citib29sIENvd1dyaXRlclYyOjpUcnVuY2F0ZShvZmZfdCBsZW5ndGgpIHsKICAgICBpZiAoaXNfZGV2X251bGxfIHx8IGlzX2Jsb2NrX2RldmljZV8pIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkZTJhZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YyLmgKQEAgLTAsMCArMSw5OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgIndyaXRlcl9iYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIENvd1dyaXRlclYyIDogcHVibGljIENvd1dyaXRlckJhc2UgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgQ293V3JpdGVyVjIoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucywgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgZmQpOworICAgIH5Db3dXcml0ZXJWMigpIG92ZXJyaWRlOworCisgICAgYm9vbCBJbml0aWFsaXplKHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsID0ge30pIG92ZXJyaWRlOworICAgIGJvb2wgRmluYWxpemUoKSBvdmVycmlkZTsKKyAgICBDb3dTaXplSW5mbyBHZXRDb3dTaXplSW5mbygpIGNvbnN0IG92ZXJyaWRlOworCisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdENvcHkodWludDY0X3QgbmV3X2Jsb2NrLCB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQ2NF90IG51bV9ibG9ja3MgPSAxKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCB1aW50NjRfdCBudW1fYmxvY2tzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdExhYmVsKHVpbnQ2NF90IGxhYmVsKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYm9vbCBFbWl0Q2x1c3RlcigpOworICAgIGJvb2wgRW1pdENsdXN0ZXJJZk5lZWRlZCgpOworICAgIGJvb2wgRW1pdEJsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCB1aW50NjRfdCBvbGRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwgQ293T3BlcmF0aW9uVHlwZSB0eXBlKTsKKyAgICB2b2lkIFNldHVwSGVhZGVycygpOworICAgIHZvaWQgU2V0dXBXcml0ZU9wdGlvbnMoKTsKKyAgICBib29sIFBhcnNlT3B0aW9ucygpOworICAgIGJvb2wgT3BlbkZvcldyaXRlKCk7CisgICAgYm9vbCBPcGVuRm9yQXBwZW5kKHVpbnQ2NF90IGxhYmVsKTsKKyAgICBib29sIEdldERhdGFQb3ModWludDY0X3QqIHBvcyk7CisgICAgYm9vbCBXcml0ZVJhd0RhdGEoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgV3JpdGVPcGVyYXRpb24oY29uc3QgQ293T3BlcmF0aW9uVjImIG9wLCBjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0ciwgc2l6ZV90IHNpemUgPSAwKTsKKyAgICB2b2lkIEFkZE9wZXJhdGlvbihjb25zdCBDb3dPcGVyYXRpb25WMiYgb3ApOworICAgIHZvaWQgSW5pdFBvcygpOworICAgIHZvaWQgSW5pdEJhdGNoV3JpdGVzKCk7CisgICAgdm9pZCBJbml0V29ya2VycygpOworICAgIGJvb2wgRmx1c2hDbHVzdGVyKCk7CisKKyAgICBib29sIENvbXByZXNzQmxvY2tzKHNpemVfdCBudW1fYmxvY2tzLCBjb25zdCB2b2lkKiBkYXRhKTsKKyAgICBib29sIFRydW5jYXRlKG9mZl90IGxlbmd0aCk7CisgICAgYm9vbCBFbnN1cmVTcGFjZUF2YWlsYWJsZShjb25zdCB1aW50NjRfdCBieXRlc19uZWVkZWQpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgQ293Rm9vdGVyIGZvb3Rlcl97fTsKKyAgICBDb3dIZWFkZXIgaGVhZGVyX3t9OworICAgIENvd0NvbXByZXNzaW9uIGNvbXByZXNzaW9uXzsKKyAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHdlIGFyZSB1c2luZyBvbmUgdGhyZWFkIGZvciBjb21wcmVzc2lvbiwgd2UgY2FuIHN0b3JlIGFuZCByZS11c2UgdGhlIHNhbWUKKyAgICAvLyBjb21wcmVzc29yCisgICAgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBjb21wcmVzc29yXzsKKyAgICB1aW50NjRfdCBjdXJyZW50X29wX3Bvc18gPSAwOworICAgIHVpbnQ2NF90IG5leHRfb3BfcG9zXyA9IDA7CisgICAgdWludDY0X3QgbmV4dF9kYXRhX3Bvc18gPSAwOworICAgIHVpbnQ2NF90IGN1cnJlbnRfZGF0YV9wb3NfID0gMDsKKyAgICBzc2l6ZV90IHRvdGFsX2RhdGFfd3JpdHRlbl8gPSAwOworICAgIHVpbnQzMl90IGNsdXN0ZXJfc2l6ZV8gPSAwOworICAgIHVpbnQzMl90IGN1cnJlbnRfY2x1c3Rlcl9zaXplXyA9IDA7CisgICAgdWludDY0X3QgY3VycmVudF9kYXRhX3NpemVfID0gMDsKKyAgICBib29sIG1lcmdlX2luX3Byb2dyZXNzXyA9IGZhbHNlOworCisgICAgaW50IG51bV9jb21wcmVzc190aHJlYWRzXyA9IDE7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENvbXByZXNzV29ya2VyPj4gY29tcHJlc3NfdGhyZWFkc187CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpmdXR1cmU8Ym9vbD4+IHRocmVhZHNfOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+PiBjb21wcmVzc2VkX2J1Zl87CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4+OjppdGVyYXRvciBidWZfaXRlcl87CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q293T3BlcmF0aW9uVjI+PiBvcGJ1ZmZlcl92ZWNfOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+PiBkYXRhYnVmZmVyX3ZlY187CisgICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBpb3ZlY1tdPiBjb3dvcF92ZWNfOworICAgIGludCBvcF92ZWNfaW5kZXhfID0gMDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgaW92ZWNbXT4gZGF0YV92ZWNfOworICAgIGludCBkYXRhX3ZlY19pbmRleF8gPSAwOworICAgIGJvb2wgYmF0Y2hfd3JpdGVfID0gZmFsc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl92My5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl92My5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2YjZkYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YzLmNwcApAQCAtMCwwICsxLDU4OCBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZV9pbmZvIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSAid3JpdGVyX3YzLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxicm90bGkvZW5jb2RlLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+CisjaW5jbHVkZSA8bHo0Lmg+CisjaW5jbHVkZSA8emxpYi5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfY29tcHJlc3MuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxudW1lcmljPgorCisvLyBUaGUgaW5mbyBtZXNzYWdlcyBoZXJlIGFyZSBzcGFtbXksIGJ1dCBhcyB1c2VmdWwgZm9yIHVwZGF0ZV9lbmdpbmUuIERpc2FibGUKKy8vIHRoZW0gd2hlbiBydW5uaW5nIG9uIHRoZSBob3N0LgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIExPR19JTkZPIExPRyhJTkZPKQorI2Vsc2UKKyNkZWZpbmUgTE9HX0lORk8gTE9HKFZFUkJPU0UpCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworc3RhdGljX2Fzc2VydChzaXplb2Yob2ZmX3QpID09IHNpemVvZih1aW50NjRfdCkpOworCit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKKy8vIERpdmlkZSB8eHwgYnkgfHl8IGFuZCByb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLgorY29uc3RleHByIHVpbnQ2NF90IERpdlJvdW5kVXAodWludDY0X3QgeCwgdWludDY0X3QgeSkgeworICAgIHJldHVybiAoeCArIHkgLSAxKSAvIHk7Cit9CisKK0Nvd1dyaXRlclYzOjpDb3dXcml0ZXJWMyhjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zLCB1bmlxdWVfZmQmJiBmZCkKKyAgICA6IENvd1dyaXRlckJhc2Uob3B0aW9ucywgc3RkOjptb3ZlKGZkKSksIGJhdGNoX3NpemVfKHN0ZDo6bWF4PHNpemVfdD4ob3B0aW9ucy5jbHVzdGVyX29wcywgMSkpIHsKKyAgICBTZXR1cEhlYWRlcnMoKTsKK30KKwordm9pZCBDb3dXcml0ZXJWMzo6SW5pdFdvcmtlcnMoKSB7CisgICAgaWYgKG51bV9jb21wcmVzc190aHJlYWRzXyA8PSAxKSB7CisgICAgICAgIExPR19JTkZPIDw8ICJOb3QgY3JlYXRpbmcgbmV3IHRocmVhZHMgZm9yIGNvbXByZXNzaW9uLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29tcHJlc3NfdGhyZWFkc18ucmVzZXJ2ZShudW1fY29tcHJlc3NfdGhyZWFkc18pOworICAgIGNvbXByZXNzX3RocmVhZHNfLmNsZWFyKCk7CisgICAgdGhyZWFkc18ucmVzZXJ2ZShudW1fY29tcHJlc3NfdGhyZWFkc18pOworICAgIHRocmVhZHNfLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fY29tcHJlc3NfdGhyZWFkc187IGkrKykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IGNvbXByZXNzb3IgPQorICAgICAgICAgICAgICAgIElDb21wcmVzc29yOjpDcmVhdGUoY29tcHJlc3Npb25fLCBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICBhdXRvJiYgd3QgPSBjb21wcmVzc190aHJlYWRzXy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc1dvcmtlcj4oc3RkOjptb3ZlKGNvbXByZXNzb3IpLCBoZWFkZXJfLmJsb2NrX3NpemUpKTsKKyAgICAgICAgdGhyZWFkc18uZW1wbGFjZV9iYWNrKHN0ZDo6dGhyZWFkKFt3dCA9IHd0LmdldCgpXSgpIHsgd3QtPlJ1blRocmVhZCgpOyB9KSk7CisgICAgfQorICAgIExPRyhJTkZPKSA8PCBudW1fY29tcHJlc3NfdGhyZWFkc18gPDwgIiB0aHJlYWQgdXNlZCBmb3IgY29tcHJlc3Npb24iOworfQorCit2b2lkIENvd1dyaXRlclYzOjpTZXR1cEhlYWRlcnMoKSB7CisgICAgaGVhZGVyXyA9IHt9OworICAgIGhlYWRlcl8ucHJlZml4Lm1hZ2ljID0ga0Nvd01hZ2ljTnVtYmVyOworICAgIGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24gPSAzOworICAgIGhlYWRlcl8ucHJlZml4Lm1pbm9yX3ZlcnNpb24gPSAwOworICAgIGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplID0gc2l6ZW9mKENvd0hlYWRlclYzKTsKKyAgICBoZWFkZXJfLmZvb3Rlcl9zaXplID0gMDsKKyAgICBoZWFkZXJfLm9wX3NpemUgPSBzaXplb2YoQ293T3BlcmF0aW9uVjMpOworICAgIGhlYWRlcl8uYmxvY2tfc2l6ZSA9IG9wdGlvbnNfLmJsb2NrX3NpemU7CisgICAgaGVhZGVyXy5udW1fbWVyZ2Vfb3BzID0gb3B0aW9uc18ubnVtX21lcmdlX29wczsKKyAgICBoZWFkZXJfLmNsdXN0ZXJfb3BzID0gMDsKKyAgICBpZiAob3B0aW9uc18uc2NyYXRjaF9zcGFjZSkgeworICAgICAgICBoZWFkZXJfLmJ1ZmZlcl9zaXplID0gQlVGRkVSX1JFR0lPTl9ERUZBVUxUX1NJWkU7CisgICAgfQorCisgICAgLy8gdjMgc3BlY2lmaWMgZmllbGRzCisgICAgLy8gV0lQOiBub3QgcXVpdGUgc3VyZSBob3cgc29tZSBvZiB0aGVzZSBhcmUgY2FsY3VsYXRlZCB5ZXQsIGFzc3VtaW5nIGJ1ZmZlcl9zaXplIGlzIGRldGVybWluZWQKKyAgICAvLyBkdXJpbmcgQ09XIHNpemUgZXN0aW1hdGlvbgorICAgIGhlYWRlcl8uc2VxdWVuY2VfZGF0YV9jb3VudCA9IDA7CisKKyAgICBoZWFkZXJfLnJlc3VtZV9wb2ludF9jb3VudCA9IDA7CisgICAgaGVhZGVyXy5yZXN1bWVfcG9pbnRfbWF4ID0ga051bVJlc3VtZVBvaW50czsKKyAgICBoZWFkZXJfLm9wX2NvdW50ID0gMDsKKyAgICBoZWFkZXJfLm9wX2NvdW50X21heCA9IDA7CisgICAgaGVhZGVyXy5jb21wcmVzc2lvbl9hbGdvcml0aG0gPSBrQ293Q29tcHJlc3NOb25lOworICAgIHJldHVybjsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6UGFyc2VPcHRpb25zKCkgeworICAgIG51bV9jb21wcmVzc190aHJlYWRzXyA9IHN0ZDo6bWF4KG9wdGlvbnNfLm51bV9jb21wcmVzc190aHJlYWRzLCAxKTsKKyAgICBhdXRvIHBhcnRzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQob3B0aW9uc18uY29tcHJlc3Npb24sICIsIik7CisgICAgaWYgKHBhcnRzLnNpemUoKSA+IDIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHBhcnNlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnM6IGludmFsaWQgYXJndW1lbnQgY291bnQ6ICIKKyAgICAgICAgICAgICAgICAgICA8PCBwYXJ0cy5zaXplKCkgPDwgIiAiIDw8IG9wdGlvbnNfLmNvbXByZXNzaW9uOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gYWxnb3JpdGhtID0gQ29tcHJlc3Npb25BbGdvcml0aG1Gcm9tU3RyaW5nKHBhcnRzWzBdKTsKKyAgICBpZiAoIWFsZ29yaXRobSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJ1bnJlY29nbml6ZWQgY29tcHJlc3Npb246ICIgPDwgb3B0aW9uc18uY29tcHJlc3Npb247CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyXy5jb21wcmVzc2lvbl9hbGdvcml0aG0gPSAqYWxnb3JpdGhtOworICAgIGhlYWRlcl8ub3BfY291bnRfbWF4ID0gb3B0aW9uc18ub3BfY291bnRfbWF4OworCisgICAgaWYgKHBhcnRzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQocGFydHNbMV0sICZjb21wcmVzc2lvbl8uY29tcHJlc3Npb25fbGV2ZWwpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gcGFyc2UgY29tcHJlc3Npb24gbGV2ZWwgaW52YWxpZCB0eXBlOiAiIDw8IHBhcnRzWzFdOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29tcHJlc3Npb25fLmNvbXByZXNzaW9uX2xldmVsID0KKyAgICAgICAgICAgICAgICBDb21wcmVzc1dvcmtlcjo6R2V0RGVmYXVsdENvbXByZXNzaW9uTGV2ZWwoYWxnb3JpdGhtLnZhbHVlKCkpOworICAgIH0KKworICAgIGNvbXByZXNzaW9uXy5hbGdvcml0aG0gPSAqYWxnb3JpdGhtOworICAgIGlmIChjb21wcmVzc2lvbl8uYWxnb3JpdGhtICE9IGtDb3dDb21wcmVzc05vbmUpIHsKKyAgICAgICAgY29tcHJlc3Nvcl8gPSBJQ29tcHJlc3Nvcjo6Q3JlYXRlKGNvbXByZXNzaW9uXywgaGVhZGVyXy5ibG9ja19zaXplKTsKKyAgICAgICAgaWYgKGNvbXByZXNzb3JfID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgY29tcHJlc3NvciBmb3IgIiA8PCBjb21wcmVzc2lvbl8uYWxnb3JpdGhtOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChvcHRpb25zXy5jbHVzdGVyX29wcyAmJgorICAgICAgICAgICAgKGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8udmlydHVhbF9hYi5iYXRjaF93cml0ZXMiLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICBvcHRpb25zXy5iYXRjaF93cml0ZSkpIHsKKyAgICAgICAgICAgIGJhdGNoX3NpemVfID0gc3RkOjptYXg8c2l6ZV90PihvcHRpb25zXy5jbHVzdGVyX29wcywgMSk7CisgICAgICAgICAgICBkYXRhX3ZlY18ucmVzZXJ2ZShiYXRjaF9zaXplXyk7CisgICAgICAgICAgICBjYWNoZWRfZGF0YV8ucmVzZXJ2ZShiYXRjaF9zaXplXyk7CisgICAgICAgICAgICBjYWNoZWRfb3BzXy5yZXNlcnZlKGJhdGNoX3NpemVfKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmF0Y2hfc2l6ZV8gPiAxKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQmF0Y2ggd3JpdGVzOiBlbmFibGVkIHdpdGggYmF0Y2ggc2l6ZSAiIDw8IGJhdGNoX3NpemVfOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQmF0Y2ggd3JpdGVzOiBkaXNhYmxlZCI7CisgICAgfQorICAgIGlmIChhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24udGhyZWFkcyIsIGZhbHNlKSAmJgorICAgICAgICBvcHRpb25zXy5udW1fY29tcHJlc3NfdGhyZWFkcykgeworICAgICAgICBudW1fY29tcHJlc3NfdGhyZWFkc18gPSBvcHRpb25zXy5udW1fY29tcHJlc3NfdGhyZWFkczsKKyAgICB9CisgICAgSW5pdFdvcmtlcnMoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworQ293V3JpdGVyVjM6On5Db3dXcml0ZXJWMygpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHQgOiBjb21wcmVzc190aHJlYWRzXykgeworICAgICAgICB0LT5GaW5hbGl6ZSgpOworICAgIH0KKyAgICBmb3IgKGF1dG8mIHQgOiB0aHJlYWRzXykgeworICAgICAgICBpZiAodC5qb2luYWJsZSgpKSB7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDb3dXcml0ZXJWMzo6SW5pdGlhbGl6ZShzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgeworICAgIGlmICghSW5pdEZkKCkgfHwgIVBhcnNlT3B0aW9ucygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFsYWJlbCkgeworICAgICAgICBpZiAoIU9wZW5Gb3JXcml0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIU9wZW5Gb3JBcHBlbmQoKmxhYmVsKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6Ok9wZW5Gb3JXcml0ZSgpIHsKKyAgICAvLyBUaGlzIGxpbWl0YXRpb24gaXMgdGllZCB0byB0aGUgZGF0YSBmaWVsZCBzaXplIGluIENvd09wZXJhdGlvblYyLgorICAgIC8vIEtlZXBpbmcgdGhpcyBmb3IgVjMgd3JpdGVyIDwtIGFsdGhvdWdoIHdlCisgICAgaWYgKGhlYWRlcl8uYmxvY2tfc2l6ZSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJCbG9jayBzaXplIGlzIHRvbyBsYXJnZSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobHNlZWsoZmRfLmdldCgpLCAwLCBTRUVLX1NFVCkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSGVhZGVycyBhcmUgbm90IGNvbXBsZXRlLCBidXQgdGhpcyBlbnN1cmVzIHRoZSBmaWxlIGlzIGF0IHRoZSByaWdodAorICAgIC8vIHBvc2l0aW9uLgorICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShmZF8sICZoZWFkZXJfLCBzaXplb2YoaGVhZGVyXykpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnNfLnNjcmF0Y2hfc3BhY2UpIHsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc2NyYXRjaCBzcGFjZQorICAgICAgICBzdGQ6OnN0cmluZyBkYXRhKGhlYWRlcl8uYnVmZmVyX3NpemUsIDApOworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoZmRfLCBkYXRhLmRhdGEoKSwgaGVhZGVyXy5idWZmZXJfc2l6ZSkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0aW5nIHNjcmF0Y2ggc3BhY2UgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VtZV9wb2ludHNfID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3RvcjxSZXN1bWVQb2ludD4+KCk7CisKKyAgICBpZiAoIVN5bmMoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJIZWFkZXIgc3luYyBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG5leHRfZGF0YV9wb3NfID0gR2V0RGF0YU9mZnNldChoZWFkZXJfKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6T3BlbkZvckFwcGVuZCh1aW50NjRfdCBsYWJlbCkgeworICAgIENvd0hlYWRlclYzIGhlYWRlcl92M3t9OworICAgIGlmICghUmVhZENvd0hlYWRlcihmZF8sICZoZWFkZXJfdjMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkbid0IHJlYWQgQ293IEhlYWRlciI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBoZWFkZXJfID0gaGVhZGVyX3YzOworCisgICAgQ0hFQ0sobGFiZWwgPj0gMCk7CisgICAgQ293UGFyc2VyVjMgcGFyc2VyOworICAgIGlmICghcGFyc2VyLlBhcnNlKGZkXywgaGVhZGVyXywgbGFiZWwpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJ1bmFibGUgdG8gcGFyc2Ugd2l0aCBnaXZlbiBsYWJlbDogIiA8PCBsYWJlbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJlc3VtZV9wb2ludHNfID0gcGFyc2VyLnJlc3VtZV9wb2ludHMoKTsKKyAgICBvcHRpb25zXy5ibG9ja19zaXplID0gaGVhZGVyXy5ibG9ja19zaXplOworICAgIG5leHRfZGF0YV9wb3NfID0gR2V0RGF0YU9mZnNldChoZWFkZXJfKTsKKworICAgIFRyYW5zbGF0ZWRDb3dPcHMgb3BzOworICAgIHBhcnNlci5UcmFuc2xhdGUoJm9wcyk7CisgICAgaGVhZGVyXy5vcF9jb3VudCA9IG9wcy5vcHMtPnNpemUoKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgb3AgOiAqb3BzLm9wcykgeworICAgICAgICBuZXh0X2RhdGFfcG9zXyArPSBvcC5kYXRhX2xlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6Q2hlY2tPcENvdW50KHNpemVfdCBvcF9jb3VudCkgeworICAgIGlmIChJc0VzdGltYXRpbmcoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGhlYWRlcl8ub3BfY291bnQgKyBjYWNoZWRfb3BzXy5zaXplKCkgKyBvcF9jb3VudCA+IGhlYWRlcl8ub3BfY291bnRfbWF4KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkN1cnJlbnQgbnVtYmVyIG9mIG9wcyBvbiBkaXNrOiAiIDw8IGhlYWRlcl8ub3BfY291bnQKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBudW1iZXIgb2Ygb3BzIGNhY2hlZCBpbiBtZW1vcnk6ICIgPDwgY2FjaGVkX29wc18uc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiwgbnVtYmVyIG9mIG9wcyBhdHRlbXB0aW5nIHRvIHdyaXRlOiAiIDw8IG9wX2NvdW50CisgICAgICAgICAgICAgICAgICAgPDwgIiwgdGhpcyB3aWxsIGV4Y2VlZCBtYXggb3AgY291bnQgIiA8PCBoZWFkZXJfLm9wX2NvdW50X21heDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6RW1pdENvcHkodWludDY0X3QgbmV3X2Jsb2NrLCB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQ2NF90IG51bV9ibG9ja3MpIHsKKyAgICBpZiAoIUNoZWNrT3BDb3VudChudW1fYmxvY2tzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CisgICAgICAgIENvd09wZXJhdGlvblYzJiBvcCA9IGNhY2hlZF9vcHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBvcC5zZXRfdHlwZShrQ293Q29weU9wKTsKKyAgICAgICAgb3AubmV3X2Jsb2NrID0gbmV3X2Jsb2NrICsgaTsKKyAgICAgICAgb3Auc2V0X3NvdXJjZShvbGRfYmxvY2sgKyBpKTsKKyAgICB9CisKKyAgICBpZiAoTmVlZHNGbHVzaCgpKSB7CisgICAgICAgIGlmICghRmx1c2hDYWNoZU9wcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkVtaXRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmICghQ2hlY2tPcENvdW50KHNpemUgLyBoZWFkZXJfLmJsb2NrX3NpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEVtaXRCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplLCAwLCAwLCBrQ293UmVwbGFjZU9wKTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6RW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCkgeworICAgIGlmICghQ2hlY2tPcENvdW50KHNpemUgLyBoZWFkZXJfLmJsb2NrX3NpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEVtaXRCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplLCBvbGRfYmxvY2ssIG9mZnNldCwga0Nvd1hvck9wKTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6TmVlZHNGbHVzaCgpIGNvbnN0IHsKKyAgICAvLyBBbGxvdyBiaWdnZXIgYmF0Y2ggc2l6ZXMgZm9yIG9wcyB3aXRob3V0IGRhdGEuIEEgc2luZ2xlIENvd09wZXJhdGlvblYzCisgICAgLy8gc3RydWN0IHVzZXMgMTQgYnl0ZXMgb2YgbWVtb3J5LCBldmVuIGlmIHdlIGNhY2hlIDIwMCAqIDE2IG9wcyBpbiBtZW1vcnksCisgICAgLy8gaXQncyBvbmx5IH40NEsuCisgICAgcmV0dXJuIGNhY2hlZF9kYXRhXy5zaXplKCkgPj0gYmF0Y2hfc2l6ZV8gfHwgY2FjaGVkX29wc18uc2l6ZSgpID49IGJhdGNoX3NpemVfICogMTY7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkVtaXRCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQsIENvd09wZXJhdGlvblR5cGUgdHlwZSkgeworICAgIGlmIChjb21wcmVzc2lvbl8uYWxnb3JpdGhtICE9IGtDb3dDb21wcmVzc05vbmUgJiYgY29tcHJlc3Nvcl8gPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgIiA8PCBjb21wcmVzc2lvbl8uYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICAgPDwgIiBidXQgY29tcHJlc3NvciBpcyB1bmluaXRpYWxpemVkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgYXV0byBieXRlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpOworICAgIGNvbnN0IHNpemVfdCBudW1fYmxvY2tzID0gKHNpemUgLyBoZWFkZXJfLmJsb2NrX3NpemUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOykgeworICAgICAgICBjb25zdCBhdXRvIGJsb2Nrc190b193cml0ZSA9CisgICAgICAgICAgICAgICAgc3RkOjptaW48c2l6ZV90PihiYXRjaF9zaXplXyAtIGNhY2hlZF9kYXRhXy5zaXplKCksIG51bV9ibG9ja3MgLSBpKTsKKyAgICAgICAgc2l6ZV90IGNvbXByZXNzZWRfYnl0ZXMgPSAwOworICAgICAgICBhdXRvJiYgYmxvY2tzID0gQ29tcHJlc3NCbG9ja3MoYmxvY2tzX3RvX3dyaXRlLCBieXRlcyArIGhlYWRlcl8uYmxvY2tfc2l6ZSAqIGkpOworICAgICAgICBpZiAoYmxvY2tzLnNpemUoKSAhPSBibG9ja3NfdG9fd3JpdGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjb21wcmVzcyBibG9ja3MgIiA8PCBuZXdfYmxvY2tfc3RhcnQgKyBpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgYmxvY2tzX3RvX3dyaXRlIDw8ICIsIGFjdHVhbCBudW1iZXIgb2YgYmxvY2tzIHJlY2VpdmVkIGZyb20gY29tcHJlc3NvciAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGJsb2Nrcy5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBibG9ja3NfdG9fd3JpdGU7IGorKykgeworICAgICAgICAgICAgQ293T3BlcmF0aW9uJiBvcCA9IGNhY2hlZF9vcHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICAgICAgYXV0byYgdmVjID0gZGF0YV92ZWNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICAgICAgYXV0byYgY29tcHJlc3NlZF9kYXRhID0gY2FjaGVkX2RhdGFfLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoYmxvY2tzW2pdKSk7CisgICAgICAgICAgICBvcC5uZXdfYmxvY2sgPSBuZXdfYmxvY2tfc3RhcnQgKyBpICsgajsKKworICAgICAgICAgICAgb3Auc2V0X3R5cGUodHlwZSk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrQ293WG9yT3ApIHsKKyAgICAgICAgICAgICAgICBvcC5zZXRfc291cmNlKChvbGRfYmxvY2sgKyBpICsgaikgKiBoZWFkZXJfLmJsb2NrX3NpemUgKyBvZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcC5zZXRfc291cmNlKG5leHRfZGF0YV9wb3NfICsgY29tcHJlc3NlZF9ieXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ZWMgPSB7Lmlvdl9iYXNlID0gY29tcHJlc3NlZF9kYXRhLmRhdGEoKSwgLmlvdl9sZW4gPSBjb21wcmVzc2VkX2RhdGEuc2l6ZSgpfTsKKyAgICAgICAgICAgIG9wLmRhdGFfbGVuZ3RoID0gdmVjLmlvdl9sZW47CisgICAgICAgICAgICBjb21wcmVzc2VkX2J5dGVzICs9IG9wLmRhdGFfbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGlmIChOZWVkc0ZsdXNoKCkgJiYgIUZsdXNoQ2FjaGVPcHMoKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRW1pdEJsb2NrcyB3aXRoIGNvbXByZXNzaW9uOiB3cml0ZSBmYWlsZWQuIG5ldyBibG9jazogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBuZXdfYmxvY2tfc3RhcnQgPDwgIiBjb21wcmVzc2lvbjogIiA8PCBjb21wcmVzc2lvbl8uYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIG9wIHR5cGU6ICIgPDwgdHlwZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpICs9IGJsb2Nrc190b193cml0ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6RW1pdFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB1aW50NjRfdCBudW1fYmxvY2tzKSB7CisgICAgaWYgKCFDaGVja09wQ291bnQobnVtX2Jsb2NrcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CisgICAgICAgIGF1dG8mIG9wID0gY2FjaGVkX29wc18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIG9wLnNldF90eXBlKGtDb3daZXJvT3ApOworICAgICAgICBvcC5uZXdfYmxvY2sgPSBuZXdfYmxvY2tfc3RhcnQgKyBpOworICAgIH0KKyAgICBpZiAoTmVlZHNGbHVzaCgpKSB7CisgICAgICAgIGlmICghRmx1c2hDYWNoZU9wcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkVtaXRMYWJlbCh1aW50NjRfdCBsYWJlbCkgeworICAgIC8vIHJlbW92ZSBhbGwgbGFiZWxzIGdyZWF0ZXIgdGhhbiB0aGlzIGN1cnJlbnQgb25lLiB3ZSB3YW50IHRvIGF2b2lkIHRoZSBzaXR1YXRpb24gb2YgYWRkaW5nCisgICAgLy8gaW4KKyAgICAvLyBkdXBsaWNhdGUgbGFiZWxzIHdpdGggZGlmZmVyaW5nIG9wIHZhbHVlcworICAgIGlmICghRmx1c2hDYWNoZU9wcygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmbHVzaCBjYWNoZWQgb3BzIGJlZm9yZSBlbWl0dGluZyBsYWJlbCAiIDw8IGxhYmVsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gcmVtb3ZlX2lmX2NhbGxiYWNrID0gWyZdKGNvbnN0IGF1dG8mIHJlc3VtZV9wb2ludCkgLT4gYm9vbCB7CisgICAgICAgIGlmIChyZXN1bWVfcG9pbnQubGFiZWwgPj0gbGFiZWwpIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKyAgICByZXN1bWVfcG9pbnRzXy0+ZXJhc2UoCisgICAgICAgICAgICBzdGQ6OnJlbW92ZV9pZihyZXN1bWVfcG9pbnRzXy0+YmVnaW4oKSwgcmVzdW1lX3BvaW50c18tPmVuZCgpLCByZW1vdmVfaWZfY2FsbGJhY2spLAorICAgICAgICAgICAgcmVzdW1lX3BvaW50c18tPmVuZCgpKTsKKworICAgIHJlc3VtZV9wb2ludHNfLT5wdXNoX2JhY2soe2xhYmVsLCBoZWFkZXJfLm9wX2NvdW50fSk7CisgICAgaGVhZGVyXy5yZXN1bWVfcG9pbnRfY291bnQrKzsKKyAgICAvLyByZW1vdmUgdGhlIG9sZGVzdCByZXN1bWUgcG9pbnQgaWYgcmVzdW1lX2J1ZmZlciBpcyBmdWxsCisgICAgd2hpbGUgKHJlc3VtZV9wb2ludHNfLT5zaXplKCkgPiBoZWFkZXJfLnJlc3VtZV9wb2ludF9tYXgpIHsKKyAgICAgICAgcmVzdW1lX3BvaW50c18tPmVyYXNlKHJlc3VtZV9wb2ludHNfLT5iZWdpbigpKTsKKyAgICB9CisKKyAgICBDSEVDS19MRShyZXN1bWVfcG9pbnRzXy0+c2l6ZSgpLCBoZWFkZXJfLnJlc3VtZV9wb2ludF9tYXgpOworCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5QXRPZmZzZXQoZmRfLCByZXN1bWVfcG9pbnRzXy0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZV9wb2ludHNfLT5zaXplKCkgKiBzaXplb2YoUmVzdW1lUG9pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFJlc3VtZU9mZnNldChoZWFkZXJfKSkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRpbmcgcmVzdW1lIGJ1ZmZlciBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBGaW5hbGl6ZSgpOworfQorCitib29sIENvd1dyaXRlclYzOjpFbWl0U2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgeworICAgIGlmIChoZWFkZXJfLm9wX2NvdW50ID4gMCB8fCAhY2FjaGVkX29wc18uZW1wdHkoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJUaGVyZSdzICIgPDwgaGVhZGVyXy5vcF9jb3VudCA8PCAiIG9wZXJhdGlvbnMgd3JpdHRlbiB0byBkaXNrIGFuZCAiCisgICAgICAgICAgICAgICAgICAgPDwgY2FjaGVkX29wc18uc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBvcHMgY2FjaGVkIGluIG1lbW9yeS4gV3JpdGluZyBzZXF1ZW5jZSBkYXRhIGlzIG9ubHkgYWxsb3dlZCBiZWZvcmUgYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uIHdyaXRlcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaGVhZGVyXy5zZXF1ZW5jZV9kYXRhX2NvdW50ID0gbnVtX29wczsKKworICAgIC8vIEVuc3VyZSBuZXh0X2RhdGFfcG9zXyBpcyB1cGRhdGVkIGFzIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgKyB0aGUgbmV3bHkgYWRkZWQgc2VxdWVuY2UgYnVmZmVyLgorICAgIENIRUNLX0VRKG5leHRfZGF0YV9wb3NfICsgaGVhZGVyXy5zZXF1ZW5jZV9kYXRhX2NvdW50ICogc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICBHZXREYXRhT2Zmc2V0KGhlYWRlcl8pKTsKKyAgICBuZXh0X2RhdGFfcG9zXyA9IEdldERhdGFPZmZzZXQoaGVhZGVyXyk7CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHlBdE9mZnNldChmZF8sIGRhdGEsIHNpemVvZihkYXRhWzBdKSAqIG51bV9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2VxdWVuY2VPZmZzZXQoaGVhZGVyXykpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0aW5nIHNlcXVlbmNlIGJ1ZmZlciBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvd1dyaXRlclYzOjpGbHVzaENhY2hlT3BzKCkgeworICAgIGlmIChjYWNoZWRfb3BzXy5lbXB0eSgpKSB7CisgICAgICAgIGlmICghZGF0YV92ZWNfLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhY2hlZCBvcHMgaXMgZW1wdHksIGJ1dCBkYXRhIGlvdmVjIGhhcyBzaXplOiAiIDw8IGRhdGFfdmVjXy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB0aGlzIGlzIGRlZmluaXRlbHkgYSBidWcuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc2l6ZV90IGJ5dGVzX3dyaXR0ZW4gPSAwOworCisgICAgZm9yIChhdXRvJiBvcCA6IGNhY2hlZF9vcHNfKSB7CisgICAgICAgIGlmIChvcC50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgb3Auc2V0X3NvdXJjZShuZXh0X2RhdGFfcG9zXyArIGJ5dGVzX3dyaXR0ZW4pOworICAgICAgICB9CisgICAgICAgIGJ5dGVzX3dyaXR0ZW4gKz0gb3AuZGF0YV9sZW5ndGg7CisgICAgfQorICAgIGlmICghV3JpdGVPcGVyYXRpb24oe2NhY2hlZF9vcHNfLmRhdGEoKSwgY2FjaGVkX29wc18uc2l6ZSgpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhX3ZlY18uZGF0YSgpLCBkYXRhX3ZlY18uc2l6ZSgpfSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZsdXNoICIgPDwgY2FjaGVkX29wc18uc2l6ZSgpIDw8ICIgb3BzIHRvIGRpc2siOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhY2hlZF9vcHNfLmNsZWFyKCk7CisgICAgY2FjaGVkX2RhdGFfLmNsZWFyKCk7CisgICAgZGF0YV92ZWNfLmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+PiBDb3dXcml0ZXJWMzo6Q29tcHJlc3NCbG9ja3MoY29uc3Qgc2l6ZV90IG51bV9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgICBjb25zdCBzaXplX3QgbnVtX3RocmVhZHMgPSAobnVtX2Jsb2NrcyA9PSAxKSA/IDEgOiBudW1fY29tcHJlc3NfdGhyZWFkc187CisgICAgY29uc3Qgc2l6ZV90IGJsb2Nrc19wZXJfdGhyZWFkID0gRGl2Um91bmRVcChudW1fYmxvY2tzLCBudW1fdGhyZWFkcyk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4+IGNvbXByZXNzZWRfYnVmOworICAgIGNvbXByZXNzZWRfYnVmLmNsZWFyKCk7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgaXRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpOworICAgIGlmIChjb21wcmVzc2lvbl8uYWxnb3JpdGhtID09IGtDb3dDb21wcmVzc05vbmUpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKyAgICAgICAgICAgIGF1dG8mIGJ1ZiA9IGNvbXByZXNzZWRfYnVmLmVtcGxhY2VfYmFjaygpOworICAgICAgICAgICAgYnVmLnJlc2l6ZShoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICAgICAgc3RkOjptZW1jcHkoYnVmLmRhdGEoKSwgaXRlciArIGkgKiBoZWFkZXJfLmJsb2NrX3NpemUsIGhlYWRlcl8uYmxvY2tfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXByZXNzZWRfYnVmOworICAgIH0KKyAgICBpZiAobnVtX3RocmVhZHMgPD0gMSkgeworICAgICAgICBpZiAoIUNvbXByZXNzV29ya2VyOjpDb21wcmVzc0Jsb2Nrcyhjb21wcmVzc29yXy5nZXQoKSwgaGVhZGVyXy5ibG9ja19zaXplLCBkYXRhLCBudW1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NlZF9idWYpKSB7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTdWJtaXQgdGhlIGJsb2NrcyBwZXIgdGhyZWFkLiBUaGUgcmV0cmlldmFsIG9mCisgICAgICAgIC8vIGNvbXByZXNzZWQgYnVmZmVycyBoYXMgdG8gYmUgZG9uZSBpbiB0aGUgc2FtZSBvcmRlci4KKyAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBwb2xsIGZvciBjb21wbGV0ZWQgYnVmZmVycyBpbiBhIGRpZmZlcmVudCBvcmRlciBhcyB0aGUKKyAgICAgICAgLy8gYnVmZmVycyBhcmUgdGlnaHRseSBjb3VwbGVkIHdpdGggYmxvY2sgb3JkZXJpbmcuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgeworICAgICAgICAgICAgQ29tcHJlc3NXb3JrZXIqIHdvcmtlciA9IGNvbXByZXNzX3RocmVhZHNfW2ldLmdldCgpOworICAgICAgICAgICAgY29uc3QgYXV0byBibG9ja3NfaW5fYmF0Y2ggPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihudW1fYmxvY2tzIC0gaSAqIGJsb2Nrc19wZXJfdGhyZWFkLCBibG9ja3NfcGVyX3RocmVhZCk7CisgICAgICAgICAgICB3b3JrZXItPkVucXVldWVDb21wcmVzc0Jsb2NrcyhpdGVyICsgaSAqIGJsb2Nrc19wZXJfdGhyZWFkICogaGVhZGVyXy5ibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzX2luX2JhdGNoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgeworICAgICAgICAgICAgQ29tcHJlc3NXb3JrZXIqIHdvcmtlciA9IGNvbXByZXNzX3RocmVhZHNfW2ldLmdldCgpOworICAgICAgICAgICAgaWYgKCF3b3JrZXItPkdldENvbXByZXNzZWRCdWZmZXJzKCZjb21wcmVzc2VkX2J1ZikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKyAgICAgICAgYXV0byYgYmxvY2sgPSBjb21wcmVzc2VkX2J1ZltpXTsKKyAgICAgICAgaWYgKGJsb2NrLnNpemUoKSA+PSBoZWFkZXJfLmJsb2NrX3NpemUpIHsKKyAgICAgICAgICAgIGJsb2NrLnJlc2l6ZShoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICAgICAgc3RkOjptZW1jcHkoYmxvY2suZGF0YSgpLCBpdGVyICsgaGVhZGVyXy5ibG9ja19zaXplICogaSwgaGVhZGVyXy5ibG9ja19zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb21wcmVzc2VkX2J1ZjsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6V3JpdGVPcGVyYXRpb24oc3RkOjpiYXNpY19zdHJpbmdfdmlldzxDb3dPcGVyYXRpb25WMz4gb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYXNpY19zdHJpbmdfdmlldzxzdHJ1Y3QgaW92ZWM+IGRhdGEpIHsKKyAgICBjb25zdCBhdXRvIHRvdGFsX2RhdGFfc2l6ZSA9CisgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybV9yZWR1Y2UoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCAwLCBzdGQ6OnBsdXM8c2l6ZV90Pnt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0cnVjdCBpb3ZlYyYgYSkgeyByZXR1cm4gYS5pb3ZfbGVuOyB9KTsKKyAgICBpZiAoSXNFc3RpbWF0aW5nKCkpIHsKKyAgICAgICAgaGVhZGVyXy5vcF9jb3VudCArPSBvcHMuc2l6ZSgpOworICAgICAgICBpZiAoaGVhZGVyXy5vcF9jb3VudCA+IGhlYWRlcl8ub3BfY291bnRfbWF4KSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBpbmNyZW1lbnQgb3BfY291bnRfbWF4LCB0aGUgb2Zmc2V0IG9mIGRhdGEgc2VjdGlvbiB3b3VsZAorICAgICAgICAgICAgLy8gY2hhbmdlLiBTbyBuZWVkIHRvIHVwZGF0ZSB8bmV4dF9kYXRhX3Bvc198CisgICAgICAgICAgICBuZXh0X2RhdGFfcG9zXyArPSAoaGVhZGVyXy5vcF9jb3VudCAtIGhlYWRlcl8ub3BfY291bnRfbWF4KSAqIHNpemVvZihDb3dPcGVyYXRpb25WMyk7CisgICAgICAgICAgICBoZWFkZXJfLm9wX2NvdW50X21heCA9IGhlYWRlcl8ub3BfY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgbmV4dF9kYXRhX3Bvc18gKz0gdG90YWxfZGF0YV9zaXplOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyXy5vcF9jb3VudCArIG9wcy5zaXplKCkgPiBoZWFkZXJfLm9wX2NvdW50X21heCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDdXJyZW50IG9wIGNvdW50ICIgPDwgaGVhZGVyXy5vcF9jb3VudCA8PCAiLCBhdHRlbXB0aW5nIHRvIHdyaXRlICIKKyAgICAgICAgICAgICAgICAgICA8PCBvcHMuc2l6ZSgpIDw8ICIgb3BzIHdpbGwgZXhjZWVkIHRoZSBtYXggb2YgIiA8PCBoZWFkZXJfLm9wX2NvdW50X21heDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBvZmZfdCBvZmZzZXQgPSBHZXRPcE9mZnNldChoZWFkZXJfLm9wX2NvdW50LCBoZWFkZXJfKTsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHlBdE9mZnNldChmZF8sIG9wcy5kYXRhKCksIG9wcy5zaXplKCkgKiBzaXplb2Yob3BzWzBdKSwgb2Zmc2V0KSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiV3JpdGUgZmFpbGVkIGZvciAiIDw8IG9wcy5zaXplKCkgPDwgIiBvcHMgYXQgIiA8PCBvZmZzZXQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgY29uc3QgYXV0byByZXQgPSBwd3JpdGV2KGZkXywgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCBuZXh0X2RhdGFfcG9zXyk7CisgICAgICAgIGlmIChyZXQgIT0gdG90YWxfZGF0YV9zaXplKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAid3JpdGUgZmFpbGVkIGZvciBkYXRhIG9mIHNpemU6ICIgPDwgZGF0YS5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYXQgb2Zmc2V0OiAiIDw8IG5leHRfZGF0YV9wb3NfIDw8ICIgIiA8PCByZXQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaGVhZGVyXy5vcF9jb3VudCArPSBvcHMuc2l6ZSgpOworICAgIG5leHRfZGF0YV9wb3NfICs9IHRvdGFsX2RhdGFfc2l6ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvd1dyaXRlclYzOjpGaW5hbGl6ZSgpIHsKKyAgICBDSEVDS19HRShoZWFkZXJfLnByZWZpeC5oZWFkZXJfc2l6ZSwgc2l6ZW9mKENvd0hlYWRlclYzKSk7CisgICAgQ0hFQ0tfTEUoaGVhZGVyXy5wcmVmaXguaGVhZGVyX3NpemUsIHNpemVvZihoZWFkZXJfKSk7CisgICAgaWYgKCFGbHVzaENhY2hlT3BzKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHlBdE9mZnNldChmZF8sICZoZWFkZXJfLCBoZWFkZXJfLnByZWZpeC5oZWFkZXJfc2l6ZSwgMCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gU3luYygpOworfQorCitDb3dTaXplSW5mbyBDb3dXcml0ZXJWMzo6R2V0Q293U2l6ZUluZm8oKSBjb25zdCB7CisgICAgQ293U2l6ZUluZm8gaW5mbzsKKyAgICBpbmZvLmNvd19zaXplID0gbmV4dF9kYXRhX3Bvc187CisgICAgaW5mby5vcF9jb3VudF9tYXggPSBoZWFkZXJfLm9wX2NvdW50X21heDsKKyAgICByZXR1cm4gaW5mbzsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjMuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YWY2MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YzLmgKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmdfdmlldz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAid3JpdGVyX2Jhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgQ293V3JpdGVyVjMgOiBwdWJsaWMgQ293V3JpdGVyQmFzZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBDb3dXcml0ZXJWMyhjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCk7CisgICAgfkNvd1dyaXRlclYzKCkgb3ZlcnJpZGU7CisKKyAgICBib29sIEluaXRpYWxpemUoc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwgPSB7fSkgb3ZlcnJpZGU7CisgICAgYm9vbCBGaW5hbGl6ZSgpIG92ZXJyaWRlOworICAgIENvd1NpemVJbmZvIEdldENvd1NpemVJbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0U2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIFNldHVwSGVhZGVycygpOworICAgIGJvb2wgTmVlZHNGbHVzaCgpIGNvbnN0OworICAgIGJvb2wgUGFyc2VPcHRpb25zKCk7CisgICAgYm9vbCBPcGVuRm9yV3JpdGUoKTsKKyAgICBib29sIE9wZW5Gb3JBcHBlbmQodWludDY0X3QgbGFiZWwpOworICAgIGJvb2wgV3JpdGVPcGVyYXRpb24oc3RkOjpiYXNpY19zdHJpbmdfdmlldzxDb3dPcGVyYXRpb25WMz4gb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZ192aWV3PHN0cnVjdCBpb3ZlYz4gZGF0YSk7CisgICAgYm9vbCBFbWl0QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IG9sZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LCBDb3dPcGVyYXRpb25UeXBlIHR5cGUpOworICAgIGJvb2wgQ2hlY2tPcENvdW50KHNpemVfdCBvcF9jb3VudCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4gQ29tcHJlc3NCbG9ja3MoY29uc3Qgc2l6ZV90IG51bV9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEpOworICAgIGJvb2wgUmVhZEJhY2tWZXJpZmljYXRpb24oKTsKKyAgICBib29sIEZsdXNoQ2FjaGVPcHMoKTsKKyAgICB2b2lkIEluaXRXb3JrZXJzKCk7CisgICAgQ293SGVhZGVyVjMgaGVhZGVyX3t9OworICAgIENvd0NvbXByZXNzaW9uIGNvbXByZXNzaW9uXzsKKyAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHdlIGFyZSB1c2luZyBvbmUgdGhyZWFkIGZvciBjb21wcmVzc2lvbiwgd2UgY2FuIHN0b3JlIGFuZCByZS11c2UgdGhlIHNhbWUKKyAgICAvLyBjb21wcmVzc29yCisgICAgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBjb21wcmVzc29yXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29tcHJlc3NXb3JrZXI+PiBjb21wcmVzc190aHJlYWRzXzsKKyAgICAvLyBSZXN1bWUgcG9pbnRzIGNvbnRhaW4gYSBsYWVibCArIGNvd19vcF9pbmRleC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8UmVzdW1lUG9pbnQ+PiByZXN1bWVfcG9pbnRzXzsKKworICAgIHVpbnQ2NF90IG5leHRfZGF0YV9wb3NfID0gMDsKKworICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgd2UgYXJlIHVzaW5nIG9uZSB0aHJlYWQgZm9yIGNvbXByZXNzaW9uLCB3ZSBjYW4gc3RvcmUgYW5kIHJlLXVzZSB0aGUgc2FtZQorICAgIC8vIGNvbXByZXNzb3IKKyAgICBpbnQgbnVtX2NvbXByZXNzX3RocmVhZHNfID0gMTsKKyAgICBzaXplX3QgYmF0Y2hfc2l6ZV8gPSAxOworICAgIHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvblYzPiBjYWNoZWRfb3BzXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4gY2FjaGVkX2RhdGFfOworICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCBpb3ZlYz4gZGF0YV92ZWNfOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0aHJlYWQ+IHRocmVhZHNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3BhcnRpdGlvbl9jb3dfY3JlYXRvci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvcGFydGl0aW9uX2Nvd19jcmVhdG9yLmNwcAppbmRleCA1YmM3ZTY1Li5jMGQyMDczIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvcGFydGl0aW9uX2Nvd19jcmVhdG9yLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvcGFydGl0aW9uX2Nvd19jcmVhdG9yLmNwcApAQCAtMjE3LDYgKzIxNyw3IEBACiAKICAgICBpZiAodXBkYXRlICYmIHVwZGF0ZS0+aGFzX2VzdGltYXRlX2Nvd19zaXplKCkpIHsKICAgICAgICAgcmV0LnNuYXBzaG90X3N0YXR1cy5zZXRfZXN0aW1hdGVkX2Nvd19zaXplKHVwZGF0ZS0+ZXN0aW1hdGVfY293X3NpemUoKSk7CisgICAgICAgIHJldC5zbmFwc2hvdF9zdGF0dXMuc2V0X2VzdGltYXRlZF9vcHNfYnVmZmVyX3NpemUodXBkYXRlLT5lc3RpbWF0ZV9vcF9jb3VudF9tYXgoKSk7CiAgICAgfQogCiAgICAgaWYgKHJldC5zbmFwc2hvdF9zdGF0dXMuc25hcHNob3Rfc2l6ZSgpID09IDApIHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3QuY3BwCmluZGV4IDY0NjM3YzIuLjllYjQxYjIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdC5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90LmNwcApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KQEAgLTQ1LDkgKzQ2LDkgQEAKICNpbmNsdWRlIDxhbmRyb2lkL3NuYXBzaG90L3NuYXBzaG90LnBiLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3Rfc3RhdHMuaD4KICNpbmNsdWRlICJkZXZpY2VfaW5mby5oIgorI2luY2x1ZGUgImxpYnNuYXBzaG90X2Nvdy9wYXJzZXJfdjIuaCIKICNpbmNsdWRlICJwYXJ0aXRpb25fY293X2NyZWF0b3IuaCIKICNpbmNsdWRlICJzbmFwc2hvdF9tZXRhZGF0YV91cGRhdGVyLmgiCi0jaW5jbHVkZSAic25hcHNob3RfcmVhZGVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC04MiwxMiArODMsMjggQEAKIHVzaW5nIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0OwogdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhbHBhdGg7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiAKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrQm9vdFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoW10gPQorICAgICAgICAiL21ldGFkYXRhL290YS9zbmFwc2hvdC1ib290LXdpdGhvdXQtc2xvdC1zd2l0Y2giOwogc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtCb290SW5kaWNhdG9yUGF0aFtdID0gIi9tZXRhZGF0YS9vdGEvc25hcHNob3QtYm9vdCI7CiBzdGF0aWMgY29uc3RleHByIGNoYXIga1JvbGxiYWNrSW5kaWNhdG9yUGF0aFtdID0gIi9tZXRhZGF0YS9vdGEvcm9sbGJhY2staW5kaWNhdG9yIjsKIHN0YXRpYyBjb25zdGV4cHIgYXV0byBrVXBkYXRlU3RhdGVDaGVja0ludGVydmFsID0gMnM7Ci0KLU1lcmdlRmFpbHVyZUNvZGUgQ2hlY2tNZXJnZUNvbnNpc3RlbmN5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzKTsKKy8qCisgKiBUaGUgcmVhZGFoZWFkIHNpemUgaXMgc2V0IHRvIDMya2Igc28gdGhhdAorICogdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgbWVtb3J5IHByZXNzdXJlICgvcHJvYy9wcmVzc3VyZS9tZW1vcnkpIGR1cmluZyBib290LgorICogQWZ0ZXIgT1RBLCBkdXJpbmcgYm9vdCwgcGFydGl0aW9ucyBhcmUgc2Nhbm5lZCBiZWZvcmUgbWFya2luZyBzbG90IGFzIHN1Y2Nlc3NmdWwuCisgKiBUaGlzIHNjYW4gd2lsbCB0cmlnZ2VyIHJlYWRhaGVhZCBib3RoIG9uIHNvdXJjZSBhbmQgQ09XIGJsb2NrIGRldmljZSB0aGVyZWJ5CisgKiBsZWFkaW5nIHRvIEluYWN0aXZlKGZpbGUpIHBhZ2VzIHRvIGJlIHZlcnkgaGlnaC4KKyAqCisgKiBBIGxvd2VyIHZhbHVlIG1heSBoZWxwIHJlZHVjZSBtZW1vcnkgcHJlc3N1cmUgZnVydGhlciwgaG93ZXZlciwgdGhhdCB3aWxsCisgKiBpbmNyZWFzZSB0aGUgYm9vdCB0aW1lLiBUaHVzLCBmb3IgZGV2aWNlIHdoaWNoIGRvbid0IGNhcmUgYWJvdXQgT1RBIGJvb3QKKyAqIHRpbWUsIHRoZXkgY291bGQgdXNlIE9fRElSRUNUIGZ1bmN0aW9uYWxpdHkgd2hlcmVpbiB0aGUgSS9PIHRvIHRoZSBzb3VyY2UKKyAqIGJsb2NrIGRldmljZSB3aWxsIGJlIE9fRElSRUNULgorICovCitzdGF0aWMgY29uc3RleHByIGF1dG8ga0Nvd1JlYWRBaGVhZFNpemVLYiA9IDMyOworc3RhdGljIGNvbnN0ZXhwciBhdXRvIGtTb3VyY2VSZWFkQWhlYWRTaXplS2IgPSAzMjsKIAogLy8gTm90ZTogSUltYWdlTWFuYWdlciBpcyBhbiBpbmNvbXBsZXRlIHR5cGUgaW4gdGhlIGhlYWRlciwgc28gdGhlIGRlZmF1bHQKIC8vIGRlc3RydWN0b3IgZG9lc24ndCB3b3JrLgpAQCAtMTE4LDkgKzEzNSw3IEBACiB9CiAKIFNuYXBzaG90TWFuYWdlcjo6U25hcHNob3RNYW5hZ2VyKElEZXZpY2VJbmZvKiBkZXZpY2UpCi0gICAgOiBkbV8oZGV2aWNlLT5HZXREZXZpY2VNYXBwZXIoKSksIGRldmljZV8oZGV2aWNlKSwgbWV0YWRhdGFfZGlyXyhkZXZpY2VfLT5HZXRNZXRhZGF0YURpcigpKSB7Ci0gICAgbWVyZ2VfY29uc2lzdGVuY3lfY2hlY2tlcl8gPSBhbmRyb2lkOjpzbmFwc2hvdDo6Q2hlY2tNZXJnZUNvbnNpc3RlbmN5OwotfQorICAgIDogZG1fKGRldmljZS0+R2V0RGV2aWNlTWFwcGVyKCkpLCBkZXZpY2VfKGRldmljZSksIG1ldGFkYXRhX2Rpcl8oZGV2aWNlXy0+R2V0TWV0YWRhdGFEaXIoKSkge30KIAogc3RhdGljIHN0ZDo6c3RyaW5nIEdldENvd05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHNuYXBzaG90X25hbWUpIHsKICAgICByZXR1cm4gc25hcHNob3RfbmFtZSArICItY293IjsKQEAgLTIxNyw2ICsyMzIsMTIgQEAKICAgICBhdXRvIGZpbGUgPSBMb2NrRXhjbHVzaXZlKCk7CiAgICAgaWYgKCFmaWxlKSByZXR1cm4gZmFsc2U7CiAKKyAgICBpZiAoSXNTbmFwc2hvdFdpdGhvdXRTbG90U3dpdGNoKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNhbmNlbCB0aGUgc25hcHNob3RzIGFzIHBhcnRpdGlvbnMgYXJlIG1vdW50ZWQgb2ZmIHRoZSBzbmFwc2hvdHMgb24gIgorICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50IHNsb3QuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIFVwZGF0ZVN0YXRlIHN0YXRlID0gUmVhZFVwZGF0ZVN0YXRlKGZpbGUuZ2V0KCkpOwogICAgIGlmIChzdGF0ZSA9PSBVcGRhdGVTdGF0ZTo6Tm9uZSkgewogICAgICAgICBSZW1vdmVJbnZhbGlkU25hcHNob3RzKGZpbGUuZ2V0KCkpOwpAQCAtMjk5LDEwICszMjAsOSBAQAogICAgIC8vIC0gRm9yIEZvcndhcmRNZXJnZSwgRmluaXNoZWRTbmFwc2hvdFdyaXRlcyBhc3NlcnRzIHRoYXQgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgaW5kaWNhdG9yCiAgICAgLy8gbWF0Y2hlcyB0aGUgaW5jb21pbmcgdXBkYXRlLgogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlcyA9IHsKLSAgICAgICAgICAgIEdldFNuYXBzaG90Qm9vdEluZGljYXRvclBhdGgoKSwKLSAgICAgICAgICAgIEdldFJvbGxiYWNrSW5kaWNhdG9yUGF0aCgpLAotICAgICAgICAgICAgR2V0Rm9yd2FyZE1lcmdlSW5kaWNhdG9yUGF0aCgpLAotICAgICAgICAgICAgR2V0T2xkUGFydGl0aW9uTWV0YWRhdGFQYXRoKCksCisgICAgICAgICAgICBHZXRTbmFwc2hvdEJvb3RJbmRpY2F0b3JQYXRoKCksICAgICAgICAgIEdldFJvbGxiYWNrSW5kaWNhdG9yUGF0aCgpLAorICAgICAgICAgICAgR2V0Rm9yd2FyZE1lcmdlSW5kaWNhdG9yUGF0aCgpLCAgICAgICAgICBHZXRPbGRQYXJ0aXRpb25NZXRhZGF0YVBhdGgoKSwKKyAgICAgICAgICAgIEdldEJvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaFBhdGgoKSwKICAgICB9OwogICAgIGZvciAoY29uc3QgYXV0byYgZmlsZSA6IGZpbGVzKSB7CiAgICAgICAgIFJlbW92ZUZpbGVJZkV4aXN0cyhmaWxlKTsKQEAgLTQ4Myw2ICs1MDMsMzIgQEAKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZXRyaWV2ZSBiYXNlX3NlY3RvcnMgZnJvbSBTbmFwdXNlcmQiOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChJc1NuYXBzaG90V2l0aG91dFNsb3RTd2l0Y2goKSkgeworICAgICAgICAvLyBXaGVuIHNuYXBzaG90cyBhcmUgb24gY3VycmVudCBzbG90LCB3ZSBkZXRlcm1pbmUgdGhlIHNpemUKKyAgICAgICAgLy8gb2YgYmxvY2sgZGV2aWNlIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgQ09XIG9wZXJhdGlvbnMuIFdlIGNhbm5vdAorICAgICAgICAvLyB1c2UgYmFzZSBkZXZpY2UgYXMgaXQgd2lsbCBiZSBmcm9tIG9sZGVyIGltYWdlLgorICAgICAgICBzaXplX3QgbnVtX29wcyA9IDA7CisgICAgICAgIHVpbnQ2NF90IGRldl9zeiA9IDA7CisgICAgICAgIHVuaXF1ZV9mZCBmZChvcGVuKGNvd19maWxlLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IGNvd19maWxlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICAgICAgaWYgKCFyZWFkZXIuUGFyc2Uoc3RkOjptb3ZlKGZkKSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBwYXJzZSBjb3cgIiA8PCBjb3dfZmlsZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5HZXRIZWFkZXIoKTsKKyAgICAgICAgaWYgKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiA+IDIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNPVyBmb3JtYXQgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbnVtX29wcyA9IHJlYWRlci5nZXRfbnVtX3RvdGFsX2RhdGFfb3BzKCk7CisgICAgICAgIGRldl9zeiA9IChudW1fb3BzICogaGVhZGVyLmJsb2NrX3NpemUpOworICAgICAgICBiYXNlX3NlY3RvcnMgPSBkZXZfc3ogPj4gOTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGb3IgdXNlcnNwYWNlIHNuYXBzaG90cywgdGhlIHNpemUgb2YgdGhlIGJhc2UgZGV2aWNlIGlzIHRha2VuIGFzIHRoZQogICAgICAgICAvLyBzaXplIG9mIHRoZSBkbS11c2VyIGJsb2NrIGRldmljZS4gU2luY2UgdGhlcmUgaXMgbm8gcHNldWRvIG1hcHBpbmcKQEAgLTcyOSw2ICs3NzUsMTQgQEAKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbW92ZSBzdGF0dXMgZmlsZSAiIDw8IGZpbGVfcGF0aCA8PCAiOiAiIDw8IGVycm9yOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorCisgICAgLy8gVGhpcyBwYXRoIG1heSBuZXZlciBleGlzdC4gSWYgaXQgaXMgcHJlc2VudCwgdGhlbiBpdCdzIGEgc3RhbGUKKyAgICAvLyBzbmFwc2hvdCBzdGF0dXMgZmlsZS4gSnVzdCByZW1vdmUgdGhlIGZpbGUgYW5kIGxvZyB0aGUgbWVzc2FnZS4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyB0bXBfcGF0aCA9IGZpbGVfcGF0aCArICIudG1wIjsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlbW92ZUZpbGVJZkV4aXN0cyh0bXBfcGF0aCwgJmVycm9yKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVtb3ZlIHN0YWxlIHNuYXBzaG90IGZpbGUgIiA8PCB0bXBfcGF0aDsKKyAgICB9CisKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNzU0LDEwICs4MDgsMTAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGF1dG8gb3RoZXJfc3VmZml4ID0gZGV2aWNlXy0+R2V0T3RoZXJTbG90U3VmZml4KCk7CisgICAgYXV0byBjdXJyZW50X3Nsb3Rfc3VmZml4ID0gZGV2aWNlXy0+R2V0U2xvdFN1ZmZpeCgpOwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBzbmFwc2hvdCA6IHNuYXBzaG90cykgewotICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoc25hcHNob3QsIG90aGVyX3N1ZmZpeCkpIHsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChzbmFwc2hvdCwgY3VycmVudF9zbG90X3N1ZmZpeCkpIHsKICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBtZXJnZSB0byBjb250aW51ZSwgYnV0IGxvZyB0aGlzIHVuZXhwZWN0ZWQgY2FzZS4KICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuZXhwZWN0ZWQgc25hcHNob3QgZm91bmQgZHVyaW5nIG1lcmdlOiAiIDw8IHNuYXBzaG90OwogICAgICAgICAgICAgY29udGludWU7CkBAIC0xMTIzLDcgKzExNzcsNyBAQAogICAgICAgICByZXR1cm4gTWVyZ2VSZXN1bHQoVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkLCBNZXJnZUZhaWx1cmVDb2RlOjpMaXN0U25hcHNob3RzKTsKICAgICB9CiAKLSAgICBhdXRvIG90aGVyX3N1ZmZpeCA9IGRldmljZV8tPkdldE90aGVyU2xvdFN1ZmZpeCgpOworICAgIGF1dG8gY3VycmVudF9zbG90X3N1ZmZpeCA9IGRldmljZV8tPkdldFNsb3RTdWZmaXgoKTsKIAogICAgIGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7CiAgICAgYm9vbCBtZXJnaW5nID0gZmFsc2U7CkBAIC0xMTMxLDkgKzExODUsOSBAQAogICAgIGJvb2wgd3JvbmdfcGhhc2UgPSBmYWxzZTsKICAgICBNZXJnZUZhaWx1cmVDb2RlIGZhaWx1cmVfY29kZSA9IE1lcmdlRmFpbHVyZUNvZGU6Ok9rOwogICAgIGZvciAoY29uc3QgYXV0byYgc25hcHNob3QgOiBzbmFwc2hvdHMpIHsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkVuZHNXaXRoKHNuYXBzaG90LCBvdGhlcl9zdWZmaXgpKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoc25hcHNob3QsIGN1cnJlbnRfc2xvdF9zdWZmaXgpKSB7CiAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGF2ZSB0cmlnZ2VyZWQgYW4gZXJyb3IgbWVzc2FnZSBpbiBJbml0aWF0ZU1lcmdlIGFscmVhZHkuCi0gICAgICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIG1lcmdlIHZhbGlkYXRpb24gb2YgdW5leHBlY3RlZCBzbmFwc2hvdDogIiA8PCBzbmFwc2hvdDsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNraXBwaW5nIG1lcmdlIHZhbGlkYXRpb24gb2YgdW5leHBlY3RlZCBzbmFwc2hvdDogIiA8PCBzbmFwc2hvdDsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTEyNDgsMTQgKzEzMDIsMTIgQEAKICAgICAgICAgICAgR2V0TWV0YWRhdGFQYXJ0aXRpb25TdGF0ZSgqY3VycmVudF9tZXRhZGF0YSwgbmFtZSkgPT0gTWV0YWRhdGFQYXJ0aXRpb25TdGF0ZTo6VXBkYXRlZCk7CiAKICAgICBpZiAoVXBkYXRlVXNlc1VzZXJTbmFwc2hvdHMobG9jaykpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgbWVyZ2Vfc3RhdHVzOwotICAgICAgICBpZiAoRW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIC8vIFF1ZXJ5IHRoZSBzbmFwc2hvdCBzdGF0dXMgZnJvbSB0aGUgZGFlbW9uCi0gICAgICAgICAgICBtZXJnZV9zdGF0dXMgPSBzbmFwdXNlcmRfY2xpZW50Xy0+UXVlcnlTbmFwc2hvdFN0YXR1cyhuYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1lcmdlUmVzdWx0KFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZCwgTWVyZ2VGYWlsdXJlQ29kZTo6UXVlcnlTbmFwc2hvdFN0YXR1cyk7CisgICAgICAgIGlmICghRW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXJnZVJlc3VsdChVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQsIE1lcmdlRmFpbHVyZUNvZGU6OlF1ZXJ5U25hcHNob3RTdGF0dXMpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gUXVlcnkgdGhlIHNuYXBzaG90IHN0YXR1cyBmcm9tIHRoZSBkYWVtb24KKyAgICAgICAgY29uc3QgYXV0byBtZXJnZV9zdGF0dXMgPSBzbmFwdXNlcmRfY2xpZW50Xy0+UXVlcnlTbmFwc2hvdFN0YXR1cyhuYW1lKTsKICAgICAgICAgaWYgKG1lcmdlX3N0YXR1cyA9PSAic25hcHNob3QtbWVyZ2UtZmFpbGVkIikgewogICAgICAgICAgICAgcmV0dXJuIE1lcmdlUmVzdWx0KFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZCwgTWVyZ2VGYWlsdXJlQ29kZTo6VW5rbm93blRhcmdldFR5cGUpOwogICAgICAgICB9CkBAIC0xMzI2LDEzICsxMzc4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIE1lcmdlIGlzIGNvbXBsZXRlIGF0IHRoaXMgcG9pbnQKLQotICAgIGF1dG8gY29kZSA9IENoZWNrTWVyZ2VDb25zaXN0ZW5jeShsb2NrLCBuYW1lLCBzbmFwc2hvdF9zdGF0dXMpOwotICAgIGlmIChjb2RlICE9IE1lcmdlRmFpbHVyZUNvZGU6Ok9rKSB7Ci0gICAgICAgIHJldHVybiBNZXJnZVJlc3VsdChVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQsIGNvZGUpOwotICAgIH0KLQogICAgIC8vIE1lcmdpbmcgaXMgZG9uZS4gRmlyc3QsIHVwZGF0ZSB0aGUgc3RhdHVzIGZpbGUgdG8gaW5kaWNhdGUgdGhlIG1lcmdlCiAgICAgLy8gaXMgY29tcGxldGUuIFdlIGRvIHRoaXMgYmVmb3JlIGNhbGxpbmcgT25TbmFwc2hvdE1lcmdlQ29tcGxldGUsIGV2ZW4KICAgICAvLyB0aG91Z2ggdGhpcyBtZWFucyB0aGUgd3JpdGUgaXMgcG90ZW50aWFsbHkgd2FzdGVkIHdvcmsgKHNpbmNlIGluIHRoZQpAQCAtMTM2Miw4MCArMTQwNyw2IEBACiAgICAgcmV0dXJuIEdldENvd05hbWUoc25hcHNob3QpOwogfQogCi1NZXJnZUZhaWx1cmVDb2RlIFNuYXBzaG90TWFuYWdlcjo6Q2hlY2tNZXJnZUNvbnNpc3RlbmN5KExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzKSB7Ci0gICAgQ0hFQ0sobG9jayk7Ci0KLSAgICByZXR1cm4gbWVyZ2VfY29uc2lzdGVuY3lfY2hlY2tlcl8obmFtZSwgc3RhdHVzKTsKLX0KLQotTWVyZ2VGYWlsdXJlQ29kZSBDaGVja01lcmdlQ29uc2lzdGVuY3koY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMpIHsKLSAgICBpZiAoIXN0YXR1cy51c2luZ19zbmFwdXNlcmQoKSkgewotICAgICAgICAvLyBEbyBub3QgdHJ5IHRvIHZlcmlmeSBvbGQtc3R5bGUgQ09XcyB5ZXQuCi0gICAgICAgIHJldHVybiBNZXJnZUZhaWx1cmVDb2RlOjpPazsKLSAgICB9Ci0KLSAgICBhdXRvJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNvd19pbWFnZV9uYW1lID0gR2V0TWFwcGVkQ293RGV2aWNlTmFtZShuYW1lLCBzdGF0dXMpOwotICAgIHN0ZDo6c3RyaW5nIGNvd19pbWFnZV9wYXRoOwotICAgIGlmICghZG0uR2V0RG1EZXZpY2VQYXRoQnlOYW1lKGNvd19pbWFnZV9uYW1lLCAmY293X2ltYWdlX3BhdGgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgcGF0aCBmb3IgY293IGRldmljZTogIiA8PCBjb3dfaW1hZ2VfbmFtZTsKLSAgICAgICAgcmV0dXJuIE1lcmdlRmFpbHVyZUNvZGU6OkdldENvd1BhdGhDb25zaXN0ZW5jeUNoZWNrOwotICAgIH0KLQotICAgIC8vIEZpcnN0IHBhc3MsIGNvdW50ICMgb2Ygb3BzLgotICAgIHNpemVfdCBudW1fb3BzID0gMDsKLSAgICB7Ci0gICAgICAgIHVuaXF1ZV9mZCBmZChvcGVuKGNvd19pbWFnZV9wYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7Ci0gICAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IGNvd19pbWFnZV9uYW1lOwotICAgICAgICAgICAgcmV0dXJuIE1lcmdlRmFpbHVyZUNvZGU6Ok9wZW5Db3dDb25zaXN0ZW5jeUNoZWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICAgICAgaWYgKCFyZWFkZXIuUGFyc2Uoc3RkOjptb3ZlKGZkKSkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBwYXJzZSBjb3cgIiA8PCBjb3dfaW1hZ2VfcGF0aDsKLSAgICAgICAgICAgIHJldHVybiBNZXJnZUZhaWx1cmVDb2RlOjpQYXJzZUNvd0NvbnNpc3RlbmN5Q2hlY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBudW1fb3BzID0gcmVhZGVyLmdldF9udW1fdG90YWxfZGF0YV9vcHMoKTsKLSAgICB9Ci0KLSAgICAvLyBTZWNvbmQgcGFzcywgdHJ5IGFzIGhhcmQgYXMgd2UgY2FuIHRvIGdldCB0aGUgYWN0dWFsIG51bWJlciBvZiBibG9ja3MKLSAgICAvLyB0aGUgc3lzdGVtIHRoaW5rcyBpcyBtZXJnZWQuCi0gICAgdW5pcXVlX2ZkIGZkKG9wZW4oY293X2ltYWdlX3BhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0RJUkVDVCB8IE9fU1lOQyB8IE9fQ0xPRVhFQykpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGRpcmVjdCAiIDw8IGNvd19pbWFnZV9uYW1lOwotICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6T3BlbkNvd0RpcmVjdENvbnNpc3RlbmN5Q2hlY2s7Ci0gICAgfQotCi0gICAgdm9pZCogYWRkcjsKLSAgICBzaXplX3QgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKLSAgICBpZiAocG9zaXhfbWVtYWxpZ24oJmFkZHIsIHBhZ2Vfc2l6ZSwgcGFnZV9zaXplKSA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgInBvc2l4X21lbWFsaWduIHdpdGggcGFnZSBzaXplICIgPDwgcGFnZV9zaXplOwotICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6TWVtQWxpZ25Db25zaXN0ZW5jeUNoZWNrOwotICAgIH0KLQotICAgIC8vIENPV3MgYXJlIGFsd2F5cyBhdCBsZWFzdCAyTUIsIHRoaXMgaXMgZ3VhcmFudGVlZCBpbiBzbmFwc2hvdCBjcmVhdGlvbi4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoJjo6ZnJlZSk+IGJ1ZmZlcihhZGRyLCA6OmZyZWUpOwotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGZkLCBidWZmZXIuZ2V0KCksIHBhZ2Vfc2l6ZSkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkRpcmVjdCByZWFkIGZhaWxlZCAiIDw8IGNvd19pbWFnZV9uYW1lOwotICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6RGlyZWN0UmVhZENvbnNpc3RlbmN5Q2hlY2s7Ci0gICAgfQotCi0gICAgYXV0byBoZWFkZXIgPSByZWludGVycHJldF9jYXN0PENvd0hlYWRlcio+KGJ1ZmZlci5nZXQoKSk7Ci0gICAgaWYgKGhlYWRlci0+bnVtX21lcmdlX29wcyAhPSBudW1fb3BzKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNPVyBjb25zaXN0ZW5jeSBjaGVjayBmYWlsZWQsIGV4cGVjdGVkICIgPDwgbnVtX29wcyA8PCAiIHRvIGJlIG1lcmdlZCwgIgotICAgICAgICAgICAgICAgICAgIDw8ICJidXQgIiA8PCBoZWFkZXItPm51bV9tZXJnZV9vcHMgPDwgIiB3ZXJlIGFjdHVhbGx5IHJlY29yZGVkLiI7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkFib3J0aW5nIG1lcmdlIHByb2dyZXNzIGZvciBzbmFwc2hvdCAiIDw8IG5hbWUKLSAgICAgICAgICAgICAgICAgICA8PCAiLCB3aWxsIHRyeSBhZ2FpbiBuZXh0IGJvb3QiOwotICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6V3JvbmdNZXJnZUNvdW50Q29uc2lzdGVuY3lDaGVjazsKLSAgICB9Ci0KLSAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6T2s7Ci19Ci0KIE1lcmdlRmFpbHVyZUNvZGUgU25hcHNob3RNYW5hZ2VyOjpNZXJnZVNlY29uZFBoYXNlU25hcHNob3RzKExvY2tlZEZpbGUqIGxvY2spIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc25hcHNob3RzOwogICAgIGlmICghTGlzdFNuYXBzaG90cyhsb2NrLCAmc25hcHNob3RzKSkgewpAQCAtMTQ3Myw2ICsxNDQ0LDEwIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RkOjpzdHJpbmcgU25hcHNob3RNYW5hZ2VyOjpHZXRCb290U25hcHNob3RzV2l0aG91dFNsb3RTd2l0Y2hQYXRoKCkgeworICAgIHJldHVybiBtZXRhZGF0YV9kaXJfICsgIi8iICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa0Jvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCk7Cit9CisKIHN0ZDo6c3RyaW5nIFNuYXBzaG90TWFuYWdlcjo6R2V0U25hcHNob3RCb290SW5kaWNhdG9yUGF0aCgpIHsKICAgICByZXR1cm4gbWV0YWRhdGFfZGlyXyArICIvIiArIGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtCb290SW5kaWNhdG9yUGF0aCk7CiB9CkBAIC0xNzkwLDYgKzE3NjUsOSBAQAogICAgICAgICAgICAgICAgIHNuYXB1c2VyZF9hcmd2LT5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG1lc3NhZ2UpKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgU2V0UmVhZEFoZWFkU2l6ZShjb3dfaW1hZ2VfZGV2aWNlLCBrQ293UmVhZEFoZWFkU2l6ZUtiKTsKKyAgICAgICAgICAgIFNldFJlYWRBaGVhZFNpemUoc291cmNlX2RldmljZSwga1NvdXJjZVJlYWRBaGVhZFNpemVLYik7CisKICAgICAgICAgICAgIC8vIERvIG5vdCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhlIG5ldyBzbmFwdXNlcmQgeWV0LCBpdCBoYXNuJ3QKICAgICAgICAgICAgIC8vIGJlZW4gc3RhcnRlZC4gV2UgZG8gaG93ZXZlciB3YW50IHRvIHdhaXQgZm9yIHRoZSBtaXNjIGRldmljZQogICAgICAgICAgICAgLy8gdG8gaGF2ZSBiZWVuIGNyZWF0ZWQuCkBAIC0yMTE0LDYgKzIwOTIsMTAgQEAKICAgICByZXR1cm4gc3RhdGU7CiB9CiAKK2Jvb2wgU25hcHNob3RNYW5hZ2VyOjpJc1NuYXBzaG90V2l0aG91dFNsb3RTd2l0Y2goKSB7CisgICAgcmV0dXJuIChhY2Nlc3MoR2V0Qm9vdFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoUGF0aCgpLmNfc3RyKCksIEZfT0spID09IDApOworfQorCiBib29sIFNuYXBzaG90TWFuYWdlcjo6VXBkYXRlVXNlc0NvbXByZXNzaW9uKCkgewogICAgIGF1dG8gbG9jayA9IExvY2tTaGFyZWQoKTsKICAgICBpZiAoIWxvY2spIHJldHVybiBmYWxzZTsKQEAgLTIyMDYsNiArMjE4OCwxMyBAQAogfQogCiBib29sIFNuYXBzaG90TWFuYWdlcjo6TmVlZFNuYXBzaG90c0luRmlyc3RTdGFnZU1vdW50KCkgeworICAgIGlmIChJc1NuYXBzaG90V2l0aG91dFNsb3RTd2l0Y2goKSkgeworICAgICAgICBpZiAoR2V0Q3VycmVudFNsb3QoKSAhPSBTbG90OjpTb3VyY2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNuYXBzaG90cyBtYXJrZWQgdG8gYm9vdCB3aXRob3V0IHNsb3Qgc3dpdGNoOyBidXQgc2xvdCBpcyB3cm9uZyI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogICAgIC8vIElmIHdlIGZhaWwgdG8gcmVhZCwgd2UnbGwgd2luZCB1cCB1c2luZyBDcmVhdGVMb2dpY2FsUGFydGl0aW9ucywgd2hpY2gKICAgICAvLyB3aWxsIGNyZWF0ZSBkZXZpY2VzIHRoYXQgbG9vayBsaWtlIHRoZSBvbGQgc2xvdCwgZXhjZXB0IHdpdGggZXh0cmEKICAgICAvLyBjb250ZW50IGF0IHRoZSBlbmQgb2YgZWFjaCBkZXZpY2UuIFRoaXMgd2lsbCBjb25mdXNlIGRtLXZlcml0eSwgYW5kCkBAIC0yMzQxLDcgKzIzMzAsOCBAQAogICAgIC8vIGNvbXBsZXRlZCwgbGl2ZV9zbmFwc2hvdF9zdGF0dXMgaXMgc2V0IHRvIG51bGxvcHQuCiAgICAgc3RkOjpvcHRpb25hbDxTbmFwc2hvdFN0YXR1cz4gbGl2ZV9zbmFwc2hvdF9zdGF0dXM7CiAgICAgZG8gewotICAgICAgICBpZiAoIShwYXJhbXMucGFydGl0aW9uLT5hdHRyaWJ1dGVzICYgTFBfUEFSVElUSU9OX0FUVFJfVVBEQVRFRCkpIHsKKyAgICAgICAgaWYgKCFJc1NuYXBzaG90V2l0aG91dFNsb3RTd2l0Y2goKSAmJgorICAgICAgICAgICAgIShwYXJhbXMucGFydGl0aW9uLT5hdHRyaWJ1dGVzICYgTFBfUEFSVElUSU9OX0FUVFJfVVBEQVRFRCkpIHsKICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRGV0ZWN0ZWQgcmUtZmxhc2hpbmcgb2YgcGFydGl0aW9uLCB3aWxsIHNraXAgc25hcHNob3Q6ICIKICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbXMuR2V0UGFydGl0aW9uTmFtZSgpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNDkwLDkgKzI0ODAsNiBAQAogICAgICAgICB9CiAgICAgICAgIGNyZWF0ZWRfZGV2aWNlcy5FbXBsYWNlQmFjazxBdXRvVW5tYXBEZXZpY2U+KCZkbV8sIG5hbWUpOwogCi0gICAgICAgIHJlbWFpbmluZ190aW1lID0gR2V0UmVtYWluaW5nVGltZShwYXJhbXMudGltZW91dF9tcywgYmVnaW4pOwotICAgICAgICBpZiAocmVtYWluaW5nX3RpbWUuY291bnQoKSA8IDApIHJldHVybiBmYWxzZTsKLQogICAgICAgICBjb3dfZGV2aWNlID0gbmV3X2Nvd19kZXZpY2U7CiAgICAgfQogCkBAIC0yNTA3LDYgKzI0OTQsOSBAQAogICAgIC8vIHRoZSB1c2VyLXNwYWNlIHdpbGwgbm90IHN0YXJ0IHRoZSBtZXJnZS4gV2UgaGF2ZSB0byBleHBsaWNpdGx5IGluZm9ybSB0aGUKICAgICAvLyBkYWVtb24gdG8gcmVzdW1lIHRoZSBtZXJnZS4gQ2hlY2sgUHJvY2Vzc1VwZGF0ZVN0YXRlKCkgY2FsbCBzdGFjay4KICAgICBpZiAoIVVwZGF0ZVVzZXNVc2VyU25hcHNob3RzKGxvY2spKSB7CisgICAgICAgIHJlbWFpbmluZ190aW1lID0gR2V0UmVtYWluaW5nVGltZShwYXJhbXMudGltZW91dF9tcywgYmVnaW4pOworICAgICAgICBpZiAocmVtYWluaW5nX3RpbWUuY291bnQoKSA8IDApIHJldHVybiBmYWxzZTsKKwogICAgICAgICBzdGQ6OnN0cmluZyBwYXRoOwogICAgICAgICBpZiAoIU1hcFNuYXBzaG90KGxvY2ssIHBhcmFtcy5HZXRQYXJ0aXRpb25OYW1lKCksIGJhc2VfZGV2aWNlLCBjb3dfZGV2aWNlLCByZW1haW5pbmdfdGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCkpIHsKQEAgLTI2OTcsNyArMjY4Nyw3IEBACiAgICAgLy8gdG8gdW5tYXA7IGhlbmNlLCB3ZSBjYW4ndCBiZSBkZWxldGluZyB0aGUgZGV2aWNlCiAgICAgLy8gYXMgdGhlIHRhYmxlIHdvdWxkIGJlIG1vdW50ZWQgb2ZmIHBhcnRpdGlvbnMgYW5kIHdpbGwgZmFpbC4KICAgICBpZiAoc25hcHNob3Rfc3RhdHVzLnN0YXRlKCkgIT0gU25hcHNob3RTdGF0ZTo6TUVSR0VfQ09NUExFVEVEKSB7Ci0gICAgICAgIGlmICghRGVsZXRlRGV2aWNlSWZFeGlzdHMoZG1fdXNlcl9uYW1lKSkgeworICAgICAgICBpZiAoIURlbGV0ZURldmljZUlmRXhpc3RzKGRtX3VzZXJfbmFtZSwgNDAwMG1zKSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHVubWFwICIgPDwgZG1fdXNlcl9uYW1lOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0zMDkyLDcgKzMwODIsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFNuYXBzaG90TWFuYWdlcjo6RW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCkgeworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OkVuc3VyZVNuYXB1c2VyZENvbm5lY3RlZChzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXRfbXMpIHsKICAgICBpZiAoc25hcHVzZXJkX2NsaWVudF8pIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMzEwMSw3ICszMDkxLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHNuYXB1c2VyZF9jbGllbnRfID0gU25hcHVzZXJkQ2xpZW50OjpDb25uZWN0KGtTbmFwdXNlcmRTb2NrZXQsIDEwcyk7CisgICAgc25hcHVzZXJkX2NsaWVudF8gPSBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3Qoa1NuYXB1c2VyZFNvY2tldCwgdGltZW91dF9tcyk7CiAgICAgaWYgKCFzbmFwdXNlcmRfY2xpZW50XykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY29ubmVjdCB0byBzbmFwdXNlcmQiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zMTMzLDYgKzMxMjMsNyBAQAogICAgIGZvciAoYXV0byYmIFtuYW1lLCBzdGF0dXNdIDogYWxsX3NuYXBzaG90X3N0YXR1cykgewogICAgICAgICBzdW0gKz0gc3RhdHVzLmNvd19maWxlX3NpemUoKTsKICAgICB9CisgICAgTE9HKElORk8pIDw8ICJDYWxjdWxhdGVkIG5lZWRlZCBDT1cgc3BhY2U6ICIgPDwgc3VtIDw8ICIgYnl0ZXMiOwogICAgIHJldHVybiBSZXR1cm46Ok5vU3BhY2Uoc3VtKTsKIH0KIApAQCAtMzIwMSwzOSArMzE5MiwyMCBAQAogICAgIENIRUNLKGN1cnJlbnRfbWV0YWRhdGEtPkdldEJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZSgwKSA9PSBMUF9NRVRBREFUQV9ERUZBVUxUX1BBUlRJVElPTl9OQU1FICYmCiAgICAgICAgICAgdGFyZ2V0X21ldGFkYXRhLT5HZXRCbG9ja0RldmljZVBhcnRpdGlvbk5hbWUoMCkgPT0gTFBfTUVUQURBVEFfREVGQVVMVF9QQVJUSVRJT05fTkFNRSk7CiAKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgU25hcHNob3RTdGF0dXM+IGFsbF9zbmFwc2hvdF9zdGF0dXM7Ci0KLSAgICAvLyBJbiBjYXNlIG9mIGVycm9yLCBhdXRvbWF0aWNhbGx5IGRlbGV0ZSBkZXZpY2VzIHRoYXQgYXJlIGNyZWF0ZWQgYWxvbmcgdGhlIHdheS4KLSAgICAvLyBOb3RlIHRoYXQgImxvY2siIGlzIGRlc3Ryb3llZCBhZnRlciAiY3JlYXRlZF9kZXZpY2VzIiwgc28gaXQgaXMgc2FmZSB0byB1c2UgfGxvY2t8IGZvcgotICAgIC8vIHRoZXNlIGRldmljZXMuCi0gICAgQXV0b0RldmljZUxpc3QgY3JlYXRlZF9kZXZpY2VzOwotCiAgICAgY29uc3QgYXV0byYgZGFwX21ldGFkYXRhID0gbWFuaWZlc3QuZHluYW1pY19wYXJ0aXRpb25fbWV0YWRhdGEoKTsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICBib29sIGNvd19mb3JtYXRfc3VwcG9ydCA9IHRydWU7Ci0gICAgaWYgKGRhcF9tZXRhZGF0YS5jb3dfdmVyc2lvbigpIDwgd3JpdGVyLkdldENvd1ZlcnNpb24oKSkgewotICAgICAgICBjb3dfZm9ybWF0X3N1cHBvcnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgIiBkYXBfbWV0YWRhdGEuY293X3ZlcnNpb24oKTogIiA8PCBkYXBfbWV0YWRhdGEuY293X3ZlcnNpb24oKQotICAgICAgICAgICAgICA8PCAiIHdyaXRlci5HZXRDb3dWZXJzaW9uKCk6ICIgPDwgd3JpdGVyLkdldENvd1ZlcnNpb24oKTsKLQotICAgIC8vIERlZHVjZSBzdXBwb3J0ZWQgZmVhdHVyZXMuCi0gICAgYm9vbCB1c2Vyc3BhY2Vfc25hcHNob3RzID0gQ2FuVXNlVXNlcnNwYWNlU25hcHNob3RzKCk7Ci0gICAgYm9vbCBsZWdhY3lfY29tcHJlc3Npb24gPSBHZXRMZWdhY3lDb21wcmVzc2lvbkVuYWJsZWRQcm9wZXJ0eSgpOwogCiAgICAgc3RkOjpzdHJpbmcgdmFiY19kaXNhYmxlX3JlYXNvbjsKICAgICBpZiAoIWRhcF9tZXRhZGF0YS52YWJjX2VuYWJsZWQoKSkgewogICAgICAgICB2YWJjX2Rpc2FibGVfcmVhc29uID0gIm5vdCBlbmFibGVkIG1ldGFkYXRhIjsKICAgICB9IGVsc2UgaWYgKGRldmljZV8tPklzUmVjb3ZlcnkoKSkgewogICAgICAgICB2YWJjX2Rpc2FibGVfcmVhc29uID0gInJlY292ZXJ5IjsKLSAgICB9IGVsc2UgaWYgKCFjb3dfZm9ybWF0X3N1cHBvcnQpIHsKLSAgICAgICAgdmFiY19kaXNhYmxlX3JlYXNvbiA9ICJjb3cgZm9ybWF0IG5vdCBzdXBwb3J0ZWQiOwogICAgIH0gZWxzZSBpZiAoIUtlcm5lbFN1cHBvcnRzQ29tcHJlc3NlZFNuYXBzaG90cygpKSB7CiAgICAgICAgIHZhYmNfZGlzYWJsZV9yZWFzb24gPSAia2VybmVsIG1pc3NpbmcgdXNlcnNwYWNlIGJsb2NrIGRldmljZSBzdXBwb3J0IjsKICAgICB9CiAKKyAgICAvLyBEZWR1Y2Ugc3VwcG9ydGVkIGZlYXR1cmVzLgorICAgIGJvb2wgdXNlcnNwYWNlX3NuYXBzaG90cyA9IENhblVzZVVzZXJzcGFjZVNuYXBzaG90cygpOworICAgIGJvb2wgbGVnYWN5X2NvbXByZXNzaW9uID0gR2V0TGVnYWN5Q29tcHJlc3Npb25FbmFibGVkUHJvcGVydHkoKTsKICAgICBpZiAoIXZhYmNfZGlzYWJsZV9yZWFzb24uZW1wdHkoKSkgewogICAgICAgICBpZiAodXNlcnNwYWNlX3NuYXBzaG90cykgewogICAgICAgICAgICAgTE9HKElORk8pIDw8ICJVc2Vyc3BhY2Ugc25hcHNob3RzIGRpc2FibGVkOiAiIDw8IHZhYmNfZGlzYWJsZV9yZWFzb247CkBAIC0zMjQ1LDYgKzMyMTcsMTYgQEAKICAgICAgICAgbGVnYWN5X2NvbXByZXNzaW9uID0gZmFsc2U7CiAgICAgfQogCisgICAgaWYgKGxlZ2FjeV9jb21wcmVzc2lvbiB8fCB1c2Vyc3BhY2Vfc25hcHNob3RzKSB7CisgICAgICAgIGlmIChkYXBfbWV0YWRhdGEuY293X3ZlcnNpb24oKSA8IGtNaW5Db3dWZXJzaW9uIHx8CisgICAgICAgICAgICBkYXBfbWV0YWRhdGEuY293X3ZlcnNpb24oKSA+IGtNYXhDb3dWZXJzaW9uKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYW5pZmVzdCBjb3cgdmVyc2lvbiBpcyBvdXQgb2YgYm91bmRzIChnb3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZGFwX21ldGFkYXRhLmNvd192ZXJzaW9uKCkgPDwgIiwgbWluOiAiIDw8IGtNaW5Db3dWZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIG1heDogIiA8PCBrTWF4Q293VmVyc2lvbiA8PCAiKSI7CisgICAgICAgICAgICByZXR1cm4gUmV0dXJuOjpFcnJvcigpOworICAgICAgICB9CisgICAgfQorCiAgICAgY29uc3QgYm9vbCB1c2luZ19zbmFwdXNlcmQgPSB1c2Vyc3BhY2Vfc25hcHNob3RzIHx8IGxlZ2FjeV9jb21wcmVzc2lvbjsKICAgICBpZiAoIXVzaW5nX3NuYXB1c2VyZCkgewogICAgICAgICBMT0coSU5GTykgPDwgIlVzaW5nIGxlZ2FjeSBWaXJ0dWFsIEEvQiAoZG0tc25hcHNob3QpIjsKQEAgLTMyNzcsOSArMzI1OSwxNyBAQAogICAgICAgICBjb3dfY3JlYXRvci5iYXRjaGVkX3dyaXRlcyA9IGRhcF9tZXRhZGF0YS52YWJjX2ZlYXR1cmVfc2V0KCkuYmF0Y2hfd3JpdGVzKCk7CiAgICAgfQogCisgICAgLy8gSW4gY2FzZSBvZiBlcnJvciwgYXV0b21hdGljYWxseSBkZWxldGUgZGV2aWNlcyB0aGF0IGFyZSBjcmVhdGVkIGFsb25nIHRoZSB3YXkuCisgICAgLy8gTm90ZSB0aGF0ICJsb2NrIiBpcyBkZXN0cm95ZWQgYWZ0ZXIgImNyZWF0ZWRfZGV2aWNlcyIsIHNvIGl0IGlzIHNhZmUgdG8gdXNlIHxsb2NrfCBmb3IKKyAgICAvLyB0aGVzZSBkZXZpY2VzLgorICAgIEF1dG9EZXZpY2VMaXN0IGNyZWF0ZWRfZGV2aWNlczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgU25hcHNob3RTdGF0dXM+IGFsbF9zbmFwc2hvdF9zdGF0dXM7CiAgICAgYXV0byByZXQgPSBDcmVhdGVVcGRhdGVTbmFwc2hvdHNJbnRlcm5hbChsb2NrLmdldCgpLCBtYW5pZmVzdCwgJmNvd19jcmVhdG9yLCAmY3JlYXRlZF9kZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsbF9zbmFwc2hvdF9zdGF0dXMpOwotICAgIGlmICghcmV0LmlzX29rKCkpIHJldHVybiByZXQ7CisgICAgaWYgKCFyZXQuaXNfb2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVVcGRhdGVTbmFwc2hvdHNJbnRlcm5hbCBmYWlsZWQ6ICIgPDwgcmV0LnN0cmluZygpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KIAogICAgIGF1dG8gZXhwb3J0ZWRfdGFyZ2V0X21ldGFkYXRhID0gdGFyZ2V0X21ldGFkYXRhLT5FeHBvcnQoKTsKICAgICBpZiAoZXhwb3J0ZWRfdGFyZ2V0X21ldGFkYXRhID09IG51bGxwdHIpIHsKQEAgLTMyODcsNyArMzI3Nyw3IEBACiAgICAgICAgIHJldHVybiBSZXR1cm46OkVycm9yKCk7CiAgICAgfQogCi0gICAgcmV0ID0gSW5pdGlhbGl6ZVVwZGF0ZVNuYXBzaG90cyhsb2NrLmdldCgpLCB0YXJnZXRfbWV0YWRhdGEuZ2V0KCksCisgICAgcmV0ID0gSW5pdGlhbGl6ZVVwZGF0ZVNuYXBzaG90cyhsb2NrLmdldCgpLCBkYXBfbWV0YWRhdGEuY293X3ZlcnNpb24oKSwgdGFyZ2V0X21ldGFkYXRhLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWRfdGFyZ2V0X21ldGFkYXRhLmdldCgpLCB0YXJnZXRfc3VmZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3NuYXBzaG90X3N0YXR1cyk7CiAgICAgaWYgKCFyZXQuaXNfb2soKSkgcmV0dXJuIHJldDsKQEAgLTMzNDAsNyArMzMzMCw3IEBACiAgICAgICAgIC8vIFRlcm1pbmF0ZSBzdGFsZSBkYWVtb24gaWYgYW55CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwdXNlcmRDbGllbnQ+IHNuYXB1c2VyZF9jbGllbnQgPSBzdGQ6Om1vdmUoc25hcHVzZXJkX2NsaWVudF8pOwogICAgICAgICBpZiAoIXNuYXB1c2VyZF9jbGllbnQpIHsKLSAgICAgICAgICAgIHNuYXB1c2VyZF9jbGllbnQgPSBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3Qoa1NuYXB1c2VyZFNvY2tldCwgNXMpOworICAgICAgICAgICAgc25hcHVzZXJkX2NsaWVudCA9IFNuYXB1c2VyZENsaWVudDo6VHJ5Q29ubmVjdChrU25hcHVzZXJkU29ja2V0LCA1cyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNuYXB1c2VyZF9jbGllbnQpIHsKICAgICAgICAgICAgIHNuYXB1c2VyZF9jbGllbnQtPkRldGFjaFNuYXB1c2VyZCgpOwpAQCAtMzQ5Niw3ICszNDg2LDEwIEBACiAgICAgICAgIC8vIENyZWF0ZSB0aGUgYmFja2luZyBDT1cgaW1hZ2UgaWYgbmVjZXNzYXJ5LgogICAgICAgICBpZiAoc25hcHNob3Rfc3RhdHVzLmNvd19maWxlX3NpemUoKSA+IDApIHsKICAgICAgICAgICAgIGF1dG8gcmV0ID0gQ3JlYXRlQ293SW1hZ2UobG9jaywgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIXJldC5pc19vaygpKSByZXR1cm4gQWRkUmVxdWlyZWRTcGFjZShyZXQsICphbGxfc25hcHNob3Rfc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghcmV0LmlzX29rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVDb3dJbWFnZSBmYWlsZWQ6ICIgPDwgcmV0LnN0cmluZygpOworICAgICAgICAgICAgICAgIHJldHVybiBBZGRSZXF1aXJlZFNwYWNlKHJldCwgKmFsbF9zbmFwc2hvdF9zdGF0dXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgTE9HKElORk8pIDw8ICJTdWNjZXNzZnVsbHkgY3JlYXRlZCBzbmFwc2hvdCBmb3IgIiA8PCBuYW1lOwpAQCAtMzUwNiw3ICszNDk5LDcgQEAKIH0KIAogUmV0dXJuIFNuYXBzaG90TWFuYWdlcjo6SW5pdGlhbGl6ZVVwZGF0ZVNuYXBzaG90cygKLSAgICAgICAgTG9ja2VkRmlsZSogbG9jaywgTWV0YWRhdGFCdWlsZGVyKiB0YXJnZXRfbWV0YWRhdGEsCisgICAgICAgIExvY2tlZEZpbGUqIGxvY2ssIHVpbnQzMl90IGNvd192ZXJzaW9uLCBNZXRhZGF0YUJ1aWxkZXIqIHRhcmdldF9tZXRhZGF0YSwKICAgICAgICAgY29uc3QgTHBNZXRhZGF0YSogZXhwb3J0ZWRfdGFyZ2V0X21ldGFkYXRhLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X3N1ZmZpeCwKICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFNuYXBzaG90U3RhdHVzPiYgYWxsX3NuYXBzaG90X3N0YXR1cykgewogICAgIENIRUNLKGxvY2spOwpAQCAtMzU0MCw2ICszNTMzLDExIEBACiAgICAgICAgICAgICByZXR1cm4gUmV0dXJuOjpFcnJvcigpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpmc19tZ3I6OldhaXRGb3JGaWxlKGNvd19wYXRoLCA2cykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBkZXZpY2UgdG8gYXBwZWFyOiAiIDw8IGNvd19wYXRoOworICAgICAgICAgICAgcmV0dXJuIFJldHVybjo6RXJyb3IoKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChpdC0+c2Vjb25kLnVzaW5nX3NuYXB1c2VyZCgpKSB7CiAgICAgICAgICAgICB1bmlxdWVfZmQgZmQob3Blbihjb3dfcGF0aC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKICAgICAgICAgICAgIGlmIChmZCA8IDApIHsKQEAgLTM1NTMsOSArMzU1MSwxMiBAQAogICAgICAgICAgICAgICAgIG9wdGlvbnMuc2NyYXRjaF9zcGFjZSA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IGl0LT5zZWNvbmQuY29tcHJlc3Npb25fYWxnb3JpdGhtKCk7CisgICAgICAgICAgICBpZiAoY293X3ZlcnNpb24gPj0gMykgeworICAgICAgICAgICAgICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gaXQtPnNlY29uZC5lc3RpbWF0ZWRfb3BzX2J1ZmZlcl9zaXplKCk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoIXdyaXRlci5Jbml0aWFsaXplKGZkKSB8fCAhd3JpdGVyLkZpbmFsaXplKCkpIHsKKyAgICAgICAgICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKGNvd192ZXJzaW9uLCBvcHRpb25zLCBzdGQ6Om1vdmUoZmQpKTsKKyAgICAgICAgICAgIGlmICghd3JpdGVyLT5GaW5hbGl6ZSgpKSB7CiAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGluaXRpYWxpemUgQ09XIGRldmljZSBmb3IgIiA8PCB0YXJnZXRfcGFydGl0aW9uLT5uYW1lKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFJldHVybjo6RXJyb3IoKTsKICAgICAgICAgICAgIH0KQEAgLTM2MDUsMTIgKzM2MDYsMTIgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gU25hcHNob3RNYW5hZ2VyOjpPcGVuU25hcHNob3RXcml0ZXIoCitzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gU25hcHNob3RNYW5hZ2VyOjpPcGVuU25hcHNob3RXcml0ZXIoCiAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyYgcGFyYW1zLAotICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc291cmNlX2RldmljZSkgeworICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgewogI2lmIGRlZmluZWQoTElCU05BUFNIT1RfTk9fQ09XX1dSSVRFKQogICAgICh2b2lkKXBhcmFtczsKLSAgICAodm9pZClzb3VyY2VfZGV2aWNlOworICAgICh2b2lkKWxhYmVsOwogCiAgICAgTE9HKEVSUk9SKSA8PCAiU25hcHNob3RzIGNhbm5vdCBiZSB3cml0dGVuIGluIGZpcnN0LXN0YWdlIGluaXQgb3IgcmVjb3ZlcnkiOwogICAgIHJldHVybiBudWxscHRyOwpAQCAtMzY0NCwyNyArMzY0NSwyNyBAQAogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICBpZiAoc3RhdHVzLnVzaW5nX3NuYXB1c2VyZCgpKSB7Ci0gICAgICAgIHJldHVybiBPcGVuQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyKGxvY2suZ2V0KCksIHNvdXJjZV9kZXZpY2UsIHBhcmFtcy5HZXRQYXJ0aXRpb25OYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF0aHMpOworICAgIGlmICghc3RhdHVzLnVzaW5nX3NuYXB1c2VyZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbiBvbmx5IGNyZWF0ZSBzbmFwc2hvdCB3cml0ZXJzIHdpdGggdXNlcnNwYWNlIG9yIGNvbXByZXNzZWQgc25hcHNob3RzIjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIHJldHVybiBPcGVuS2VybmVsU25hcHNob3RXcml0ZXIobG9jay5nZXQoKSwgc291cmNlX2RldmljZSwgcGFyYW1zLkdldFBhcnRpdGlvbk5hbWUoKSwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMpOworCisgICAgcmV0dXJuIE9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXIobG9jay5nZXQoKSwgc3RhdHVzLCBwYXRocywgbGFiZWwpOwogI2VuZGlmCiB9CiAKICNpZiAhZGVmaW5lZChMSUJTTkFQU0hPVF9OT19DT1dfV1JJVEUpCi1zdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBTbmFwc2hvdE1hbmFnZXI6Ok9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXIoCi0gICAgICAgIExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzb3VyY2VfZGV2aWNlLAotICAgICAgICBbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cywKLSAgICAgICAgY29uc3QgU25hcHNob3RQYXRocyYgcGF0aHMpIHsKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBTbmFwc2hvdE1hbmFnZXI6Ok9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXIoCisgICAgICAgIExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMsIGNvbnN0IFNuYXBzaG90UGF0aHMmIHBhdGhzLAorICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgewogICAgIENIRUNLKGxvY2spOwogCiAgICAgQ293T3B0aW9ucyBjb3dfb3B0aW9uczsKICAgICBjb3dfb3B0aW9ucy5jb21wcmVzc2lvbiA9IHN0YXR1cy5jb21wcmVzc2lvbl9hbGdvcml0aG0oKTsKICAgICBjb3dfb3B0aW9ucy5tYXhfYmxvY2tzID0ge3N0YXR1cy5kZXZpY2Vfc2l6ZSgpIC8gY293X29wdGlvbnMuYmxvY2tfc2l6ZX07CiAgICAgY293X29wdGlvbnMuYmF0Y2hfd3JpdGUgPSBzdGF0dXMuYmF0Y2hlZF93cml0ZXMoKTsKLSAgICBjb3dfb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IHN0YXR1cy5lbmFibGVfdGhyZWFkaW5nKCkgPyAyIDogMDsKKyAgICBjb3dfb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IHN0YXR1cy5lbmFibGVfdGhyZWFkaW5nKCkgPyAyIDogMTsKKyAgICBjb3dfb3B0aW9ucy5vcF9jb3VudF9tYXggPSBzdGF0dXMuZXN0aW1hdGVkX29wc19idWZmZXJfc2l6ZSgpOwogICAgIC8vIERpc2FibGUgc2NyYXRjaCBzcGFjZSBmb3IgdnRzIHRlc3RzCiAgICAgaWYgKGRldmljZSgpLT5Jc1Rlc3REZXZpY2UoKSkgewogICAgICAgICBjb3dfb3B0aW9ucy5zY3JhdGNoX3NwYWNlID0gZmFsc2U7CkBAIC0zNjc0LDExICszNjc1LDYgQEAKICAgICAvLyBuZXZlciBjcmVhdGVzIHRoaXMgc2NlbmFyaW8uCiAgICAgQ0hFQ0soc3RhdHVzLnNuYXBzaG90X3NpemUoKSA9PSBzdGF0dXMuZGV2aWNlX3NpemUoKSk7CiAKLSAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q29tcHJlc3NlZFNuYXBzaG90V3JpdGVyPihjb3dfb3B0aW9ucyk7Ci0gICAgaWYgKHNvdXJjZV9kZXZpY2UpIHsKLSAgICAgICAgd3JpdGVyLT5TZXRTb3VyY2VEZXZpY2UoKnNvdXJjZV9kZXZpY2UpOwotICAgIH0KLQogICAgIHN0ZDo6c3RyaW5nIGNvd19wYXRoOwogICAgIGlmICghR2V0TWFwcGVkSW1hZ2VEZXZpY2VQYXRoKHBhdGhzLmNvd19kZXZpY2VfbmFtZSwgJmNvd19wYXRoKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZGV0ZXJtaW5lIHBhdGggZm9yICIgPDwgcGF0aHMuY293X2RldmljZV9uYW1lOwpAQCAtMzY5MCw0MCArMzY4NiwxNCBAQAogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiT3BlbkNvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjogb3BlbiAiIDw8IGNvd19wYXRoOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgaWYgKCF3cml0ZXItPlNldENvd0RldmljZShzdGQ6Om1vdmUoY293X2ZkKSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBDT1cgd3JpdGVyIGZyb20gIiA8PCBjb3dfcGF0aDsKKworICAgIENvd0hlYWRlclYzIGhlYWRlcjsKKyAgICBpZiAoIVJlYWRDb3dIZWFkZXIoY293X2ZkLCAmaGVhZGVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJPcGVuQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOiByZWFkIGhlYWRlciBmYWlsZWQiOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICByZXR1cm4gd3JpdGVyOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBTbmFwc2hvdE1hbmFnZXI6Ok9wZW5LZXJuZWxTbmFwc2hvdFdyaXRlcigKLSAgICAgICAgTG9ja2VkRmlsZSogbG9jaywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UsCi0gICAgICAgIFtbbWF5YmVfdW51c2VkXV0gY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzLAotICAgICAgICBjb25zdCBTbmFwc2hvdFBhdGhzJiBwYXRocykgewotICAgIENIRUNLKGxvY2spOwotCi0gICAgQ293T3B0aW9ucyBjb3dfb3B0aW9uczsKLSAgICBjb3dfb3B0aW9ucy5tYXhfYmxvY2tzID0ge3N0YXR1cy5kZXZpY2Vfc2l6ZSgpIC8gY293X29wdGlvbnMuYmxvY2tfc2l6ZX07Ci0KLSAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8T25saW5lS2VybmVsU25hcHNob3RXcml0ZXI+KGNvd19vcHRpb25zKTsKLQotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBwYXRocy5zbmFwc2hvdF9kZXZpY2UuZW1wdHkoKSA/IHBhdGhzLnRhcmdldF9kZXZpY2UgOiBwYXRocy5zbmFwc2hvdF9kZXZpY2U7Ci0gICAgdW5pcXVlX2ZkIGZkKG9wZW4ocGF0aC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuIGZhaWxlZDogIiA8PCBwYXRoOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBpZiAoc291cmNlX2RldmljZSkgewotICAgICAgICB3cml0ZXItPlNldFNvdXJjZURldmljZSgqc291cmNlX2RldmljZSk7Ci0gICAgfQotCi0gICAgdWludDY0X3QgY293X3NpemUgPSBzdGF0dXMuY293X3BhcnRpdGlvbl9zaXplKCkgKyBzdGF0dXMuY293X2ZpbGVfc2l6ZSgpOwotICAgIHdyaXRlci0+U2V0U25hcHNob3REZXZpY2Uoc3RkOjptb3ZlKGZkKSwgY293X3NpemUpOwotCi0gICAgcmV0dXJuIHdyaXRlcjsKKyAgICByZXR1cm4gQ3JlYXRlQ293V3JpdGVyKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiwgY293X29wdGlvbnMsIHN0ZDo6bW92ZShjb3dfZmQpLCBsYWJlbCk7CiB9CiAjZW5kaWYgIC8vICFkZWZpbmVkKExJQlNOQVBTSE9UX05PX0NPV19XUklURSkKIApAQCAtNDM5MywxNSArNDM2Myw5NiBAQAogfQogCiBib29sIFNuYXBzaG90TWFuYWdlcjo6SXNVc2Vyc3BhY2VTbmFwc2hvdFVwZGF0ZUluUHJvZ3Jlc3MoKSB7Ci0gICAgYXV0byBzbG90ID0gR2V0Q3VycmVudFNsb3QoKTsKLSAgICBpZiAoc2xvdCA9PSBTbG90OjpUYXJnZXQpIHsKLSAgICAgICAgaWYgKElzU25hcHVzZXJkUmVxdWlyZWQoKSkgeworICAgIC8vIFdlIGNhbm5vdCBncmFiIC9tZXRhZGF0YS9vdGEgbG9jayBoZXJlIGFzIHRoaXMKKyAgICAvLyBpcyBpbiByZWJvb3QgcGF0aC4gU2VlIGIvMzA4OTAwODUzCisgICAgLy8KKyAgICAvLyBDaGVjayBpZiBhbnkgb2YgdGhlIHBhcnRpdGlvbnMgYXJlIG1vdW50ZWQKKyAgICAvLyBvZmYgZG0tdXNlciBibG9jayBkZXZpY2UuIElmIHNvLCB0aGVuIHdlIGFyZSBjZXJ0YWluCisgICAgLy8gdGhhdCBPVEEgdXBkYXRlIGluIHByb2dyZXNzLgorICAgIGF1dG8gY3VycmVudF9zdWZmaXggPSBkZXZpY2VfLT5HZXRTbG90U3VmZml4KCk7CisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisgICAgYXV0byBkbV9ibG9ja19kZXZpY2VzID0gZG0uRmluZERtUGFydGl0aW9ucygpOworICAgIGlmIChkbV9ibG9ja19kZXZpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gZG0tZW5hYmxlZCBibG9jayBkZXZpY2UgaXMgZm91bmQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGF1dG8mIHBhcnRpdGlvbiA6IGRtX2Jsb2NrX2RldmljZXMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uX25hbWUgPSBwYXJ0aXRpb24uZmlyc3QgKyBjdXJyZW50X3N1ZmZpeDsKKyAgICAgICAgRGV2aWNlTWFwcGVyOjpUYXJnZXRJbmZvIHNuYXBfdGFyZ2V0OworICAgICAgICBpZiAoIUdldFNpbmdsZVRhcmdldChwYXJ0aXRpb25fbmFtZSwgVGFibGVRdWVyeTo6U3RhdHVzLCAmc25hcF90YXJnZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYXV0byB0eXBlID0gRGV2aWNlTWFwcGVyOjpHZXRUYXJnZXRUeXBlKHNuYXBfdGFyZ2V0LnNwZWMpOworICAgICAgICBpZiAodHlwZSA9PSAidXNlciIpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFNuYXBzaG90TWFuYWdlcjo6Qm9vdEZyb21TbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCgpIHsKKyAgICBhdXRvIGxvY2sgPSBMb2NrRXhjbHVzaXZlKCk7CisgICAgaWYgKCFsb2NrKSByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvIGNvbnRlbnRzID0gZGV2aWNlXy0+R2V0U2xvdFN1ZmZpeCgpOworICAgIC8vIFRoaXMgaXMgdGhlIGluZGljYXRvciB3aGljaCB0ZWxscyBmaXJzdC1zdGFnZSBpbml0CisgICAgLy8gdG8gYm9vdCBmcm9tIHNuYXBzaG90cyBldmVuIHRob3VnaCB0aGVyZSB3YXMgbm8gc2xvdC1zd2l0Y2gKKyAgICBhdXRvIGJvb3RfZmlsZSA9IEdldEJvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaFBhdGgoKTsKKyAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlQXRvbWljKGNvbnRlbnRzLCBib290X2ZpbGUpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBmYWlsZWQ6ICIgPDwgYm9vdF9maWxlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU25hcHNob3RVcGRhdGVTdGF0dXMgdXBkYXRlX3N0YXR1cyA9IFJlYWRTbmFwc2hvdFVwZGF0ZVN0YXR1cyhsb2NrLmdldCgpKTsKKyAgICB1cGRhdGVfc3RhdHVzLnNldF9zdGF0ZShVcGRhdGVTdGF0ZTo6SW5pdGlhdGVkKTsKKyAgICB1cGRhdGVfc3RhdHVzLnNldF91c2Vyc3BhY2Vfc25hcHNob3RzKHRydWUpOworICAgIHVwZGF0ZV9zdGF0dXMuc2V0X3VzaW5nX3NuYXB1c2VyZCh0cnVlKTsKKyAgICBpZiAoIVdyaXRlU25hcHNob3RVcGRhdGVTdGF0dXMobG9jay5nZXQoKSwgdXBkYXRlX3N0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OlByZXBhcmVEZXZpY2VUb0Jvb3RXaXRob3V0U25hcHNob3QoKSB7CisgICAgYXV0byBsb2NrID0gTG9ja0V4Y2x1c2l2ZSgpOworICAgIGlmICghbG9jaykgcmV0dXJuIGZhbHNlOworCisgICAgYW5kcm9pZDo6YmFzZTo6UmVtb3ZlRmlsZUlmRXhpc3RzKEdldFNuYXBzaG90Qm9vdEluZGljYXRvclBhdGgoKSk7CisgICAgYW5kcm9pZDo6YmFzZTo6UmVtb3ZlRmlsZUlmRXhpc3RzKEdldEJvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaFBhdGgoKSk7CisKKyAgICBTbmFwc2hvdFVwZGF0ZVN0YXR1cyB1cGRhdGVfc3RhdHVzID0gUmVhZFNuYXBzaG90VXBkYXRlU3RhdHVzKGxvY2suZ2V0KCkpOworICAgIHVwZGF0ZV9zdGF0dXMuc2V0X3N0YXRlKFVwZGF0ZVN0YXRlOjpDYW5jZWxsZWQpOworICAgIGlmICghV3JpdGVTbmFwc2hvdFVwZGF0ZVN0YXR1cyhsb2NrLmdldCgpLCB1cGRhdGVfc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNuYXBzaG90TWFuYWdlcjo6U2V0UmVhZEFoZWFkU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZW50cnlfYmxvY2tfZGV2aWNlLCBvZmY2NF90IHNpemVfa2IpIHsKKyAgICBzdGQ6OnN0cmluZyBibG9ja19kZXZpY2U7CisgICAgaWYgKCFSZWFscGF0aChlbnRyeV9ibG9ja19kZXZpY2UsICZibG9ja19kZXZpY2UpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhbHBhdGggIiA8PCBlbnRyeV9ibG9ja19kZXZpY2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6c3RyaW5nX3ZpZXcga0RldkJsb2NrUHJlZml4KCIvZGV2L2Jsb2NrLyIpOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChibG9ja19kZXZpY2UsIGtEZXZCbG9ja1ByZWZpeCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCBibG9ja19kZXZpY2UgPDwgIiBpcyBub3QgYSBibG9jayBkZXZpY2UiOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgYmxvY2tfbmFtZSA9IGJsb2NrX2RldmljZS5zdWJzdHIoa0RldkJsb2NrUHJlZml4Lmxlbmd0aCgpKTsKKyAgICBzdGQ6OnN0cmluZyBzeXNfcGFydGl0aW9uID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiL3N5cy9jbGFzcy9ibG9jay8lcy9wYXJ0aXRpb24iLCBibG9ja19uYW1lLmNfc3RyKCkpOworICAgIHN0cnVjdCBzdGF0IGluZm87CisgICAgaWYgKGxzdGF0KHN5c19wYXJ0aXRpb24uY19zdHIoKSwgJmluZm8pID09IDApIHsKKyAgICAgICAgYmxvY2tfbmFtZSArPSAiLy4uIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgc3lzX3JhID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIvc3lzL2NsYXNzL2Jsb2NrLyVzL3F1ZXVlL3JlYWRfYWhlYWRfa2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19uYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHNpemUgPSBzdGQ6OnRvX3N0cmluZyhzaXplX2tiKTsKKyAgICBhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZShzaXplLCBzeXNfcmEuY19zdHIoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3JlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDZjMmEuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3JlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgInNuYXBzaG90X3JlYWRlci5oIgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2Ugc25hcHNob3QgewotCi11c2luZyBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZDsKLQotLy8gTm90IHN1cHBvcnRlZC4KLWJvb2wgUmVhZE9ubHlGaWxlRGVzY3JpcHRvcjo6T3Blbihjb25zdCBjaGFyKiwgaW50LCBtb2RlX3QpIHsKLSAgICBlcnJubyA9IEVJTlZBTDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVhZE9ubHlGaWxlRGVzY3JpcHRvcjo6T3Blbihjb25zdCBjaGFyKiwgaW50KSB7Ci0gICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zc2l6ZV90IFJlYWRPbmx5RmlsZURlc2NyaXB0b3I6OldyaXRlKGNvbnN0IHZvaWQqLCBzaXplX3QpIHsKLSAgICBlcnJubyA9IEVJTlZBTDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVhZE9ubHlGaWxlRGVzY3JpcHRvcjo6QmxrSW9jdGwoaW50LCB1aW50NjRfdCwgdWludDY0X3QsIGludCopIHsKLSAgICBlcnJubyA9IEVJTlZBTDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVJlYWRGZEZpbGVEZXNjcmlwdG9yOjpSZWFkRmRGaWxlRGVzY3JpcHRvcihhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCkgOiBmZF8oc3RkOjptb3ZlKGZkKSkge30KLQotc3NpemVfdCBSZWFkRmRGaWxlRGVzY3JpcHRvcjo6UmVhZCh2b2lkKiBidWYsIHNpemVfdCBjb3VudCkgewotICAgIHJldHVybiByZWFkKGZkXy5nZXQoKSwgYnVmLCBjb3VudCk7Ci19Ci0KLW9mZjY0X3QgUmVhZEZkRmlsZURlc2NyaXB0b3I6OlNlZWsob2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKLSAgICByZXR1cm4gbHNlZWsoZmRfLmdldCgpLCBvZmZzZXQsIHdoZW5jZSk7Ci19Ci0KLXVpbnQ2NF90IFJlYWRGZEZpbGVEZXNjcmlwdG9yOjpCbG9ja0RldlNpemUoKSB7Ci0gICAgcmV0dXJuIGdldF9ibG9ja19kZXZpY2Vfc2l6ZShmZF8uZ2V0KCkpOwotfQotCi1ib29sIFJlYWRGZEZpbGVEZXNjcmlwdG9yOjpDbG9zZSgpIHsKLSAgICBmZF8gPSB7fTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSZWFkRmRGaWxlRGVzY3JpcHRvcjo6SXNTZXR0aW5nRXJybm8oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUmVhZEZkRmlsZURlc2NyaXB0b3I6OklzT3BlbigpIHsKLSAgICByZXR1cm4gZmRfID49IDA7Ci19Ci0KLWJvb2wgUmVhZEZkRmlsZURlc2NyaXB0b3I6OkZsdXNoKCkgewotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6U2V0Q293KHN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+JiYgY293KSB7Ci0gICAgY293XyA9IHN0ZDo6bW92ZShjb3cpOwotCi0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICBpZiAoIWNvd18tPkdldEhlYWRlcigmaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGJsb2NrX3NpemVfID0gaGVhZGVyLmJsb2NrX3NpemU7Ci0KLSAgICAvLyBQb3B1bGF0ZSB0aGUgb3BlcmF0aW9uIG1hcC4KLSAgICBvcF9pdGVyXyA9IGNvd18tPkdldE9wSXRlcigpOwotICAgIHdoaWxlICghb3BfaXRlcl8tPkRvbmUoKSkgewotICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIG9wID0gJm9wX2l0ZXJfLT5HZXQoKTsKLSAgICAgICAgaWYgKElzTWV0YWRhdGFPcCgqb3ApKSB7Ci0gICAgICAgICAgICBvcF9pdGVyXy0+TmV4dCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPj0gb3BzXy5zaXplKCkpIHsKLSAgICAgICAgICAgIG9wc18ucmVzaXplKG9wLT5uZXdfYmxvY2sgKyAxLCBudWxscHRyKTsKLSAgICAgICAgfQotICAgICAgICBvcHNfW29wLT5uZXdfYmxvY2tdID0gb3A7Ci0gICAgICAgIG9wX2l0ZXJfLT5OZXh0KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpTZXRTb3VyY2VEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9kZXZpY2UpIHsKLSAgICBzb3VyY2VfZGV2aWNlXyA9IHtzb3VyY2VfZGV2aWNlfTsKLX0KLQotdm9pZCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OlNldEJsb2NrRGV2aWNlU2l6ZSh1aW50NjRfdCBibG9ja19kZXZpY2Vfc2l6ZSkgewotICAgIGJsb2NrX2RldmljZV9zaXplXyA9IGJsb2NrX2RldmljZV9zaXplOwotfQotCi1ib3Jyb3dlZF9mZCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OkdldFNvdXJjZUZkKCkgewotICAgIGlmIChzb3VyY2VfZmRfIDwgMCkgewotICAgICAgICBpZiAoIXNvdXJjZV9kZXZpY2VfKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wcmVzc2VkU25hcHNob3RSZWFkZXIgbmVlZHMgc291cmNlIGRldmljZSwgYnV0IG5vbmUgd2FzIHNldCI7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgICAgIHJldHVybiB7LTF9OwotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZV9mZF8ucmVzZXQob3Blbihzb3VyY2VfZGV2aWNlXy0+Y19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKLSAgICAgICAgaWYgKHNvdXJjZV9mZF8gPCAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbiAiIDw8ICpzb3VyY2VfZGV2aWNlXzsKLSAgICAgICAgICAgIHJldHVybiB7LTF9OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzb3VyY2VfZmRfOwotfQotCi1jbGFzcyBNZW1vcnlCeXRlU2luayA6IHB1YmxpYyBJQnl0ZVNpbmsgewotICBwdWJsaWM6Ci0gICAgTWVtb3J5Qnl0ZVNpbmsodm9pZCogYnVmLCBzaXplX3QgY291bnQpIHsKLSAgICAgICAgYnVmXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1Zik7Ci0gICAgICAgIHBvc18gPSBidWZfOwotICAgICAgICBlbmRfID0gYnVmXyArIGNvdW50OwotICAgIH0KLQotICAgIHZvaWQqIEdldEJ1ZmZlcihzaXplX3QgcmVxdWVzdGVkLCBzaXplX3QqIGFjdHVhbCkgb3ZlcnJpZGUgewotICAgICAgICAqYWN0dWFsID0gc3RkOjptaW4ocmVtYWluaW5nKCksIHJlcXVlc3RlZCk7Ci0gICAgICAgIGlmICghKmFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90KiBzdGFydCA9IHBvc187Ci0gICAgICAgIHBvc18gKz0gKmFjdHVhbDsKLSAgICAgICAgcmV0dXJuIHN0YXJ0OwotICAgIH0KLQotICAgIGJvb2wgUmV0dXJuRGF0YSh2b2lkKiwgc2l6ZV90KSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICB1aW50OF90KiBidWYoKSBjb25zdCB7IHJldHVybiBidWZfOyB9Ci0gICAgdWludDhfdCogcG9zKCkgY29uc3QgeyByZXR1cm4gcG9zXzsgfQotICAgIHNpemVfdCByZW1haW5pbmcoKSBjb25zdCB7IHJldHVybiBlbmRfIC0gcG9zXzsgfQotCi0gIHByaXZhdGU6Ci0gICAgdWludDhfdCogYnVmXzsKLSAgICB1aW50OF90KiBwb3NfOwotICAgIHVpbnQ4X3QqIGVuZF87Ci19OwotCi1zc2l6ZV90IENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6UmVhZCh2b2lkKiBidWYsIHNpemVfdCBjb3VudCkgewotICAgIC8vIEZpbmQgdGhlIHN0YXJ0IGFuZCBlbmQgY2h1bmtzLCBpbmNsdXNpdmUuCi0gICAgdWludDY0X3Qgc3RhcnRfY2h1bmsgPSBvZmZzZXRfIC8gYmxvY2tfc2l6ZV87Ci0gICAgdWludDY0X3QgZW5kX2NodW5rID0gKG9mZnNldF8gKyBjb3VudCAtIDEpIC8gYmxvY2tfc2l6ZV87Ci0KLSAgICAvLyBDaG9wIG9mZiB0aGUgZmlyc3QgTiBieXRlcyBpZiB0aGUgcG9zaXRpb24gaXMgbm90IGJsb2NrLWFsaWduZWQuCi0gICAgc2l6ZV90IHN0YXJ0X29mZnNldCA9IG9mZnNldF8gJSBibG9ja19zaXplXzsKLQotICAgIE1lbW9yeUJ5dGVTaW5rIHNpbmsoYnVmLCBjb3VudCk7Ci0KLSAgICBzaXplX3QgaW5pdGlhbF9ieXRlcyA9IHN0ZDo6bWluKGJsb2NrX3NpemVfIC0gc3RhcnRfb2Zmc2V0LCBzaW5rLnJlbWFpbmluZygpKTsKLSAgICBzc2l6ZV90IHJ2ID0gUmVhZEJsb2NrKHN0YXJ0X2NodW5rLCAmc2luaywgc3RhcnRfb2Zmc2V0LCBpbml0aWFsX2J5dGVzKTsKLSAgICBpZiAocnYgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgb2Zmc2V0XyArPSBydjsKLQotICAgIGZvciAodWludDY0X3QgY2h1bmsgPSBzdGFydF9jaHVuayArIDE7IGNodW5rIDwgZW5kX2NodW5rOyBjaHVuaysrKSB7Ci0gICAgICAgIHNzaXplX3QgcnYgPSBSZWFkQmxvY2soY2h1bmssICZzaW5rLCAwKTsKLSAgICAgICAgaWYgKHJ2IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldF8gKz0gcnY7Ci0gICAgfQotCi0gICAgaWYgKHNpbmsucmVtYWluaW5nKCkpIHsKLSAgICAgICAgc3NpemVfdCBydiA9IFJlYWRCbG9jayhlbmRfY2h1bmssICZzaW5rLCAwLCB7c2luay5yZW1haW5pbmcoKX0pOwotICAgICAgICBpZiAocnYgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0XyArPSBydjsKLSAgICB9Ci0KLSAgICBlcnJubyA9IDA7Ci0KLSAgICBEQ0hFQ0soc2luay5wb3MoKSAtIHNpbmsuYnVmKCkgPT0gY291bnQpOwotICAgIHJldHVybiBjb3VudDsKLX0KLQotLy8gRGlzY2FyZCB0aGUgZmlyc3QgTiBieXRlcyBvZiBhIHNpbmsgcmVxdWVzdCwgb3IgYW55IGV4Y2VzcyBieXRlcy4KLWNsYXNzIFBhcnRpYWxTaW5rIDogcHVibGljIE1lbW9yeUJ5dGVTaW5rIHsKLSAgcHVibGljOgotICAgIFBhcnRpYWxTaW5rKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIHNpemVfdCBpZ25vcmVfc3RhcnQpCi0gICAgICAgIDogTWVtb3J5Qnl0ZVNpbmsoYnVmZmVyLCBzaXplKSwgaWdub3JlX3N0YXJ0XyhpZ25vcmVfc3RhcnQpIHt9Ci0KLSAgICB2b2lkKiBHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpIG92ZXJyaWRlIHsKLSAgICAgICAgLy8gVGhyb3cgYXdheSB0aGUgZmlyc3QgTiBieXRlcyBpZiBuZWVkZWQuCi0gICAgICAgIGlmIChpZ25vcmVfc3RhcnRfKSB7Ci0gICAgICAgICAgICAqYWN0dWFsID0gc3RkOjptaW4oe3JlcXVlc3RlZCwgaWdub3JlX3N0YXJ0Xywgc2l6ZW9mKGRpc2NhcmRfKX0pOwotICAgICAgICAgICAgaWdub3JlX3N0YXJ0XyAtPSAqYWN0dWFsOwotICAgICAgICAgICAgcmV0dXJuIGRpc2NhcmRfOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRocm93IGF3YXkgYW55IGV4Y2VzcyBieXRlcyBpZiBuZWVkZWQuCi0gICAgICAgIGlmIChyZW1haW5pbmcoKSA9PSAwKSB7Ci0gICAgICAgICAgICAqYWN0dWFsID0gc3RkOjptaW4ocmVxdWVzdGVkLCBzaXplb2YoZGlzY2FyZF8pKTsKLSAgICAgICAgICAgIHJldHVybiBkaXNjYXJkXzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVtb3J5Qnl0ZVNpbms6OkdldEJ1ZmZlcihyZXF1ZXN0ZWQsIGFjdHVhbCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc2l6ZV90IGlnbm9yZV9zdGFydF87Ci0gICAgY2hhciBkaXNjYXJkX1tCTE9DS19TWl07Ci19OwotCi1zc2l6ZV90IENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6UmVhZEJsb2NrKHVpbnQ2NF90IGNodW5rLCBJQnl0ZVNpbmsqIHNpbmssIHNpemVfdCBzdGFydF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+JiBtYXhfYnl0ZXMpIHsKLSAgICBzaXplX3QgYnl0ZXNfdG9fcmVhZCA9IGJsb2NrX3NpemVfOwotICAgIGlmIChtYXhfYnl0ZXMpIHsKLSAgICAgICAgYnl0ZXNfdG9fcmVhZCA9ICptYXhfYnl0ZXM7Ci0gICAgfQotCi0gICAgLy8gVGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgY2h1bms7IHdlIHNob3VsZCBiZSByZWFkaW5nIG5vIG1vcmUgdGhhbgotICAgIC8vIG9uZSBjaHVuay4KLSAgICBDSEVDSyhzdGFydF9vZmZzZXQgKyBieXRlc190b19yZWFkIDw9IGJsb2NrX3NpemVfKTsKLQotICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSBudWxscHRyOwotICAgIGlmIChjaHVuayA8IG9wc18uc2l6ZSgpKSB7Ci0gICAgICAgIG9wID0gb3BzX1tjaHVua107Ci0gICAgfQotCi0gICAgc2l6ZV90IGFjdHVhbDsKLSAgICB2b2lkKiBidWZmZXIgPSBzaW5rLT5HZXRCdWZmZXIoYnl0ZXNfdG9fcmVhZCwgJmFjdHVhbCk7Ci0gICAgaWYgKCFidWZmZXIgfHwgYWN0dWFsIDwgYnl0ZXNfdG9fcmVhZCkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gdW5sZXNzIHdlIGNhbGN1bGF0ZWQgdGhlIHJlYWQgc2l6ZSB3cm9uZwotICAgICAgICAvLyBzb21ld2hlcmUuIE1lbW9yeUJ5dGVTaW5rIGFsd2F5cyBmdWxmaWxscyB0aGUgZW50aXJlIHJlcXVlc3RlZAotICAgICAgICAvLyByZWdpb24gdW5sZXNzIHRoZXJlJ3Mgbm90IGVub3VnaCBidWZmZXIgcmVtYWluaW5nLgotICAgICAgICBMT0coRVJST1IpIDw8ICJBc2tlZCBmb3IgYnVmZmVyIG9mIHNpemUgIiA8PCBieXRlc190b19yZWFkIDw8ICIsIGdvdCAiIDw8IGFjdHVhbDsKLSAgICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoIW9wIHx8IG9wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKLSAgICAgICAgYm9ycm93ZWRfZmQgZmQgPSBHZXRTb3VyY2VGZCgpOwotICAgICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgICAgICAvLyBHZXRTb3VyY2VGZCBzZXRzIGVycm5vLgotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wKSB7Ci0gICAgICAgICAgICBjaHVuayA9IG9wLT5zb3VyY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmY2NF90IG9mZnNldCA9IChjaHVuayAqIGJsb2NrX3NpemVfKSArIHN0YXJ0X29mZnNldDsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChmZCwgYnVmZmVyLCBieXRlc190b19yZWFkLCBvZmZzZXQpKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVhZCAiIDw8ICpzb3VyY2VfZGV2aWNlXzsKLSAgICAgICAgICAgIC8vIFJlYWRGdWxseUF0T2Zmc2V0IHNldHMgZXJybm8uCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG9wLT50eXBlID09IGtDb3daZXJvT3ApIHsKLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgYnl0ZXNfdG9fcmVhZCk7Ci0gICAgfSBlbHNlIGlmIChvcC0+dHlwZSA9PSBrQ293UmVwbGFjZU9wKSB7Ci0gICAgICAgIFBhcnRpYWxTaW5rIHBhcnRpYWxfc2luayhidWZmZXIsIGJ5dGVzX3RvX3JlYWQsIHN0YXJ0X29mZnNldCk7Ci0gICAgICAgIGlmICghY293Xy0+UmVhZERhdGEoKm9wLCAmcGFydGlhbF9zaW5rKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIGZhaWxlZCB0byByZWFkIHJlcGxhY2Ugb3AiOwotICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG9wLT50eXBlID09IGtDb3dYb3JPcCkgewotICAgICAgICBib3Jyb3dlZF9mZCBmZCA9IEdldFNvdXJjZUZkKCk7Ci0gICAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgICAgIC8vIEdldFNvdXJjZUZkIHNldHMgZXJybm8uCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmY2NF90IG9mZnNldCA9IG9wLT5zb3VyY2UgKyBzdGFydF9vZmZzZXQ7Ci0gICAgICAgIGNoYXIgZGF0YVtCTE9DS19TWl07Ci0gICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoZmQsICZkYXRhLCBieXRlc190b19yZWFkLCBvZmZzZXQpKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVhZCAiIDw8ICpzb3VyY2VfZGV2aWNlXzsKLSAgICAgICAgICAgIC8vIFJlYWRGdWxseUF0T2Zmc2V0IHNldHMgZXJybm8uCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgUGFydGlhbFNpbmsgcGFydGlhbF9zaW5rKGJ1ZmZlciwgYnl0ZXNfdG9fcmVhZCwgc3RhcnRfb2Zmc2V0KTsKLSAgICAgICAgaWYgKCFjb3dfLT5SZWFkRGF0YSgqb3AsICZwYXJ0aWFsX3NpbmspKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wcmVzc2VkU25hcHNob3RSZWFkZXIgZmFpbGVkIHRvIHJlYWQgeG9yIG9wIjsKLSAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnl0ZXNfdG9fcmVhZDsgaSsrKSB7Ci0gICAgICAgICAgICAoKGNoYXIqKWJ1ZmZlcilbaV0gXj0gZGF0YVtpXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXByZXNzZWRTbmFwc2hvdFJlYWRlciB1bmtub3duIG9wIHR5cGU6ICIgPDwgdWludDMyX3Qob3AtPnR5cGUpOwotICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vIE1lbW9yeUJ5dGVTaW5rIGRvZXNuJ3QgZG8gYW55dGhpbmcgaW4gUmV0dXJuQnVmZmVyLCBzbyBkb24ndCBib3RoZXIgY2FsbGluZyBpdC4KLSAgICByZXR1cm4gYnl0ZXNfdG9fcmVhZDsKLX0KLQotb2ZmNjRfdCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OlNlZWsob2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKLSAgICBzd2l0Y2ggKHdoZW5jZSkgewotICAgICAgICBjYXNlIFNFRUtfU0VUOgotICAgICAgICAgICAgb2Zmc2V0XyA9IG9mZnNldDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFRUtfRU5EOgotICAgICAgICAgICAgb2Zmc2V0XyA9IHN0YXRpY19jYXN0PG9mZjY0X3Q+KGJsb2NrX2RldmljZV9zaXplXykgKyBvZmZzZXQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTRUVLX0NVUjoKLSAgICAgICAgICAgIG9mZnNldF8gKz0gb2Zmc2V0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbnJlY29nbml6ZWQgc2VlayB3aGVuY2U6ICIgPDwgd2hlbmNlOwotICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBvZmZzZXRfOwotfQotCi11aW50NjRfdCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OkJsb2NrRGV2U2l6ZSgpIHsKLSAgICByZXR1cm4gYmxvY2tfZGV2aWNlX3NpemVfOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6Q2xvc2UoKSB7Ci0gICAgY293XyA9IG51bGxwdHI7Ci0gICAgc291cmNlX2ZkXyA9IHt9OwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6SXNTZXR0aW5nRXJybm8oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpJc09wZW4oKSB7Ci0gICAgcmV0dXJuIGNvd18gIT0gbnVsbHB0cjsKLX0KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OkZsdXNoKCkgewotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3Rfc3R1Yi5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3Rfc3R1Yi5jcHAKaW5kZXggODRlMjIyNi4uOTM1NDEwMiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3N0dWIuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9zdHViLmNwcApAQCAtMTU0LDggKzE1NCw4IEBACiAgICAgcmV0dXJuICZzbmFwc2hvdF9tZXJnZV9zdGF0czsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gU25hcHNob3RNYW5hZ2VyU3R1Yjo6T3BlblNuYXBzaG90V3JpdGVyKAotICAgICAgICBjb25zdCBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zJiwgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mKSB7CitzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gU25hcHNob3RNYW5hZ2VyU3R1Yjo6T3BlblNuYXBzaG90V3JpdGVyKAorICAgICAgICBjb25zdCBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zJiwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4pIHsKICAgICBMT0coRVJST1IpIDw8IF9fRlVOQ1RJT05fXyA8PCAiIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuIjsKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF90ZXN0LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF90ZXN0LmNwcAppbmRleCBjZTc1YTU0Li5lNTM4ZDUwIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3RfdGVzdC5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3Rlc3QuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxjaHJvbm8+CkBAIC0xOTYsNiArMTk3LDE3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIGJvb2wgU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSB7CisgICAgICAgIGlmICghR2V0TGVnYWN5Q29tcHJlc3Npb25FbmFibGVkUHJvcGVydHkoKSB8fCAhc25hcHVzZXJkX3JlcXVpcmVkXykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBhcGlfbGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8uYm9hcmQuYXBpX2xldmVsIiwgLTEpOworICAgICAgICBpZiAoYXBpX2xldmVsID09IC0xKSB7CisgICAgICAgICAgICBhcGlfbGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWwiLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFwaV9sZXZlbCAhPSBfX0FORFJPSURfQVBJX1NfXzsKKyAgICB9CisKICAgICB2b2lkIEluaXRpYWxpemVTdGF0ZSgpIHsKICAgICAgICAgQVNTRVJUX1RSVUUoc20tPkVuc3VyZUltYWdlTWFuYWdlcigpKTsKICAgICAgICAgaW1hZ2VfbWFuYWdlcl8gPSBzbS0+aW1hZ2VfbWFuYWdlcigpOwpAQCAtMzMzLDcgKzM0NSw3IEBACiAgICAgfQogCiAgICAgQXNzZXJ0aW9uUmVzdWx0IE1hcFVwZGF0ZVNuYXBzaG90KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiogd3JpdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiogd3JpdGVyKSB7CiAgICAgICAgIFRlc3RQYXJ0aXRpb25PcGVuZXIgb3BlbmVyKGZha2Vfc3VwZXIpOwogICAgICAgICBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zIHBhcmFtc3sKICAgICAgICAgICAgICAgICAuYmxvY2tfZGV2aWNlID0gZmFrZV9zdXBlciwKQEAgLTM0MywxNCArMzU1LDEwIEBACiAgICAgICAgICAgICAgICAgLnBhcnRpdGlvbl9vcGVuZXIgPSAmb3BlbmVyLAogICAgICAgICB9OwogCi0gICAgICAgIGF1dG8gb2xkX3BhcnRpdGlvbiA9ICIvZGV2L2Jsb2NrL21hcHBlci8iICsgR2V0T3RoZXJQYXJ0aXRpb25OYW1lKG5hbWUpOwotICAgICAgICBhdXRvIHJlc3VsdCA9IHNtLT5PcGVuU25hcHNob3RXcml0ZXIocGFyYW1zLCB7b2xkX3BhcnRpdGlvbn0pOworICAgICAgICBhdXRvIHJlc3VsdCA9IHNtLT5PcGVuU25hcHNob3RXcml0ZXIocGFyYW1zLCB7fSk7CiAgICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJDYW5ub3Qgb3BlbiBzbmFwc2hvdCBmb3Igd3JpdGluZzogIiA8PCBuYW1lOwogICAgICAgICB9Ci0gICAgICAgIGlmICghcmVzdWx0LT5Jbml0aWFsaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkNhbm5vdCBpbml0aWFsaXplIHNuYXBzaG90IGZvciB3cml0aW5nOiAiIDw8IG5hbWU7Ci0gICAgICAgIH0KIAogICAgICAgICBpZiAod3JpdGVyKSB7CiAgICAgICAgICAgICAqd3JpdGVyID0gc3RkOjptb3ZlKHJlc3VsdCk7CkBAIC00MjgsNyArNDM2LDcgQEAKIAogICAgIC8vIFByZXBhcmUgQS9CIHNsb3QgZm9yIGEgcGFydGl0aW9uIG5hbWVkICJ0ZXN0X3BhcnRpdGlvbiIuCiAgICAgQXNzZXJ0aW9uUmVzdWx0IFByZXBhcmVPbmVTbmFwc2hvdCh1aW50NjRfdCBkZXZpY2Vfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+KiB3cml0ZXIgPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4qIHdyaXRlciA9IG51bGxwdHIpIHsKICAgICAgICAgbG9ja18gPSBudWxscHRyOwogCiAgICAgICAgIERlbHRhQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0OwpAQCAtNjMxLDIxICs2MzksMzggQEAKIFRFU1RfRihTbmFwc2hvdFRlc3QsIE1lcmdlKSB7CiAgICAgQVNTRVJUX1RSVUUoQWNxdWlyZUxvY2soKSk7CiAKLSAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga0RldmljZVNpemUgPSAxMDI0ICogMTAyNDsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+IHdyaXRlcjsKLSAgICBBU1NFUlRfVFJVRShQcmVwYXJlT25lU25hcHNob3Qoa0RldmljZVNpemUsICZ3cml0ZXIpKTsKLQotICAgIGJvb2wgdXNlcnNwYWNlX3NuYXBzaG90cyA9IHNtLT5VcGRhdGVVc2VzVXNlclNuYXBzaG90cyhsb2NrXy5nZXQoKSk7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBsb2NrLgotICAgIGxvY2tfID0gbnVsbHB0cjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtEZXZpY2VTaXplID0gMTAyNCAqIDEwMjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrQmxvY2tTaXplID0gNDA5NjsKIAogICAgIHN0ZDo6c3RyaW5nIHRlc3Rfc3RyaW5nID0gIlRoaXMgaXMgYSB0ZXN0IHN0cmluZy4iOwotICAgIHRlc3Rfc3RyaW5nLnJlc2l6ZSh3cml0ZXItPm9wdGlvbnMoKS5ibG9ja19zaXplKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2NrcygwLCB0ZXN0X3N0cmluZy5kYXRhKCksIHRlc3Rfc3RyaW5nLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0gICAgd3JpdGVyID0gbnVsbHB0cjsKKyAgICB0ZXN0X3N0cmluZy5yZXNpemUoa0Jsb2NrU2l6ZSk7CisKKyAgICBib29sIHVzZXJzcGFjZV9zbmFwc2hvdHMgPSBmYWxzZTsKKyAgICBpZiAoc25hcHVzZXJkX3JlcXVpcmVkXykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyOworICAgICAgICBBU1NFUlRfVFJVRShQcmVwYXJlT25lU25hcHNob3Qoa0RldmljZVNpemUsICZ3cml0ZXIpKTsKKworICAgICAgICB1c2Vyc3BhY2Vfc25hcHNob3RzID0gc20tPlVwZGF0ZVVzZXNVc2VyU25hcHNob3RzKGxvY2tfLmdldCgpKTsKKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBsb2NrLgorICAgICAgICBsb2NrXyA9IG51bGxwdHI7CisKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoMCwgdGVzdF9zdHJpbmcuZGF0YSgpLCB0ZXN0X3N0cmluZy5zaXplKCkpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKyAgICAgICAgd3JpdGVyID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShQcmVwYXJlT25lU25hcHNob3Qoa0RldmljZVNpemUpKTsKKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBsb2NrLgorICAgICAgICBsb2NrXyA9IG51bGxwdHI7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aDsKKyAgICAgICAgQVNTRVJUX1RSVUUoZG1fLkdldERtRGV2aWNlUGF0aEJ5TmFtZSgidGVzdF9wYXJ0aXRpb25fYiIsICZwYXRoKSk7CisKKyAgICAgICAgdW5pcXVlX2ZkIGZkKG9wZW4ocGF0aC5jX3N0cigpLCBPX1dST05MWSkpOworICAgICAgICBBU1NFUlRfR0UoZmQsIDApOworICAgICAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGZkLCB0ZXN0X3N0cmluZy5kYXRhKCksIHRlc3Rfc3RyaW5nLnNpemUoKSkpOworICAgIH0KIAogICAgIC8vIERvbmUgdXBkYXRpbmcuCiAgICAgQVNTRVJUX1RSVUUoc20tPkZpbmlzaGVkU25hcHNob3RXcml0ZXMoZmFsc2UpKTsKQEAgLTY1NCw4ICs2NzksMjMgQEAKIAogICAgIHRlc3RfZGV2aWNlLT5zZXRfc2xvdF9zdWZmaXgoIl9iIik7CiAgICAgQVNTRVJUX1RSVUUoc20tPkNyZWF0ZUxvZ2ljYWxBbmRTbmFwc2hvdFBhcnRpdGlvbnMoInN1cGVyIiwgc25hcHNob3RfdGltZW91dF8pKTsKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShzbS0+SW5pdGlhdGVNZXJnZSgpKTsKIAorICAgIC8vIENyZWF0ZSBzdGFsZSBmaWxlcyBpbiBzbmFwc2hvdCBkaXJlY3RvcnkuIE1lcmdlIHNob3VsZCBza2lwIHRoZXNlIGZpbGVzCisgICAgLy8gYXMgdGhlIHN1ZmZpeCBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IHNsb3QuCisgICAgYXV0byB0bXBfcGF0aCA9IHRlc3RfZGV2aWNlLT5HZXRNZXRhZGF0YURpcigpICsgIi9zbmFwc2hvdHMvdGVzdF9wYXJ0aXRpb25fYi50bXAiOworICAgIGF1dG8gb3RoZXJfc2xvdCA9IHRlc3RfZGV2aWNlLT5HZXRNZXRhZGF0YURpcigpICsgIi9zbmFwc2hvdHMvdGVzdF9wYXJ0aXRpb25fYSI7CisKKyAgICB1bmlxdWVfZmQgZmQob3Blbih0bXBfcGF0aC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMgfCBPX0NSRUFULCAwNjQ0KSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKTsKKworICAgIGZkLnJlc2V0KG9wZW4ob3RoZXJfc2xvdC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMgfCBPX0NSRUFULCAwNjQ0KSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKTsKKwogICAgIC8vIFRoZSBkZXZpY2Ugc2hvdWxkIGhhdmUgYmVlbiBzd2l0Y2hlZCB0byBhIHNuYXBzaG90LW1lcmdlIHRhcmdldC4KICAgICBEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8gdGFyZ2V0OwogICAgIEFTU0VSVF9UUlVFKHNtLT5Jc1NuYXBzaG90RGV2aWNlKCJ0ZXN0X3BhcnRpdGlvbl9iIiwgJnRhcmdldCkpOwpAQCAtNjcxLDEzICs3MTEsMjMgQEAKICAgICBBU1NFUlRfRVEoc20tPlByb2Nlc3NVcGRhdGVTdGF0ZSgpLCBVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQpOwogICAgIEFTU0VSVF9FUShzbS0+R2V0VXBkYXRlU3RhdGUoKSwgVXBkYXRlU3RhdGU6Ok5vbmUpOwogCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgc25hcHNob3Qgc3RhdGVzIGFyZSBjbGVhcmVkIGFuZCBhbGwgc3RhbGUgZmlsZXMKKyAgICAvLyBhcmUgZGVsZXRlZAorICAgIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoQWNxdWlyZUxvY2soKSk7CisgICAgICAgIGF1dG8gbG9jYWxfbG9jayA9IHN0ZDo6bW92ZShsb2NrXyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzbmFwc2hvdHM7CisgICAgICAgIEFTU0VSVF9UUlVFKHNtLT5MaXN0U25hcHNob3RzKGxvY2FsX2xvY2suZ2V0KCksICZzbmFwc2hvdHMpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoc25hcHNob3RzLmVtcHR5KCkpOworICAgIH0KKwogICAgIC8vIFRoZSBkZXZpY2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBhIHNuYXBzaG90IG9yIHNuYXBzaG90LW1lcmdlLgogICAgIEFTU0VSVF9GQUxTRShzbS0+SXNTbmFwc2hvdERldmljZSgidGVzdF9wYXJ0aXRpb25fYiIpKTsKIAogICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcmVhZCBiYWNrIHRoZSBzdHJpbmcgd2Ugd3JvdGUgdG8gdGhlIHNuYXBzaG90LiBOb3RlCiAgICAgLy8gdGhhdCB0aGUgYmFzZSBkZXZpY2UgaXMgZ29uZSBub3cuIHxzbmFwX2RldmljZXwgY29udGFpbnMgdGhlIGNvcnJlY3QKICAgICAvLyBwYXJ0aXRpb24uCi0gICAgdW5pcXVlX2ZkIGZkKG9wZW4oIi9kZXYvYmxvY2svbWFwcGVyL3Rlc3RfcGFydGl0aW9uX2IiLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOworICAgIGZkLnJlc2V0KG9wZW4oIi9kZXYvYmxvY2svbWFwcGVyL3Rlc3RfcGFydGl0aW9uX2IiLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOwogICAgIEFTU0VSVF9HRShmZCwgMCk7CiAKICAgICBzdGQ6OnN0cmluZyBidWZmZXIodGVzdF9zdHJpbmcuc2l6ZSgpLCAnXDAnKTsKQEAgLTc2MSw2ICs4MTEsMTAgQEAKICAgICBBU1NFUlRfTkUoaW5pdCwgbnVsbHB0cik7CiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+TmVlZFNuYXBzaG90c0luRmlyc3RTdGFnZU1vdW50KCkpOwogICAgIEFTU0VSVF9UUlVFKGluaXQtPkNyZWF0ZUxvZ2ljYWxBbmRTbmFwc2hvdFBhcnRpdGlvbnMoInN1cGVyIiwgc25hcHNob3RfdGltZW91dF8pKTsKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShpbml0LT5Jbml0aWF0ZU1lcmdlKCkpOwogCiAgICAgLy8gTm93LCByZWZsYXNoIHN1cGVyLiBOb3RlIHRoYXQgd2UgaGF2ZW4ndCBjYWxsZWQgUHJvY2Vzc1VwZGF0ZVN0YXRlLCBzbyB0aGUKQEAgLTExMjMsNyArMTE3Nyw3IEBACiAKICAgICBBc3NlcnRpb25SZXN1bHQgTWFwT25lVXBkYXRlU25hcHNob3QoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKICAgICAgICAgaWYgKHNuYXB1c2VyZF9yZXF1aXJlZF8pIHsKLSAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+IHdyaXRlcjsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiB3cml0ZXI7CiAgICAgICAgICAgICByZXR1cm4gTWFwVXBkYXRlU25hcHNob3QobmFtZSwgJndyaXRlcik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoOwpAQCAtMTE0NCw3ICsxMTk4LDcgQEAKICAgICBBc3NlcnRpb25SZXN1bHQgV3JpdGVTbmFwc2hvdEFuZEhhc2goUGFydGl0aW9uVXBkYXRlKiBwYXJ0aXRpb24pIHsKICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHBhcnRpdGlvbi0+cGFydGl0aW9uX25hbWUoKSArICJfYiI7CiAgICAgICAgIGlmIChzbmFwdXNlcmRfcmVxdWlyZWRfKSB7Ci0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiB3cml0ZXI7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyOwogICAgICAgICAgICAgYXV0byByZXMgPSBNYXBVcGRhdGVTbmFwc2hvdChuYW1lLCAmd3JpdGVyKTsKICAgICAgICAgICAgIGlmICghcmVzKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTExODMsMTMgKzEyMzcsMTMgQEAKICAgICAgICAgU0hBMjU2X0NUWCBjdHg7CiAgICAgICAgIFNIQTI1Nl9Jbml0KCZjdHgpOwogCi0gICAgICAgIGlmICghd3JpdGVyLT5vcHRpb25zKCkubWF4X2Jsb2NrcykgeworICAgICAgICBpZiAoIXdyaXRlci0+R2V0TWF4QmxvY2tzKCkpIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvd1dyaXRlciBtdXN0IHNwZWNpZnkgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBhdXRvIG51bV9ibG9ja3MgPSB3cml0ZXItPm9wdGlvbnMoKS5tYXhfYmxvY2tzLnZhbHVlKCk7CisgICAgICAgIGNvbnN0IGF1dG8gbnVtX2Jsb2NrcyA9IHdyaXRlci0+R2V0TWF4QmxvY2tzKCkudmFsdWUoKTsKIAotICAgICAgICBjb25zdCBhdXRvIGJsb2NrX3NpemUgPSB3cml0ZXItPm9wdGlvbnMoKS5ibG9ja19zaXplOworICAgICAgICBjb25zdCBhdXRvIGJsb2NrX3NpemUgPSB3cml0ZXItPkdldEJsb2NrU2l6ZSgpOwogICAgICAgICBzdGQ6OnN0cmluZyBibG9jayhibG9ja19zaXplLCAnXDAnKTsKICAgICAgICAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewogICAgICAgICAgICAgaWYgKCFSZWFkRnVsbHkocmFuZCwgYmxvY2suZGF0YSgpLCBibG9jay5zaXplKCkpKSB7CkBAIC0xMjEzLDE3ICsxMjY3LDE3IEBACiAgICAgLy8gSXQgZG9lc24ndCByZWFsbHkgbWF0dGVyIHRoZSBvcmRlciwgd2UganVzdCB3YW50IGNvcGllcyB0aGF0IHJlZmVyZW5jZQogICAgIC8vIGJsb2NrcyB0aGF0IHdvbid0IGV4aXN0IGlmIHRoZSBwYXJ0aXRpb24gc2hyaW5rcy4KICAgICBBc3NlcnRpb25SZXN1bHQgU2hpZnRBbGxTbmFwc2hvdEJsb2Nrcyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgdWludDY0X3Qgb2xkX3NpemUpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gd3JpdGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyOwogICAgICAgICBpZiAoYXV0byByZXMgPSBNYXBVcGRhdGVTbmFwc2hvdChuYW1lLCAmd3JpdGVyKTsgIXJlcykgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBpZiAoIXdyaXRlci0+b3B0aW9ucygpLm1heF9ibG9ja3MgfHwgISp3cml0ZXItPm9wdGlvbnMoKS5tYXhfYmxvY2tzKSB7CisgICAgICAgIGlmICghd3JpdGVyLT5HZXRNYXhCbG9ja3MoKSB8fCAhKndyaXRlci0+R2V0TWF4QmxvY2tzKCkpIHsKICAgICAgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIk5vIG1heCBibG9ja3Mgc2V0IGZvciAiIDw8IG5hbWUgPDwgIiB3cml0ZXIiOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDY0X3Qgc3JjX2Jsb2NrID0gKG9sZF9zaXplIC8gd3JpdGVyLT5vcHRpb25zKCkuYmxvY2tfc2l6ZSkgLSAxOworICAgICAgICB1aW50NjRfdCBzcmNfYmxvY2sgPSAob2xkX3NpemUgLyB3cml0ZXItPkdldEJsb2NrU2l6ZSgpKSAtIDE7CiAgICAgICAgIHVpbnQ2NF90IGRzdF9ibG9jayA9IDA7Ci0gICAgICAgIHVpbnQ2NF90IG1heF9ibG9ja3MgPSAqd3JpdGVyLT5vcHRpb25zKCkubWF4X2Jsb2NrczsKKyAgICAgICAgdWludDY0X3QgbWF4X2Jsb2NrcyA9ICp3cml0ZXItPkdldE1heEJsb2NrcygpOwogICAgICAgICB3aGlsZSAoZHN0X2Jsb2NrIDwgbWF4X2Jsb2NrcyAmJiBkc3RfYmxvY2sgPCBzcmNfYmxvY2spIHsKICAgICAgICAgICAgIGlmICghd3JpdGVyLT5BZGRDb3B5KGRzdF9ibG9jaywgc3JjX2Jsb2NrKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIlVuYWJsZSB0byBhZGQgY29weSBmb3IgIiA8PCBuYW1lIDw8ICIgZm9yIGJsb2NrcyAiCkBAIC0xMjM2LDcgKzEyOTAsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIlVuYWJsZSB0byBmaW5hbGl6ZSB3cml0ZXIgZm9yICIgPDwgbmFtZTsKICAgICAgICAgfQogCi0gICAgICAgIGF1dG8gaGFzaCA9IEhhc2hTbmFwc2hvdCh3cml0ZXIuZ2V0KCkpOworICAgICAgICBhdXRvIG9sZF9wYXJ0aXRpb24gPSAiL2Rldi9ibG9jay9tYXBwZXIvIiArIEdldE90aGVyUGFydGl0aW9uTmFtZShuYW1lKTsKKyAgICAgICAgYXV0byByZWFkZXIgPSB3cml0ZXItPk9wZW5GaWxlRGVzY3JpcHRvcihvbGRfcGFydGl0aW9uKTsKKyAgICAgICAgaWYgKCFyZWFkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkNvdWxkIG5vdCBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IgIiA8PCBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBoYXNoID0gSGFzaFNuYXBzaG90KHJlYWRlci5nZXQoKSk7CiAgICAgICAgIGlmIChoYXNoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIlVuYWJsZSB0byBoYXNoIHNuYXBzaG90IHdyaXRlciBmb3IgIiA8PCBuYW1lOwogICAgICAgICB9CkBAIC0xMzQ0LDYgKzE0MDQsMTAgQEAKICAgICB9CiAKICAgICAvLyBJbml0aWF0ZSB0aGUgbWVyZ2UgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGNvbXBsZXRlZC4KKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShpbml0LT5Jbml0aWF0ZU1lcmdlKCkpOwogICAgIEFTU0VSVF9FUShpbml0LT5Jc1NuYXB1c2VyZFJlcXVpcmVkKCksIHNuYXB1c2VyZF9yZXF1aXJlZF8pOwogICAgIHsKQEAgLTEzODcsNyArMTQ1MSw3IEBACiAgICAgZm9yIChhdXRvKiBwYXJ0aXRpb24gOiBwYXJ0aXRpb25zKSB7CiAgICAgICAgIEFkZE9wZXJhdGlvbihwYXJ0aXRpb24pOwogCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+IHdyaXRlcjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IHdyaXRlcjsKICAgICAgICAgYXV0byByZXMgPSBNYXBVcGRhdGVTbmFwc2hvdChwYXJ0aXRpb24tPnBhcnRpdGlvbl9uYW1lKCkgKyAiX2IiLCAmd3JpdGVyKTsKICAgICAgICAgQVNTRVJUX1RSVUUocmVzKTsKICAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDAsIDEpKTsKQEAgLTE0MDcsNiArMTQ3MSwxMCBAQAogICAgIEFTU0VSVF9UUlVFKGluaXQtPkNyZWF0ZUxvZ2ljYWxBbmRTbmFwc2hvdFBhcnRpdGlvbnMoInN1cGVyIiwgc25hcHNob3RfdGltZW91dF8pKTsKIAogICAgIC8vIEluaXRpYXRlIHRoZSBtZXJnZSBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgY29tcGxldGVkLgorICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIGluIHRlc3QiOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIEFTU0VSVF9UUlVFKGluaXQtPkluaXRpYXRlTWVyZ2UoKSk7CiAgICAgQVNTRVJUX0VRKFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZCwgaW5pdC0+UHJvY2Vzc1VwZGF0ZVN0YXRlKCkpOwogfQpAQCAtMTQ3Niw2ICsxNTQ0LDEwIEBACiAgICAgfQogCiAgICAgLy8gSW5pdGlhdGUgdGhlIG1lcmdlIGFuZCB3YWl0IGZvciBpdCB0byBiZSBjb21wbGV0ZWQuCisgICAgaWYgKFNob3VsZFNraXBMZWdhY3lNZXJnaW5nKCkpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJTa2lwcGluZyBsZWdhY3kgbWVyZ2UgaW4gdGVzdCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+SW5pdGlhdGVNZXJnZSgpKTsKICAgICBBU1NFUlRfRVEoaW5pdC0+SXNTbmFwdXNlcmRSZXF1aXJlZCgpLCBzbmFwdXNlcmRfcmVxdWlyZWRfKTsKICAgICB7CkBAIC0xNTI5LDkzICsxNjAxLDYgQEAKICAgICB9CiB9CiAKLS8vIFRlc3QgdGhhdCBhIHRyYW5zaWVudCBtZXJnZSBjb25zaXN0ZW5jeSBjaGVjayBmYWlsdXJlIGNhbiByZXN1bWUgcHJvcGVybHkuCi1URVNUX0YoU25hcHNob3RVcGRhdGVUZXN0LCBDb25zaXN0ZW5jeUNoZWNrUmVzdW1lKSB7Ci0gICAgaWYgKCFzbmFwdXNlcmRfcmVxdWlyZWRfKSB7Ci0gICAgICAgIC8vIGIvMTc5MTExMzU5Ci0gICAgICAgIEdURVNUX1NLSVAoKSA8PCAiU2tpcHBpbmcgc25hcHVzZXJkIHRlc3QiOwotICAgIH0KLQotICAgIGF1dG8gb2xkX3N5c19zaXplID0gR2V0U2l6ZShzeXNfKTsKLSAgICBhdXRvIG9sZF9wcmRfc2l6ZSA9IEdldFNpemUocHJkXyk7Ci0KLSAgICAvLyBHcm93IHxzeXN8IGJ1dCBzaHJpbmsgfHByZHwuCi0gICAgU2V0U2l6ZShzeXNfLCBvbGRfc3lzX3NpemUgKiAyKTsKLSAgICBzeXNfLT5zZXRfZXN0aW1hdGVfY293X3NpemUoOF9NaUIpOwotICAgIFNldFNpemUocHJkXywgb2xkX3ByZF9zaXplIC8gMik7Ci0gICAgcHJkXy0+c2V0X2VzdGltYXRlX2Nvd19zaXplKDFfTWlCKTsKLQotICAgIEFkZE9wZXJhdGlvbkZvclBhcnRpdGlvbnMoKTsKLQotICAgIEFTU0VSVF9UUlVFKHNtLT5CZWdpblVwZGF0ZSgpKTsKLSAgICBBU1NFUlRfVFJVRShzbS0+Q3JlYXRlVXBkYXRlU25hcHNob3RzKG1hbmlmZXN0XykpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlU25hcHNob3RBbmRIYXNoKHN5c18pKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZVNuYXBzaG90QW5kSGFzaCh2bmRfKSk7Ci0gICAgQVNTRVJUX1RSVUUoU2hpZnRBbGxTbmFwc2hvdEJsb2NrcygicHJkX2IiLCBvbGRfcHJkX3NpemUpKTsKLQotICAgIHN5bmMoKTsKLQotICAgIC8vIEFzc2VydCB0aGF0IHNvdXJjZSBwYXJ0aXRpb25zIGFyZW4ndCBhZmZlY3RlZC4KLSAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiB7InN5c19hIiwgInZuZF9hIiwgInByZF9hIn0pIHsKLSAgICAgICAgQVNTRVJUX1RSVUUoSXNQYXJ0aXRpb25VbmNoYW5nZWQobmFtZSkpOwotICAgIH0KLQotICAgIEFTU0VSVF9UUlVFKHNtLT5GaW5pc2hlZFNuYXBzaG90V3JpdGVzKGZhbHNlKSk7Ci0KLSAgICAvLyBTaW11bGF0ZSBzaHV0dGluZyBkb3duIHRoZSBkZXZpY2UuCi0gICAgQVNTRVJUX1RSVUUoVW5tYXBBbGwoKSk7Ci0KLSAgICAvLyBBZnRlciByZWJvb3QsIGluaXQgZG9lcyBmaXJzdCBzdGFnZSBtb3VudC4KLSAgICBhdXRvIGluaXQgPSBOZXdNYW5hZ2VyRm9yRmlyc3RTdGFnZU1vdW50KCJfYiIpOwotICAgIEFTU0VSVF9ORShpbml0LCBudWxscHRyKTsKLSAgICBBU1NFUlRfVFJVRShpbml0LT5OZWVkU25hcHNob3RzSW5GaXJzdFN0YWdlTW91bnQoKSk7Ci0gICAgQVNTRVJUX1RSVUUoaW5pdC0+Q3JlYXRlTG9naWNhbEFuZFNuYXBzaG90UGFydGl0aW9ucygic3VwZXIiLCBzbmFwc2hvdF90aW1lb3V0XykpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0IHBhcnRpdGlvbnMgaGF2ZSB0aGUgc2FtZSBjb250ZW50LgotICAgIGZvciAoY29uc3QgYXV0byYgbmFtZSA6IHsic3lzX2IiLCAidm5kX2IiLCAicHJkX2IifSkgewotICAgICAgICBBU1NFUlRfVFJVRShJc1BhcnRpdGlvblVuY2hhbmdlZChuYW1lKSk7Ci0gICAgfQotCi0gICAgYXV0byBvbGRfY2hlY2tlciA9IGluaXQtPm1lcmdlX2NvbnNpc3RlbmN5X2NoZWNrZXIoKTsKLQotICAgIGluaXQtPnNldF9tZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyKAotICAgICAgICAgICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBTbmFwc2hvdFN0YXR1cyYpIC0+IE1lcmdlRmFpbHVyZUNvZGUgewotICAgICAgICAgICAgICAgIHJldHVybiBNZXJnZUZhaWx1cmVDb2RlOjpXcm9uZ01lcmdlQ291bnRDb25zaXN0ZW5jeUNoZWNrOwotICAgICAgICAgICAgfSk7Ci0KLSAgICAvLyBJbml0aWF0ZSB0aGUgbWVyZ2UgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGNvbXBsZXRlZC4KLSAgICBBU1NFUlRfVFJVRShpbml0LT5Jbml0aWF0ZU1lcmdlKCkpOwotICAgIEFTU0VSVF9FUShpbml0LT5Jc1NuYXB1c2VyZFJlcXVpcmVkKCksIHNuYXB1c2VyZF9yZXF1aXJlZF8pOwotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbWVyZ2UgcGhhc2UgaXMgRklSU1RfUEhBU0UgdW50aWwgYXQgbGVhc3Qgb25lIGNhbGwKLSAgICAgICAgLy8gdG8gUHJvY2Vzc1VwZGF0ZVN0YXRlKCkgb2NjdXJzLgotICAgICAgICBBU1NFUlRfVFJVRShBY3F1aXJlTG9jaygpKTsKLSAgICAgICAgYXV0byBsb2NhbF9sb2NrID0gc3RkOjptb3ZlKGxvY2tfKTsKLSAgICAgICAgYXV0byBzdGF0dXMgPSBpbml0LT5SZWFkU25hcHNob3RVcGRhdGVTdGF0dXMobG9jYWxfbG9jay5nZXQoKSk7Ci0gICAgICAgIEFTU0VSVF9FUShzdGF0dXMubWVyZ2VfcGhhc2UoKSwgTWVyZ2VQaGFzZTo6RklSU1RfUEhBU0UpOwotICAgIH0KLQotICAgIC8vIE1lcmdlIHNob3VsZCBoYXZlIGZhaWxlZC4KLSAgICBBU1NFUlRfRVEoVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkLCBpbml0LT5Qcm9jZXNzVXBkYXRlU3RhdGUoKSk7Ci0KLSAgICAvLyBTaW11bGF0ZSBzaHV0dGluZyBkb3duIHRoZSBkZXZpY2UgYW5kIGNyZWF0aW5nIHBhcnRpdGlvbnMgYWdhaW4uCi0gICAgQVNTRVJUX1RSVUUoVW5tYXBBbGwoKSk7Ci0KLSAgICAvLyBSZXN0b3JlIHRoZSBjaGVja2VyLgotICAgIGluaXQtPnNldF9tZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyKHN0ZDo6bW92ZShvbGRfY2hlY2tlcikpOwotCi0gICAgQVNTRVJUX1RSVUUoaW5pdC0+Q3JlYXRlTG9naWNhbEFuZFNuYXBzaG90UGFydGl0aW9ucygic3VwZXIiLCBzbmFwc2hvdF90aW1lb3V0XykpOwotCi0gICAgLy8gQ29tcGxldGUgdGhlIG1lcmdlLgotICAgIEFTU0VSVF9FUShVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQsIGluaXQtPlByb2Nlc3NVcGRhdGVTdGF0ZSgpKTsKLQotICAgIC8vIENoZWNrIHRoYXQgdGhlIHRhcmdldCBwYXJ0aXRpb25zIGhhdmUgdGhlIHNhbWUgY29udGVudCBhZnRlciB0aGUgbWVyZ2UuCi0gICAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogeyJzeXNfYiIsICJ2bmRfYiIsICJwcmRfYiJ9KSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKElzUGFydGl0aW9uVW5jaGFuZ2VkKG5hbWUpKQotICAgICAgICAgICAgICAgIDw8ICJDb250ZW50IG9mICIgPDwgbmFtZSA8PCAiIGNoYW5nZXMgYWZ0ZXIgdGhlIG1lcmdlIjsKLSAgICB9Ci19Ci0KIC8vIFRlc3QgdGhhdCBpZiBuZXcgc3lzdGVtIHBhcnRpdGlvbnMgdXNlcyBlbXB0eSBzcGFjZSBpbiBzdXBlciwgdGhhdCByZWdpb24gaXMgbm90IHNuYXBzaG90dGVkLgogVEVTVF9GKFNuYXBzaG90VXBkYXRlVGVzdCwgRGlyZWN0V3JpdGVFbXB0eVNwYWNlKSB7CiAgICAgR1RFU1RfU0tJUCgpIDw8ICJiLzE0MTg4OTc0NiI7CkBAIC0xNzg2LDYgKzE3NzEsMTAgQEAKIAogICAgIC8vIEluaXRpYXRlIHRoZSBtZXJnZSBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgY29tcGxldGVkLgogICAgIGF1dG8gbmV3X3NtID0gU25hcHNob3RNYW5hZ2VyOjpOZXcobmV3IFRlc3REZXZpY2VJbmZvKGZha2Vfc3VwZXIsICJfYiIpKTsKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShuZXdfc20tPkluaXRpYXRlTWVyZ2UoKSk7CiAgICAgQVNTRVJUX0VRKFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZCwgbmV3X3NtLT5Qcm9jZXNzVXBkYXRlU3RhdGUoKSk7CiAKQEAgLTE5MjQsNiArMTkxMywxMCBAQAogICAgIEFTU0VSVF9HRShmZCwgMCk7CiAKICAgICAvLyBDT1cgY2Fubm90IGJlIHJlbW92ZWQgZHVlIHRvIG9wZW4gZmQsIHNvIGV4cGVjdCBhIHNvZnQgZmFpbHVyZS4KKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShpbml0LT5Jbml0aWF0ZU1lcmdlKCkpOwogICAgIEFTU0VSVF9FUShVcGRhdGVTdGF0ZTo6TWVyZ2VOZWVkc1JlYm9vdCwgaW5pdC0+UHJvY2Vzc1VwZGF0ZVN0YXRlKCkpOwogCkBAIC0yMDI3LDYgKzIwMjAsMTAgQEAKIAogICAgIC8vIEluaXRpYXRlIHRoZSBtZXJnZSBhbmQgdGhlbiBpbW1lZGlhdGVseSBzdG9wIGl0IHRvIHNpbXVsYXRlIGEgcmVib290LgogICAgIGF1dG8gbmV3X3NtID0gU25hcHNob3RNYW5hZ2VyOjpOZXcobmV3IFRlc3REZXZpY2VJbmZvKGZha2Vfc3VwZXIsICJfYiIpKTsKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShuZXdfc20tPkluaXRpYXRlTWVyZ2UoKSk7CiAgICAgQVNTRVJUX1RSVUUoVW5tYXBBbGwoKSk7CiAKQEAgLTIwNTksNiArMjA1NiwxMCBAQAogCiAgICAgLy8gSW5pdGlhdGUgdGhlIG1lcmdlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHN0b3AgaXQgdG8gc2ltdWxhdGUgYSByZWJvb3QuCiAgICAgYXV0byBuZXdfc20gPSBTbmFwc2hvdE1hbmFnZXI6Ok5ldyhuZXcgVGVzdERldmljZUluZm8oZmFrZV9zdXBlciwgIl9iIikpOworICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIGluIHRlc3QiOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIEFTU0VSVF9UUlVFKG5ld19zbS0+SW5pdGlhdGVNZXJnZSgpKTsKICAgICBBU1NFUlRfVFJVRShVbm1hcEFsbCgpKTsKIApAQCAtMjEzNiw2ICsyMTM3LDEwIEBACiAKIC8vIFRlc3QgdXBkYXRlIHBhY2thZ2UgdGhhdCByZXF1ZXN0cyBkYXRhIHdpcGUuCiBURVNUX0YoU25hcHNob3RVcGRhdGVUZXN0LCBEYXRhV2lwZVJlcXVpcmVkSW5QYWNrYWdlKSB7CisgICAgaWYgKFNob3VsZFNraXBMZWdhY3lNZXJnaW5nKCkpIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJTa2lwcGluZyBsZWdhY3kgbWVyZ2UgaW4gdGVzdCI7CisgICAgfQorCiAgICAgQWRkT3BlcmF0aW9uRm9yUGFydGl0aW9ucygpOwogICAgIC8vIEV4ZWN1dGUgdGhlIHVwZGF0ZS4KICAgICBBU1NFUlRfVFJVRShzbS0+QmVnaW5VcGRhdGUoKSk7CkBAIC0yMTc1LDYgKzIxODAsMTAgQEAKIAogLy8gVGVzdCB1cGRhdGUgcGFja2FnZSB0aGF0IHJlcXVlc3RzIGRhdGEgd2lwZS4KIFRFU1RfRihTbmFwc2hvdFVwZGF0ZVRlc3QsIERhdGFXaXBlV2l0aFN0YWxlU25hcHNob3RzKSB7CisgICAgaWYgKFNob3VsZFNraXBMZWdhY3lNZXJnaW5nKCkpIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJTa2lwcGluZyBsZWdhY3kgbWVyZ2UgaW4gdGVzdCI7CisgICAgfQorCiAgICAgQWRkT3BlcmF0aW9uRm9yUGFydGl0aW9ucygpOwogCiAgICAgLy8gRXhlY3V0ZSB0aGUgdXBkYXRlLgpAQCAtMjM1Myw4ICsyMzYyLDEwIEBACiAgICAgYXV0byBpbml0ID0gTmV3TWFuYWdlckZvckZpcnN0U3RhZ2VNb3VudCgiX2IiKTsKICAgICBBU1NFUlRfTkUoaW5pdCwgbnVsbHB0cik7CiAKLSAgICBBU1NFUlRfVFJVRShpbml0LT5FbnN1cmVTbmFwdXNlcmRDb25uZWN0ZWQoKSk7Ci0gICAgaW5pdC0+c2V0X3VzZV9maXJzdF9zdGFnZV9zbmFwdXNlcmQodHJ1ZSk7CisgICAgaWYgKHNuYXB1c2VyZF9yZXF1aXJlZF8pIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW5pdC0+RW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCkpOworICAgICAgICBpbml0LT5zZXRfdXNlX2ZpcnN0X3N0YWdlX3NuYXB1c2VyZCh0cnVlKTsKKyAgICB9CiAKICAgICBBU1NFUlRfVFJVRShpbml0LT5OZWVkU25hcHNob3RzSW5GaXJzdFN0YWdlTW91bnQoKSk7CiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+Q3JlYXRlTG9naWNhbEFuZFNuYXBzaG90UGFydGl0aW9ucygic3VwZXIiLCBzbmFwc2hvdF90aW1lb3V0XykpOwpAQCAtMjM2NSwxMiArMjM3NiwxOCBAQAogICAgICAgICBBU1NFUlRfVFJVRShJc1BhcnRpdGlvblVuY2hhbmdlZChuYW1lKSk7CiAgICAgfQogCi0gICAgQVNTRVJUX1RSVUUoaW5pdC0+UGVyZm9ybUluaXRUcmFuc2l0aW9uKFNuYXBzaG90TWFuYWdlcjo6SW5pdFRyYW5zaXRpb246OlNFQ09ORF9TVEFHRSkpOwotICAgIGZvciAoY29uc3QgYXV0byYgbmFtZSA6IHBhcnRpdGlvbnMpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUoaW5pdC0+c25hcHVzZXJkX2NsaWVudCgpLT5XYWl0Rm9yRGV2aWNlRGVsZXRlKG5hbWUgKyAiLXVzZXItY293LWluaXQiKSk7CisgICAgaWYgKHNuYXB1c2VyZF9yZXF1aXJlZF8pIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW5pdC0+UGVyZm9ybUluaXRUcmFuc2l0aW9uKFNuYXBzaG90TWFuYWdlcjo6SW5pdFRyYW5zaXRpb246OlNFQ09ORF9TVEFHRSkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBwYXJ0aXRpb25zKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpbml0LT5zbmFwdXNlcmRfY2xpZW50KCktPldhaXRGb3JEZXZpY2VEZWxldGUobmFtZSArICItdXNlci1jb3ctaW5pdCIpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEluaXRpYXRlIHRoZSBtZXJnZSBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgY29tcGxldGVkLgorICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIGluIHRlc3QiOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIEFTU0VSVF9UUlVFKGluaXQtPkluaXRpYXRlTWVyZ2UoKSk7CiAgICAgQVNTRVJUX0VRKFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZCwgaW5pdC0+UHJvY2Vzc1VwZGF0ZVN0YXRlKCkpOwogCkBAIC0yNDU1LDYgKzI0NzIsNTYgQEAKICAgICB9CiB9CiAKK1RFU1RfRihTbmFwc2hvdFVwZGF0ZVRlc3QsIE1hcEFsbFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoKSB7CisgICAgTW91bnRNZXRhZGF0YSgpOworICAgIEFkZE9wZXJhdGlvbkZvclBhcnRpdGlvbnMoKTsKKyAgICAvLyBFeGVjdXRlIHRoZSB1cGRhdGUuCisgICAgQVNTRVJUX1RSVUUoc20tPkJlZ2luVXBkYXRlKCkpOworICAgIEFTU0VSVF9UUlVFKHNtLT5DcmVhdGVVcGRhdGVTbmFwc2hvdHMobWFuaWZlc3RfKSk7CisKKyAgICBpZiAoIXNtLT5VcGRhdGVVc2VzVXNlclNuYXBzaG90cygpKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBkb2VzIG5vdCBhcHBseSBhcyBVc2VyU25hcHNob3RzIGFyZW4ndCBlbmFibGVkLiI7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUoV3JpdGVTbmFwc2hvdHMoKSk7CisgICAgQVNTRVJUX1RSVUUoc20tPkZpbmlzaGVkU25hcHNob3RXcml0ZXMoZmFsc2UpKTsKKworICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIHRlc3QiOworICAgIH0KKyAgICAvLyBNYXJrIHRoZSBpbmRpY2F0b3IKKyAgICBBU1NFUlRfVFJVRShzbS0+Qm9vdEZyb21TbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHNtLT5FbnN1cmVTbmFwdXNlcmRDb25uZWN0ZWQoKSk7CisgICAgc20tPnNldF91c2VfZmlyc3Rfc3RhZ2Vfc25hcHVzZXJkKHRydWUpOworCisgICAgQVNTRVJUX1RSVUUoc20tPk5lZWRTbmFwc2hvdHNJbkZpcnN0U3RhZ2VNb3VudCgpKTsKKworICAgIC8vIE1hcCBzbmFwc2hvdHMKKyAgICBBU1NFUlRfVFJVRShzbS0+TWFwQWxsU25hcHNob3RzKDEwcykpOworCisgICAgLy8gTmV3IHVwZGF0ZXMgc2hvdWxkIGZhaWwKKyAgICBBU1NFUlRfRkFMU0Uoc20tPkJlZ2luVXBkYXRlKCkpOworCisgICAgLy8gU25hcHNob3RzIGNhbm5vdCBiZSBjYW5jZWxsZWQKKyAgICBBU1NFUlRfRkFMU0Uoc20tPkNhbmNlbFVwZGF0ZSgpKTsKKworICAgIC8vIE1lcmdlIGNhbm5vdCBzdGFydAorICAgIEFTU0VSVF9GQUxTRShzbS0+SW5pdGlhdGVNZXJnZSgpKTsKKworICAgIC8vIFJlYWQgYnl0ZXMgYmFjayBhbmQgdmVyaWZ5IHRoZXkgbWF0Y2ggdGhlIGNhY2hlLgorICAgIEFTU0VSVF9UUlVFKElzUGFydGl0aW9uVW5jaGFuZ2VkKCJzeXNfYiIpKTsKKworICAgIC8vIFJlbW92ZSB0aGUgaW5kaWNhdG9ycworICAgIEFTU0VSVF9UUlVFKHNtLT5QcmVwYXJlRGV2aWNlVG9Cb290V2l0aG91dFNuYXBzaG90KCkpOworCisgICAgLy8gRW5zdXJlIHNuYXBzaG90cyBhcmUgc3RpbGwgbW91bnRlZAorICAgIEFTU0VSVF9UUlVFKHNtLT5Jc1VzZXJzcGFjZVNuYXBzaG90VXBkYXRlSW5Qcm9ncmVzcygpKTsKKworICAgIC8vIENsZWFudXAgc25hcHNob3RzCisgICAgQVNTRVJUX1RSVUUoc20tPlVubWFwQWxsU25hcHNob3RzKCkpOworfQorCiBURVNUX0YoU25hcHNob3RVcGRhdGVUZXN0LCBNYXBBbGxTbmFwc2hvdHMpIHsKICAgICBBZGRPcGVyYXRpb25Gb3JQYXJ0aXRpb25zKCk7CiAgICAgLy8gRXhlY3V0ZSB0aGUgdXBkYXRlLgpAQCAtMjU1Nyw2ICsyNjI0LDExIEBACiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+SW5pdGlhdGVNZXJnZSgpKTsKICAgICBBU1NFUlRfRVEoVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkLCBpbml0LT5Qcm9jZXNzVXBkYXRlU3RhdGUoKSk7CiAKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIC8vIFNpbXVsYXRlIGEgcmVib290IHRoYXQgdHJpZXMgdGhlIG1lcmdlIGFnYWluLCB3aXRoIHRoZSBub24tZmFpbGluZyBkbS4KICAgICBBU1NFUlRfVFJVRShVbm1hcEFsbCgpKTsKICAgICBpbml0ID0gTmV3TWFuYWdlckZvckZpcnN0U3RhZ2VNb3VudCgiX2IiKTsKQEAgLTI1NjUsNiArMjYzNywyNCBAQAogICAgIEFTU0VSVF9FUShVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQsIGluaXQtPlByb2Nlc3NVcGRhdGVTdGF0ZSgpKTsKIH0KIAorVEVTVF9GKFNuYXBzaG90VXBkYXRlVGVzdCwgQmFkQ293VmVyc2lvbikgeworICAgIGlmICghc25hcHVzZXJkX3JlcXVpcmVkXykgeworICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIlZBQkMgb25seSI7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUoc20tPkJlZ2luVXBkYXRlKCkpOworCisgICAgYXV0byBkeW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YSA9IG1hbmlmZXN0Xy5tdXRhYmxlX2R5bmFtaWNfcGFydGl0aW9uX21ldGFkYXRhKCk7CisgICAgZHluYW1pY19wYXJ0aXRpb25fbWV0YWRhdGEtPnNldF9jb3dfdmVyc2lvbihrTWluQ293VmVyc2lvbiAtIDEpOworICAgIEFTU0VSVF9GQUxTRShzbS0+Q3JlYXRlVXBkYXRlU25hcHNob3RzKG1hbmlmZXN0XykpOworCisgICAgZHluYW1pY19wYXJ0aXRpb25fbWV0YWRhdGEtPnNldF9jb3dfdmVyc2lvbihrTWF4Q293VmVyc2lvbiArIDEpOworICAgIEFTU0VSVF9GQUxTRShzbS0+Q3JlYXRlVXBkYXRlU25hcHNob3RzKG1hbmlmZXN0XykpOworCisgICAgZHluYW1pY19wYXJ0aXRpb25fbWV0YWRhdGEtPnNldF9jb3dfdmVyc2lvbihrTWF4Q293VmVyc2lvbik7CisgICAgQVNTRVJUX1RSVUUoc20tPkNyZWF0ZVVwZGF0ZVNuYXBzaG90cyhtYW5pZmVzdF8pKTsKK30KKwogY2xhc3MgRmxhc2hBZnRlclVwZGF0ZVRlc3QgOiBwdWJsaWMgU25hcHNob3RVcGRhdGVUZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6dHVwbGU8dWludDMyX3QsIGJvb2w+PiB7CiAgIHB1YmxpYzoKQEAgLTI3NzQsMTUgKzI4NjQsMjMgQEAKIH0KIAogdm9pZCBLaWxsU25hcHVzZXJkKCkgewotICAgIGF1dG8gc3RhdHVzID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoImluaXQuc3ZjLnNuYXB1c2VyZCIsICJzdG9wcGVkIik7Ci0gICAgaWYgKHN0YXR1cyA9PSAic3RvcHBlZCIpIHsKLSAgICAgICAgcmV0dXJuOworICAgIC8vIERldGFjaCB0aGUgZGFlbW9uIGlmIGl0J3MgYWxpdmUKKyAgICBhdXRvIHNuYXB1c2VyZF9jbGllbnQgPSBTbmFwdXNlcmRDbGllbnQ6OlRyeUNvbm5lY3Qoa1NuYXB1c2VyZFNvY2tldCwgNXMpOworICAgIGlmIChzbmFwdXNlcmRfY2xpZW50KSB7CisgICAgICAgIHNuYXB1c2VyZF9jbGllbnQtPkRldGFjaFNuYXB1c2VyZCgpOwogICAgIH0KLSAgICBhdXRvIHNuYXB1c2VyZF9jbGllbnQgPSBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3Qoa1NuYXB1c2VyZFNvY2tldCwgNXMpOwotICAgIGlmICghc25hcHVzZXJkX2NsaWVudCkgewotICAgICAgICByZXR1cm47CisKKyAgICAvLyBOb3cgc3RvcCB0aGUgc2VydmljZSAtIEluaXQgd2lsbCBzZW5kIGEgU0lHS0lMTCB0byB0aGUgZGFlbW9uLiBIb3dldmVyLAorICAgIC8vIHByb2Nlc3Mgc3RhdGUgd2lsbCBtb3ZlIGZyb20gInJ1bm5pbmciIHRvICJzdG9wcGluZyIuIE9ubHkgYWZ0ZXIgdGhlCisgICAgLy8gcHJvY2VzcyBpcyByZWFwZWQgYnkgaW5pdCwgdGhlIHNlcnZpY2Ugc3RhdGUgaXMgbW92ZWQgdG8gInN0b3BwZWQiLgorICAgIC8vCisgICAgLy8gU2luY2UgdGhlIHRlc3RzIGludm9sdmUgc3RhcnRpbmcgdGhlIGRhZW1vbiBpbW1lZGlhdGVseSwgd2FpdCBmb3IgdGhlCisgICAgLy8gcHJvY2VzcyB0byBjb21wbGV0ZWx5IHN0b3AgKGFrYS4gd2FpdCB1bnRpbCBpbml0IHJlYXBzIHRoZSB0ZXJtaW5hdGVkCisgICAgLy8gcHJvY2VzcykuCisgICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoImN0bC5zdG9wIiwgInNuYXB1c2VyZCIpOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5KCJpbml0LnN2Yy5zbmFwdXNlcmQiLCAic3RvcHBlZCIsIDEwcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNuYXB1c2VyZCB0byBzdG9wLiI7CiAgICAgfQotICAgIHNuYXB1c2VyZF9jbGllbnQtPkRldGFjaFNuYXB1c2VyZCgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTdmZDcuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgPGxpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHBheWxvYWRfY29uc3VtZXIvZmlsZV9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSAic25hcHNob3RfcmVhZGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotdXNpbmcgY2hyb21lb3NfdXBkYXRlX2VuZ2luZTo6RmlsZURlc2NyaXB0b3I7Ci0KLUlTbmFwc2hvdFdyaXRlcjo6SVNuYXBzaG90V3JpdGVyKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMpIDogSUNvd1dyaXRlcihvcHRpb25zKSB7fQotCi12b2lkIElTbmFwc2hvdFdyaXRlcjo6U2V0U291cmNlRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfZGV2aWNlKSB7Ci0gICAgc291cmNlX2RldmljZV8gPSB7c291cmNlX2RldmljZX07Ci19Ci0KLWJvcnJvd2VkX2ZkIElTbmFwc2hvdFdyaXRlcjo6R2V0U291cmNlRmQoKSB7Ci0gICAgaWYgKCFzb3VyY2VfZGV2aWNlXykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBdHRlbXB0ZWQgdG8gcmVhZCBmcm9tIHNvdXJjZSBkZXZpY2UgYnV0IG5vbmUgd2FzIHNldCI7Ci0gICAgICAgIHJldHVybiBib3Jyb3dlZF9mZHstMX07Ci0gICAgfQotCi0gICAgaWYgKHNvdXJjZV9mZF8gPCAwKSB7Ci0gICAgICAgIHNvdXJjZV9mZF8ucmVzZXQob3Blbihzb3VyY2VfZGV2aWNlXy0+Y19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKLSAgICAgICAgaWYgKHNvdXJjZV9mZF8gPCAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbiAiIDw8ICpzb3VyY2VfZGV2aWNlXzsKLSAgICAgICAgICAgIHJldHVybiBib3Jyb3dlZF9mZHstMX07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZV9mZF87Ci19Ci0KLUNvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6Q29tcHJlc3NlZFNuYXBzaG90V3JpdGVyKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMpCi0gICAgOiBJU25hcHNob3RXcml0ZXIob3B0aW9ucykge30KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6OlNldENvd0RldmljZShhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBjb3dfZGV2aWNlKSB7Ci0gICAgY293X2RldmljZV8gPSBzdGQ6Om1vdmUoY293X2RldmljZSk7Ci0gICAgY293XyA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpGaW5hbGl6ZSgpIHsKLSAgICByZXR1cm4gY293Xy0+RmluYWxpemUoKTsKLX0KLQotdWludDY0X3QgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpHZXRDb3dTaXplKCkgewotICAgIHJldHVybiBjb3dfLT5HZXRDb3dTaXplKCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6T3BlbkNvd1JlYWRlcigpIGNvbnN0IHsKLSAgICB1bmlxdWVfZmQgY293X2ZkKGR1cChjb3dfZGV2aWNlXy5nZXQoKSkpOwotICAgIGlmIChjb3dfZmQgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJkdXAgQ09XIGRldmljZSI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGF1dG8gY293ID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dSZWFkZXI+KCk7Ci0gICAgaWYgKCFjb3ctPlBhcnNlKHN0ZDo6bW92ZShjb3dfZmQpKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmVhZCBDT1ciOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdzsKLX0KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6OlZlcmlmeU1lcmdlT3BzKCkgY29uc3Qgbm9leGNlcHQgewotICAgIGF1dG8gY293X3JlYWRlciA9IE9wZW5Db3dSZWFkZXIoKTsKLSAgICBpZiAoY293X3JlYWRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkbid0IG9wZW4gQ293UmVhZGVyIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gY293X3JlYWRlci0+VmVyaWZ5TWVyZ2VPcHMoKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPEZpbGVEZXNjcmlwdG9yPiBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6Ok9wZW5SZWFkZXIoKSB7Ci0gICAgYXV0byBjb3cgPSBPcGVuQ293UmVhZGVyKCk7Ci0gICAgaWYgKGNvdyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGF1dG8gcmVhZGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc2VkU25hcHNob3RSZWFkZXI+KCk7Ci0gICAgaWYgKCFyZWFkZXItPlNldENvdyhzdGQ6Om1vdmUoY293KSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgQ09XIHJlYWRlciI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBpZiAoc291cmNlX2RldmljZV8pIHsKLSAgICAgICAgcmVhZGVyLT5TZXRTb3VyY2VEZXZpY2UoKnNvdXJjZV9kZXZpY2VfKTsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvJiBjb3dfb3B0aW9ucyA9IG9wdGlvbnMoKTsKLSAgICBpZiAoY293X29wdGlvbnMubWF4X2Jsb2NrcykgewotICAgICAgICByZWFkZXItPlNldEJsb2NrRGV2aWNlU2l6ZSgqY293X29wdGlvbnMubWF4X2Jsb2NrcyAqIGNvd19vcHRpb25zLmJsb2NrX3NpemUpOwotICAgIH0KLQotICAgIHJldHVybiByZWFkZXI7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBudW1fYmxvY2tzKSB7Ci0gICAgcmV0dXJuIGNvd18tPkFkZENvcHkobmV3X2Jsb2NrLCBvbGRfYmxvY2ssIG51bV9ibG9ja3MpOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6RW1pdFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiBjb3dfLT5BZGRSYXdCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplKTsKLX0KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6OkVtaXRYb3JCbG9ja3ModWludDMyX3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIGNvd18tPkFkZFhvckJsb2NrcyhuZXdfYmxvY2tfc3RhcnQsIGRhdGEsIHNpemUsIG9sZF9ibG9jaywgb2Zmc2V0KTsKLX0KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6OkVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2NrcykgewotICAgIHJldHVybiBjb3dfLT5BZGRaZXJvQmxvY2tzKG5ld19ibG9ja19zdGFydCwgbnVtX2Jsb2Nrcyk7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIHsKLSAgICByZXR1cm4gY293Xy0+QWRkTGFiZWwobGFiZWwpOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6RW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIHsKLSAgICByZXR1cm4gY293Xy0+QWRkU2VxdWVuY2VEYXRhKG51bV9vcHMsIGRhdGEpOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6SW5pdGlhbGl6ZSgpIHsKLSAgICByZXR1cm4gY293Xy0+SW5pdGlhbGl6ZShjb3dfZGV2aWNlXyk7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpJbml0aWFsaXplQXBwZW5kKHVpbnQ2NF90IGxhYmVsKSB7Ci0gICAgcmV0dXJuIGNvd18tPkluaXRpYWxpemVBcHBlbmQoY293X2RldmljZV8sIGxhYmVsKTsKLX0KLQotT25saW5lS2VybmVsU25hcHNob3RXcml0ZXI6Ok9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMpCi0gICAgOiBJU25hcHNob3RXcml0ZXIob3B0aW9ucykge30KLQotdm9pZCBPbmxpbmVLZXJuZWxTbmFwc2hvdFdyaXRlcjo6U2V0U25hcHNob3REZXZpY2UoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgc25hcHNob3RfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb3dfc2l6ZSkgewotICAgIHNuYXBzaG90X2ZkXyA9IHN0ZDo6bW92ZShzbmFwc2hvdF9mZCk7Ci0gICAgY293X3NpemVfID0gY293X3NpemU7Ci19Ci0KLWJvb2wgT25saW5lS2VybmVsU25hcHNob3RXcml0ZXI6OkZpbmFsaXplKCkgewotICAgIGlmIChmc3luYyhzbmFwc2hvdF9mZF8uZ2V0KCkpIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZnN5bmMiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyOjpFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKLSAgICB1aW50NjRfdCBvZmZzZXQgPSBuZXdfYmxvY2tfc3RhcnQgKiBvcHRpb25zXy5ibG9ja19zaXplOwotICAgIGlmIChsc2VlayhzbmFwc2hvdF9mZF8uZ2V0KCksIG9mZnNldCwgU0VFS19TRVQpIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRW1pdFJhd0Jsb2NrcyBsc2VlayB0byBvZmZzZXQgIiA8PCBvZmZzZXQ7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KHNuYXBzaG90X2ZkXywgZGF0YSwgc2l6ZSkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkVtaXRSYXdCbG9ja3Mgd3JpdGUiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyOjpFbWl0WG9yQmxvY2tzKHVpbnQzMl90LCBjb25zdCB2b2lkKiwgc2l6ZV90LCB1aW50MzJfdCwgdWludDE2X3QpIHsKLSAgICBMT0coRVJST1IpIDw8ICJFbWl0WG9yQmxvY2tzIG5vdCBpbXBsZW1lbnRlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBPbmxpbmVLZXJuZWxTbmFwc2hvdFdyaXRlcjo6RW1pdFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCB1aW50NjRfdCBudW1fYmxvY2tzKSB7Ci0gICAgc3RkOjpzdHJpbmcgemVyb2VzKG9wdGlvbnNfLmJsb2NrX3NpemUsIDApOwotICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgaWYgKCFFbWl0UmF3QmxvY2tzKG5ld19ibG9ja19zdGFydCArIGksIHplcm9lcy5kYXRhKCksIHplcm9lcy5zaXplKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgT25saW5lS2VybmVsU25hcHNob3RXcml0ZXI6OkVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbnVtX2Jsb2NrcykgewotICAgIGF1dG8gc291cmNlX2ZkID0gR2V0U291cmNlRmQoKTsKLSAgICBpZiAoc291cmNlX2ZkIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0hFQ0sobnVtX2Jsb2NrcyAhPSAwKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihvcHRpb25zXy5ibG9ja19zaXplLCAwKTsKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0ID0gKG9sZF9ibG9jayArIGkpICogb3B0aW9uc18uYmxvY2tfc2l6ZTsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChzb3VyY2VfZmQsIGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCksIG9mZnNldCkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFbWl0Q29weSByZWFkIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUVtaXRSYXdCbG9ja3MobmV3X2Jsb2NrICsgaSwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFbWl0UmF3QmxvY2tzIGZhaWxlZCI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBPbmxpbmVLZXJuZWxTbmFwc2hvdFdyaXRlcjo6RW1pdExhYmVsKHVpbnQ2NF90KSB7Ci0gICAgLy8gTm90IE5lZWRlZAotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyOjpFbWl0U2VxdWVuY2VEYXRhKHNpemVfdCwgY29uc3QgdWludDMyX3QqKSB7Ci0gICAgLy8gTm90IE5lZWRlZAotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8RmlsZURlc2NyaXB0b3I+IE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyOjpPcGVuUmVhZGVyKCkgewotICAgIHVuaXF1ZV9mZCBmZChkdXAoc25hcHNob3RfZmRfLmdldCgpKSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZHVwMiBmYWlsZWQgaW4gT3BlblJlYWRlciI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSZWFkRmRGaWxlRGVzY3JpcHRvcj4oc3RkOjptb3ZlKGZkKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXJfdGVzdC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3Rfd3JpdGVyX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM2MzJiLi4wMDAwMDAwCi0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXJfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3QuaD4KLQotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3Rfd3JpdGVyLmg+Ci0jaW5jbHVkZSA8cGF5bG9hZF9jb25zdW1lci9maWxlX2Rlc2NyaXB0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQ6OnNuYXBzaG90IHsKLWNsYXNzIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSAgcHVibGljOgotICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IEJMT0NLX1NJWkUgPSA0MDk2OwotfTsKLQotVEVTVF9GKENvbXByZXNzZWRTbmFwc2hvdFdyaXRlclRlc3QsIFJlYWRBZnRlcldyaXRlKSB7Ci0gICAgVGVtcG9yYXJ5RmlsZSBjb3dfZGV2aWNlX2ZpbGV7fTsKLSAgICBhbmRyb2lkOjpzbmFwc2hvdDo6Q293T3B0aW9ucyBvcHRpb25zey5ibG9ja19zaXplID0gQkxPQ0tfU0laRX07Ci0gICAgYW5kcm9pZDo6c25hcHNob3Q6OkNvbXByZXNzZWRTbmFwc2hvdFdyaXRlciBzbmFwc2hvdF93cml0ZXJ7b3B0aW9uc307Ci0gICAgQVNTRVJUX1RSVUUoc25hcHNob3Rfd3JpdGVyLlNldENvd0RldmljZShhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmR7Y293X2RldmljZV9maWxlLmZkfSkpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X3dyaXRlci5Jbml0aWFsaXplKCkpOwotICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGJ1ZmZlcjsKLSAgICBidWZmZXIucmVzaXplKEJMT0NLX1NJWkUpOwotICAgIHN0ZDo6ZmlsbChidWZmZXIuYmVnaW4oKSwgYnVmZmVyLmVuZCgpLCAxMjMpOwotCi0gICAgQVNTRVJUX1RSVUUoc25hcHNob3Rfd3JpdGVyLkFkZFJhd0Jsb2NrcygwLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUoc25hcHNob3Rfd3JpdGVyLkZpbmFsaXplKCkpOwotICAgIGF1dG8gY293X3JlYWRlciA9IHNuYXBzaG90X3dyaXRlci5PcGVuUmVhZGVyKCk7Ci0gICAgQVNTRVJUX05FKGNvd19yZWFkZXIsIG51bGxwdHIpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X3dyaXRlci5BZGRSYXdCbG9ja3MoMSwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X3dyaXRlci5BZGRSYXdCbG9ja3MoMiwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X3dyaXRlci5GaW5hbGl6ZSgpKTsKLSAgICAvLyBBZnRlciB3cmlnaW4gc29tZSBkYXRhLCBpZiB3ZSBjYWxsIE9wZW5SZWFkZXIoKSBhZ2Fpbiwgd3JpdGVzIHNob3VsZAotICAgIC8vIGJlIHZpc2libGUgdG8gdGhlIG5ld2x5IG9wZW5lZCByZWFkZXIuIHVwZGF0ZV9lbmdpbmUgcmVsaWVzIG9uIHRoaXMKLSAgICAvLyBiZWhhdmlvciBmb3IgdmVyaXR5IHdyaXRlcy4KLSAgICBjb3dfcmVhZGVyID0gc25hcHNob3Rfd3JpdGVyLk9wZW5SZWFkZXIoKTsKLSAgICBBU1NFUlRfTkUoY293X3JlYWRlciwgbnVsbHB0cik7Ci0gICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gcmVhZF9iYWNrOwotICAgIHJlYWRfYmFjay5yZXNpemUoYnVmZmVyLnNpemUoKSk7Ci0gICAgY293X3JlYWRlci0+U2VlayhCTE9DS19TSVpFLCBTRUVLX1NFVCk7Ci0gICAgY29uc3QgYXV0byBieXRlc19yZWFkID0gY293X3JlYWRlci0+UmVhZChyZWFkX2JhY2suZGF0YSgpLCByZWFkX2JhY2suc2l6ZSgpKTsKLSAgICBBU1NFUlRfRVEoKHNpemVfdCkoYnl0ZXNfcmVhZCksIEJMT0NLX1NJWkUpOwotICAgIEFTU0VSVF9FUShyZWFkX2JhY2ssIGJ1ZmZlcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjpzbmFwc2hvdApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90Y3RsLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdGN0bC5jcHAKaW5kZXggYWQzZjgzYy4uMDM5NmE1NSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90Y3RsLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3RjdGwuY3BwCkBAIC0xNywxNCArMTcsMjUgQEAKICNpbmNsdWRlIDxzeXNleGl0cy5oPgogCiAjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGZpbGVzeXN0ZW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdXR1cmU+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisKICNpbmNsdWRlIDxmc19tZ3IuaD4KICNpbmNsdWRlIDxmc19tZ3JfZG1fbGluZWFyLmg+CiAjaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KQEAgLTMzLDYgKzQ0LDggQEAKICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9zbmFwc2hvdC5oPgogI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgogCisjaW5jbHVkZSAicGFydGl0aW9uX2Nvd19jcmVhdG9yLmgiCisKICNpZmRlZiBTTkFQU0hPVENUTF9VU0VSREVCVUdfT1JfRU5HCiAjaW5jbHVkZSA8Qm9vdENvbnRyb2xDbGllbnQuaD4KICNlbmRpZgpAQCAtNTYsMTMgKzY5LDIxNSBAQAogICAgICAgICAgICAgICAgICAiICBtZXJnZVxuIgogICAgICAgICAgICAgICAgICAiICAgIERlcHJlY2F0ZWQuXG4iCiAgICAgICAgICAgICAgICAgICIgIG1hcFxuIgotICAgICAgICAgICAgICAgICAiICAgIE1hcCBhbGwgcGFydGl0aW9ucyBhdCAvZGV2L2Jsb2NrL21hcHBlclxuIjsKKyAgICAgICAgICAgICAgICAgIiAgICBNYXAgYWxsIHBhcnRpdGlvbnMgYXQgL2Rldi9ibG9jay9tYXBwZXJcbiIKKyAgICAgICAgICAgICAgICAgIiAgbWFwLXNuYXBzaG90cyA8ZGlyZWN0b3J5IHdoZXJlIHNuYXBzaG90IHBhdGNoZXMgYXJlIHByZXNlbnQ+XG4iCisgICAgICAgICAgICAgICAgICIgICAgTWFwIGFsbCBzbmFwc2hvdHMgYmFzZWQgb24gcGF0Y2hlcyBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnlcbiIKKyAgICAgICAgICAgICAgICAgIiAgdW5tYXAtc25hcHNob3RzXG4iCisgICAgICAgICAgICAgICAgICIgICAgVW5tYXAgYWxsIHByZS1jcmVhdGVkIHNuYXBzaG90c1xuIgorICAgICAgICAgICAgICAgICAiICBkZWxldGUtc25hcHNob3RzXG4iCisgICAgICAgICAgICAgICAgICIgICAgRGVsZXRlIGFsbCBwcmUtY3JlYXRlZCBzbmFwc2hvdHNcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV2ZXJ0LXNuYXBzaG90c1xuIgorICAgICAgICAgICAgICAgICAiICAgIFByZXBhcmVzIGRldmljZXMgdG8gYm9vdCB3aXRob3V0IHNuYXBzaG90cyBvbiBuZXh0IGJvb3QuXG4iCisgICAgICAgICAgICAgICAgICIgICAgVGhpcyBkb2VzIG5vdCBkZWxldGUgdGhlIHNuYXBzaG90LiBJdCBvbmx5IHJlbW92ZXMgdGhlIGluZGljYXRvcnNcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBzbyB0aGF0IGZpcnN0IHN0YWdlIGluaXQgd2lsbCBub3QgbW91bnQgZnJvbSBzbmFwc2hvdHMuXG4iOwogICAgIHJldHVybiBFWF9VU0FHRTsKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAorY2xhc3MgTWFwU25hcHNob3RzIHsKKyAgcHVibGljOgorICAgIE1hcFNuYXBzaG90cyhzdGQ6OnN0cmluZyBwYXRoID0gIiIpOworICAgIGJvb2wgQ3JlYXRlU25hcHNob3REZXZpY2Uoc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBzdGQ6OnN0cmluZyYgcGF0Y2gpOworICAgIGJvb2wgSW5pdGlhdGVUaHJlYWRlZFNuYXBzaG90V3JpdGUoc3RkOjpzdHJpbmcmIHBuYW1lLCBzdGQ6OnN0cmluZyYgc25hcHNob3RfcGF0Y2gpOworICAgIGJvb2wgRmluaXNoU25hcHNob3RXcml0ZXMoKTsKKyAgICBib29sIFVubWFwQ293SW1hZ2VQYXRoKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgICBib29sIERlbGV0ZVNuYXBzaG90cygpOworICAgIGJvb2wgQ2xlYW51cFNuYXBzaG90KCkgeyByZXR1cm4gc21fLT5QcmVwYXJlRGV2aWNlVG9Cb290V2l0aG91dFNuYXBzaG90KCk7IH0KKyAgICBib29sIEJlZ2luVXBkYXRlKCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBHZXRDb3dJbWFnZVBhdGgoc3RkOjpzdHJpbmcmIG5hbWUpOworICAgIGJvb2wgV3JpdGVTbmFwc2hvdFBhdGNoKHN0ZDo6c3RyaW5nIGNvd19kZXZpY2UsIHN0ZDo6c3RyaW5nIHBhdGNoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3RNYW5hZ2VyOjpMb2NrZWRGaWxlPiBsb2NrXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3RNYW5hZ2VyPiBzbV87CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpmdXR1cmU8Ym9vbD4+IHRocmVhZHNfOworICAgIHN0ZDo6c3RyaW5nIHNuYXBzaG90X2Rpcl9wYXRoXzsKK307CisKK01hcFNuYXBzaG90czo6TWFwU25hcHNob3RzKHN0ZDo6c3RyaW5nIHBhdGgpIHsKKyAgICBzbV8gPSBTbmFwc2hvdE1hbmFnZXI6Ok5ldygpOworICAgIGlmICghc21fKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBzbmFwc2hvdG1hbmFnZXIiOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBzbmFwc2hvdF9kaXJfcGF0aF8gPSBwYXRoICsgIi8iOworfQorCitib29sIE1hcFNuYXBzaG90czo6QmVnaW5VcGRhdGUoKSB7CisgICAgbG9ja18gPSBzbV8tPkxvY2tFeGNsdXNpdmUoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc25hcHNob3RzOworICAgIHNtXy0+TGlzdFNuYXBzaG90cyhsb2NrXy5nZXQoKSwgJnNuYXBzaG90cyk7CisgICAgaWYgKCFzbmFwc2hvdHMuZW1wdHkoKSkgeworICAgICAgICAvLyBTbmFwc2hvdHMgYXJlIGFscmVhZHkgcHJlc2VudC4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgbG9ja18gPSBudWxscHRyOworICAgIGlmICghc21fLT5CZWdpblVwZGF0ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkJlZ2luVXBkYXRlIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbG9ja18gPSBzbV8tPkxvY2tFeGNsdXNpdmUoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYXBTbmFwc2hvdHM6OkNyZWF0ZVNuYXBzaG90RGV2aWNlKHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgc3RkOjpzdHJpbmcmIHBhdGNoZmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIHBhcnNpbmdfZmlsZSA9IHNuYXBzaG90X2Rpcl9wYXRoXyArIHBhdGNoZmlsZTsKKworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihwYXJzaW5nX2ZpbGUuY19zdHIoKSwgT19SRE9OTFkpKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IHBhcnNpbmdfZmlsZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ2NF90IGRldl9zeiA9IGxzZWVrKGZkLmdldCgpLCAwLCBTRUVLX0VORCk7CisgICAgaWYgKCFkZXZfc3opIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGRldGVybWluZSBibG9jayBkZXZpY2Ugc2l6ZTogIiA8PCBwYXJzaW5nX2ZpbGU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgYmxvY2tfc3ogPSA0X0tpQjsKKyAgICBkZXZfc3ogKz0gYmxvY2tfc3ogLSAxOworICAgIGRldl9zeiAmPSB+KGJsb2NrX3N6IC0gMSk7CisKKyAgICBTbmFwc2hvdFN0YXR1cyBzdGF0dXM7CisgICAgc3RhdHVzLnNldF9zdGF0ZShTbmFwc2hvdFN0YXRlOjpDUkVBVEVEKTsKKyAgICBzdGF0dXMuc2V0X3VzaW5nX3NuYXB1c2VyZCh0cnVlKTsKKyAgICBzdGF0dXMuc2V0X29sZF9wYXJ0aXRpb25fc2l6ZSgwKTsKKyAgICBzdGF0dXMuc2V0X25hbWUocGFydGl0aW9uX25hbWUpOworICAgIHN0YXR1cy5zZXRfY293X2ZpbGVfc2l6ZShkZXZfc3opOworICAgIHN0YXR1cy5zZXRfY293X3BhcnRpdGlvbl9zaXplKDApOworCisgICAgUGFydGl0aW9uQ293Q3JlYXRvciBjb3dfY3JlYXRvcjsKKyAgICBjb3dfY3JlYXRvci51c2luZ19zbmFwdXNlcmQgPSB0cnVlOworCisgICAgaWYgKCFzbV8tPkNyZWF0ZVNuYXBzaG90KGxvY2tfLmdldCgpLCAmY293X2NyZWF0b3IsICZzdGF0dXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZVNuYXBzaG90IGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXNtXy0+Q3JlYXRlQ293SW1hZ2UobG9ja18uZ2V0KCksIHBhcnRpdGlvbl9uYW1lKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVDb3dJbWFnZSBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IE1hcFNuYXBzaG90czo6R2V0Q293SW1hZ2VQYXRoKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgYXV0byBjb3dfZGV2ID0gc21fLT5NYXBDb3dJbWFnZShuYW1lLCA1cyk7CisgICAgaWYgKCFjb3dfZGV2Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgQ09XIGRldmljZSBwYXRoIjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIkNPVyBEZXZpY2UgcGF0aDogIiA8PCBjb3dfZGV2LnZhbHVlKCk7CisgICAgcmV0dXJuIGNvd19kZXY7Cit9CisKK2Jvb2wgTWFwU25hcHNob3RzOjpXcml0ZVNuYXBzaG90UGF0Y2goc3RkOjpzdHJpbmcgY293X2RldmljZSwgc3RkOjpzdHJpbmcgcGF0Y2gpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRjaF9maWxlID0gc25hcHNob3RfZGlyX3BhdGhfICsgcGF0Y2g7CisKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGF0Y2hfZmlsZS5jX3N0cigpLCBPX1JET05MWSkpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgcGF0Y2hfZmlsZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ2NF90IGRldl9zeiA9IGxzZWVrKGZkLmdldCgpLCAwLCBTRUVLX0VORCk7CisgICAgaWYgKCFkZXZfc3opIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJDb3VsZCBub3QgZGV0ZXJtaW5lIGJsb2NrIGRldmljZSBzaXplOiAiIDw8IHBhdGNoX2ZpbGU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgY2ZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGNvd19kZXZpY2UuY19zdHIoKSwgT19SRFdSKSkpOworICAgIGlmIChjZmQgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgY293X2RldmljZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ2NF90IHJlYWRfc3ogPSAxX01pQjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBidWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4ocmVhZF9zeik7CisgICAgb2ZmX3QgZmlsZV9vZmZzZXQgPSAwOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc2l6ZV90IHRvX3JlYWQgPSBzdGQ6Om1pbigoZGV2X3N6IC0gZmlsZV9vZmZzZXQpLCByZWFkX3N6KTsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChmZC5nZXQoKSwgYnVmZmVyLmdldCgpLCB0b19yZWFkLCBmaWxlX29mZnNldCkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJSZWFkRnVsbHlBdE9mZnNldCBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5QXRPZmZzZXQoY2ZkLCBidWZmZXIuZ2V0KCksIHRvX3JlYWQsIGZpbGVfb2Zmc2V0KSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIldyaXRlRnVsbHlBdE9mZnNldCBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbGVfb2Zmc2V0ICs9IHRvX3JlYWQ7CisgICAgICAgIGlmIChmaWxlX29mZnNldCA+PSBkZXZfc3opIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZzeW5jKGNmZC5nZXQoKSkgPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRnN5bmMgZmFpbGVkIGF0IG9mZnNldDogIiA8PCBmaWxlX29mZnNldCA8PCAiIHNpemU6ICIgPDwgdG9fcmVhZDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYXBTbmFwc2hvdHM6OkluaXRpYXRlVGhyZWFkZWRTbmFwc2hvdFdyaXRlKHN0ZDo6c3RyaW5nJiBwbmFtZSwgc3RkOjpzdHJpbmcmIHNuYXBzaG90X3BhdGNoKSB7CisgICAgYXV0byBwYXRoID0gR2V0Q293SW1hZ2VQYXRoKHBuYW1lKTsKKyAgICBpZiAoIXBhdGguaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB0aHJlYWRzXy5lbXBsYWNlX2JhY2soc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZNYXBTbmFwc2hvdHM6OldyaXRlU25hcHNob3RQYXRjaCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnZhbHVlKCksIHNuYXBzaG90X3BhdGNoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFwU25hcHNob3RzOjpGaW5pc2hTbmFwc2hvdFdyaXRlcygpIHsKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgZm9yIChhdXRvJiB0IDogdGhyZWFkc18pIHsKKyAgICAgICAgcmV0ID0gdC5nZXQoKSAmJiByZXQ7CisgICAgfQorCisgICAgbG9ja18gPSBudWxscHRyOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJQcmUtY3JlYXRlZCBzbmFwc2hvdHMgc3VjY2Vzc2Z1bGx5IGNvcGllZCI7CisgICAgICAgIGlmICghc21fLT5GaW5pc2hlZFNuYXBzaG90V3JpdGVzKGZhbHNlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzbV8tPkJvb3RGcm9tU25hcHNob3RzV2l0aG91dFNsb3RTd2l0Y2goKTsKKyAgICB9CisKKyAgICBMT0coRVJST1IpIDw8ICJTbmFwc2hvdCBjb3B5IGZhaWxlZCI7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1hcFNuYXBzaG90czo6VW5tYXBDb3dJbWFnZVBhdGgoc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gc21fLT5Vbm1hcENvd0ltYWdlKG5hbWUpOworfQorCitib29sIE1hcFNuYXBzaG90czo6RGVsZXRlU25hcHNob3RzKCkgeworICAgIGxvY2tfID0gc21fLT5Mb2NrRXhjbHVzaXZlKCk7CisgICAgaWYgKCFzbV8tPlJlbW92ZUFsbFVwZGF0ZVN0YXRlKGxvY2tfLmdldCgpKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJSZW1vdmUgQWxsIFVwZGF0ZSBTdGF0ZSBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBib29sIER1bXBDbWRIYW5kbGVyKGludCAvKmFyZ2MqLywgY2hhcioqIGFyZ3YpIHsKICAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCAmYW5kcm9pZDo6YmFzZTo6U3RkZXJyTG9nZ2VyKTsKICAgICByZXR1cm4gU25hcHNob3RNYW5hZ2VyOjpOZXcoKS0+RHVtcChzdGQ6OmNvdXQpOwpAQCAtODUsNiArMzAwLDEzNCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBHZXRWZXJpdHlQYXJ0aXRpb25zKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGFydGl0aW9ucykgeworICAgIGF1dG8mIGRtID0gYW5kcm9pZDo6ZG06OkRldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBhdXRvIGRtX2Jsb2NrX2RldmljZXMgPSBkbS5GaW5kRG1QYXJ0aXRpb25zKCk7CisgICAgaWYgKGRtX2Jsb2NrX2RldmljZXMuZW1wdHkoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBkbS1lbmFibGVkIGJsb2NrIGRldmljZSBpcyBmb3VuZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBibG9ja19kZXZpY2UgOiBkbV9ibG9ja19kZXZpY2VzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRtX2Jsb2NrX25hbWUgPSBibG9ja19kZXZpY2UuZmlyc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNsb3Rfc3VmZml4ID0gZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpOworICAgICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb24gPSBkbV9ibG9ja19uYW1lICsgc2xvdF9zdWZmaXg7CisgICAgICAgIHBhcnRpdGlvbnMucHVzaF9iYWNrKHBhcnRpdGlvbik7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFVuTWFwUHJlY3JlYXRlZFNuYXBzaG90cyhpbnQsIGNoYXIqKiBhcmd2KSB7CisgICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgJmFuZHJvaWQ6OmJhc2U6Oktlcm5lbExvZ2dlcik7CisgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSByb290LgorICAgIGlmICg6OmdldHVpZCgpICE9IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm90IHJ1bm5pbmcgYXMgcm9vdC4gVHJ5IFwiYWRiIHJvb3RcIiBmaXJzdC4iOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXJ0aXRpb25zOworICAgIGlmICghR2V0VmVyaXR5UGFydGl0aW9ucyhwYXJ0aXRpb25zKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTWFwU25hcHNob3RzIHNuYXBzaG90OworICAgIGZvciAoYXV0byBwYXJ0aXRpb24gOiBwYXJ0aXRpb25zKSB7CisgICAgICAgIGlmICghc25hcHNob3QuVW5tYXBDb3dJbWFnZVBhdGgocGFydGl0aW9uKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5tYXBDb3dJbWFnZVBhdGggZmFpbGVkOiAiIDw8IHBhcnRpdGlvbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZW1vdmVQcmVjcmVhdGVkU25hcHNob3RzKGludCwgY2hhcioqIGFyZ3YpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCAmYW5kcm9pZDo6YmFzZTo6S2VybmVsTG9nZ2VyKTsKKyAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHJvb3QuCisgICAgaWYgKDo6Z2V0dWlkKCkgIT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJOb3QgcnVubmluZyBhcyByb290LiBUcnkgXCJhZGIgcm9vdFwiIGZpcnN0LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBNYXBTbmFwc2hvdHMgc25hcHNob3Q7CisgICAgaWYgKCFzbmFwc2hvdC5DbGVhbnVwU25hcHNob3QoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDbGVhbnVwU25hcHNob3QgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZWxldGVQcmVjcmVhdGVkU25hcHNob3RzKGludCwgY2hhcioqIGFyZ3YpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCAmYW5kcm9pZDo6YmFzZTo6S2VybmVsTG9nZ2VyKTsKKyAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHJvb3QuCisgICAgaWYgKDo6Z2V0dWlkKCkgIT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJOb3QgcnVubmluZyBhcyByb290LiBUcnkgXCJhZGIgcm9vdFwiIGZpcnN0LiI7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgTWFwU25hcHNob3RzIHNuYXBzaG90OworICAgIHJldHVybiBzbmFwc2hvdC5EZWxldGVTbmFwc2hvdHMoKTsKK30KKworYm9vbCBNYXBQcmVjcmVhdGVkU25hcHNob3RzKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsICZhbmRyb2lkOjpiYXNlOjpLZXJuZWxMb2dnZXIpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSByb290LgorICAgIGlmICg6OmdldHVpZCgpICE9IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm90IHJ1bm5pbmcgYXMgcm9vdC4gVHJ5IFwiYWRiIHJvb3RcIiBmaXJzdC4iOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChhcmdjIDwgMykgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIiBtYXAtc25hcHNob3RzIDxkaXJlY3RvcnkgbG9jYXRpb24gd2hlcmUgc25hcHNob3QgcGF0Y2hlcyBhcmUgcHJlc2VudD4iCisgICAgICAgICAgICAgICAgICAgICAiICAgIE1hcCBhbGwgc25hcHNob3RzIGJhc2VkIG9uIHBhdGNoZXMgcHJlc2VudCBpbiB0aGUgZGlyZWN0b3J5XG4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IHN0ZDo6c3RyaW5nKGFyZ3ZbMl0pOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRjaGZpbGVzOworCisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHN0ZDo6ZmlsZXN5c3RlbTo6ZGlyZWN0b3J5X2l0ZXJhdG9yKHBhdGgpKSB7CisgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChlbnRyeS5wYXRoKCkuZ2VuZXJpY19zdHJpbmcoKSwgIi5wYXRjaCIpKSB7CisgICAgICAgICAgICBwYXRjaGZpbGVzLnB1c2hfYmFjayhhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShlbnRyeS5wYXRoKCkuZ2VuZXJpY19zdHJpbmcoKSkpOworICAgICAgICB9CisgICAgfQorICAgIGF1dG8mIGRtID0gYW5kcm9pZDo6ZG06OkRldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBhdXRvIGRtX2Jsb2NrX2RldmljZXMgPSBkbS5GaW5kRG1QYXJ0aXRpb25zKCk7CisgICAgaWYgKGRtX2Jsb2NrX2RldmljZXMuZW1wdHkoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBkbS1lbmFibGVkIGJsb2NrIGRldmljZSBpcyBmb3VuZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHBhcnRpdGlvbnM7CisgICAgZm9yIChhdXRvJiBwYXRjaGZpbGUgOiBwYXRjaGZpbGVzKSB7CisgICAgICAgIGF1dG8gbnBvcyA9IHBhdGNoZmlsZS5yZmluZCgiLnBhdGNoIik7CisgICAgICAgIGF1dG8gZG1fYmxvY2tfbmFtZSA9IHBhdGNoZmlsZS5zdWJzdHIoMCwgbnBvcyk7CisgICAgICAgIGlmIChkbV9ibG9ja19kZXZpY2VzLmZpbmQoZG1fYmxvY2tfbmFtZSkgIT0gZG1fYmxvY2tfZGV2aWNlcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2xvdF9zdWZmaXggPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb24gPSBkbV9ibG9ja19uYW1lICsgc2xvdF9zdWZmaXg7CisgICAgICAgICAgICBwYXJ0aXRpb25zLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihwYXJ0aXRpb24sIHBhdGNoZmlsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgTWFwU25hcHNob3RzIGNvdyhwYXRoKTsKKyAgICBpZiAoIWNvdy5CZWdpblVwZGF0ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkJlZ2luVXBkYXRlIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIHBhaXIgOiBwYXJ0aXRpb25zKSB7CisgICAgICAgIGlmICghY293LkNyZWF0ZVNuYXBzaG90RGV2aWNlKHBhaXIuZmlyc3QsIHBhaXIuc2Vjb25kKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ3JlYXRlU25hcHNob3REZXZpY2UgZmFpbGVkIGZvcjogIiA8PCBwYWlyLmZpcnN0OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghY293LkluaXRpYXRlVGhyZWFkZWRTbmFwc2hvdFdyaXRlKHBhaXIuZmlyc3QsIHBhaXIuc2Vjb25kKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW5pdGlhdGVUaHJlYWRlZFNuYXBzaG90V3JpdGUgZmFpbGVkIGZvcjogIiA8PCBwYWlyLmZpcnN0OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvdy5GaW5pc2hTbmFwc2hvdFdyaXRlcygpOworfQorCiAjaWZkZWYgU05BUFNIT1RDVExfVVNFUkRFQlVHX09SX0VORwogYm9vbCBDcmVhdGVUZXN0VXBkYXRlKFNuYXBzaG90TWFuYWdlciogc20pIHsKICAgICBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpEZWx0YUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdDsKQEAgLTEzMywyMyArNDc2LDE4IEBACiAKICAgICAvLyBXcml0ZSB0aGUgIm5ldyIgc3lzdGVtIHBhcnRpdGlvbi4KICAgICBhdXRvIHN5c3RlbV90YXJnZXRfbmFtZSA9ICJzeXN0ZW0iICsgdGFyZ2V0X3Nsb3Q7Ci0gICAgYXV0byBzb3VyY2VfZGV2aWNlID0gIi9kZXYvYmxvY2svbWFwcGVyLyIgKyBzeXN0ZW1fc291cmNlX25hbWU7CiAgICAgQ3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyBjbHBwID0gewogICAgICAgICAgICAgLmJsb2NrX2RldmljZSA9IGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUodGFyZ2V0X3Nsb3RfbnVtYmVyKSwKICAgICAgICAgICAgIC5tZXRhZGF0YV9zbG90ID0ge3RhcmdldF9zbG90X251bWJlcn0sCiAgICAgICAgICAgICAucGFydGl0aW9uX25hbWUgPSBzeXN0ZW1fdGFyZ2V0X25hbWUsCi0gICAgICAgICAgICAucGFydGl0aW9uX29wZW5lciA9ICZvcGVuZXIsCiAgICAgICAgICAgICAudGltZW91dF9tcyA9IDEwcywKKyAgICAgICAgICAgIC5wYXJ0aXRpb25fb3BlbmVyID0gJm9wZW5lciwKICAgICB9OwotICAgIGF1dG8gd3JpdGVyID0gc20tPk9wZW5TbmFwc2hvdFdyaXRlcihjbHBwLCB7c291cmNlX2RldmljZX0pOworICAgIGF1dG8gd3JpdGVyID0gc20tPk9wZW5TbmFwc2hvdFdyaXRlcihjbHBwLCBzdGQ6Om51bGxvcHQpOwogICAgIGlmICghd3JpdGVyKSB7CiAgICAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IG9wZW4gc25hcHNob3Qgd3JpdGVyLlxuIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIXdyaXRlci0+SW5pdGlhbGl6ZSgpKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IGluaXRpYWxpemUgc25hcHNob3QgZm9yIHdyaXRpbmcuXG4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogCiAgICAgZm9yICh1aW50NjRfdCBibG9jayA9IDA7IGJsb2NrIDwgc3lzdGVtX3NvdXJjZV9zaXplIC8gNDA5NjsgYmxvY2srKykgewogICAgICAgICBpZiAoIXdyaXRlci0+QWRkQ29weShibG9jaywgYmxvY2spKSB7CkBAIC0yMTYsNiArNTU0LDEwIEBACiAgICAgICAgIHsidGVzdC1ibGFuay1vdGEiLCBUZXN0T3RhSGFuZGxlcn0sCiAjZW5kaWYKICAgICAgICAgeyJ1bm1hcCIsIFVubWFwQ21kSGFuZGxlcn0sCisgICAgICAgIHsibWFwLXNuYXBzaG90cyIsIE1hcFByZWNyZWF0ZWRTbmFwc2hvdHN9LAorICAgICAgICB7InVubWFwLXNuYXBzaG90cyIsIFVuTWFwUHJlY3JlYXRlZFNuYXBzaG90c30sCisgICAgICAgIHsiZGVsZXRlLXNuYXBzaG90cyIsIERlbGV0ZVByZWNyZWF0ZWRTbmFwc2hvdHN9LAorICAgICAgICB7InJldmVydC1zbmFwc2hvdHMiLCBSZW1vdmVQcmVjcmVhdGVkU25hcHNob3RzfSwKICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiB9OwogCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL0FuZHJvaWQuYnAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL0FuZHJvaWQuYnAKaW5kZXggOTI2MTQ4Mi4uYmQyOTZhMyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9BbmRyb2lkLmJwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvQW5kcm9pZC5icApAQCAtMTksNyArMTksNyBAQAogfQogCiBjY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImxpYnNuYXBzaG90X3NuYXB1c2VyZF9kZWZhdWx0cyIsCisgICAgbmFtZTogImxpYnNuYXB1c2VyZF9jbGllbnRfZGVmYXVsdHMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJmc19tZ3JfZGVmYXVsdHMiLAogICAgIF0sCkBAIC0zMywxNSArMzMsMTUgQEAKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzbmFwc2hvdF9zbmFwdXNlcmQiLAorICAgIG5hbWU6ICJsaWJzbmFwdXNlcmRfY2xpZW50IiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAiZnNfbWdyX2RlZmF1bHRzIiwKLSAgICAgICAgImxpYnNuYXBzaG90X3NuYXB1c2VyZF9kZWZhdWx0cyIsCisgICAgICAgICJsaWJzbmFwdXNlcmRfY2xpZW50X2RlZmF1bHRzIiwKICAgICBdLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliY3V0aWxzX3NvY2tldHMiLAotICAgICAgICAibGliZnNfbWdyIiwKKyAgICAgICAgImxpYmZzX21ncl9maWxlX3dhaXQiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLApAQCAtNTcsMzIgKzU3LDUwIEBACiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImZzX21ncl9kZWZhdWx0cyIsCiAgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZS8iXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJkbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmQuY3BwIiwKLSAgICAgICAgImRtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF93b3JrZXIuY3BwIiwKICAgICAgICAgImRtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuY3BwIiwKKyAgICAgICAgImRtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF93b3JrZXIuY3BwIiwKKyAgICAgICAgImRtX3VzZXJfYmxvY2tfc2VydmVyLmNwcCIsCiAgICAgICAgICJzbmFwdXNlcmRfYnVmZmVyLmNwcCIsCisgICAgICAgICJ1c2VyLXNwYWNlLW1lcmdlL2hhbmRsZXJfbWFuYWdlci5jcHAiLAorICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9tZXJnZV93b3JrZXIuY3BwIiwKKyAgICAgICAgInVzZXItc3BhY2UtbWVyZ2UvcmVhZF93b3JrZXIuY3BwIiwKICAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2NvcmUuY3BwIiwKLSAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2RtX3VzZXIuY3BwIiwKLSAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX21lcmdlLmNwcCIsCiAgICAgICAgICJ1c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuY3BwIiwKICAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3RyYW5zaXRpb25zLmNwcCIsCiAgICAgICAgICJ1c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF92ZXJpZnkuY3BwIiwKKyAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvd29ya2VyLmNwcCIsCisgICAgICAgICJ1dGlsaXR5LmNwcCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJkbSIsCisgICAgICAgICJsaWJleHQyX3V1aWQiLAogICAgICAgICAibGliZXh0NF91dGlscyIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3ciLAogICAgICAgICAibGlidXJpbmciLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgICAgICAibGliY2dyb3VwcmMiLAorICAgICAgICAibGliY2dyb3VwcmNfZm9ybWF0IiwKICAgICBdLAogICAgIGluY2x1ZGVfZGlyczogWyJiaW9uaWMvbGliYy9rZXJuZWwiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY3V0aWxzX2hlYWRlcnMiLAogICAgICAgICAibGlic3RvcmFnZV9saXRlcmFsc19oZWFkZXJzIiwKICAgICBdLAogICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZlbmRvcl9yYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiB9CiAKIGNjX2RlZmF1bHRzIHsKQEAgLTk2LDI0ICsxMTQsMzcgQEAKICAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5jcHAiLAogICAgIF0sCiAKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJyb3RsaSIsCiAgICAgICAgICJsaWJjdXRpbHNfc29ja2V0cyIsCiAgICAgICAgICJsaWJkbSIsCi0gICAgICAgICJsaWJmc19tZ3IiLAorICAgICAgICAibGliZXh0Ml91dWlkIiwKKyAgICAgICAgImxpYmZzX21ncl9maWxlX3dhaXQiLAogICAgICAgICAibGliZ2ZsYWdzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3ciLAotICAgICAgICAibGlic25hcHNob3Rfc25hcHVzZXJkIiwKICAgICAgICAgImxpYnNuYXB1c2VyZCIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlianNvbmNwcCIsCisgICAgICAgICJsaWJjZ3JvdXByYyIsCisgICAgICAgICJsaWJjZ3JvdXByY19mb3JtYXQiLAorICAgICAgICAibGlic25hcHVzZXJkX2NsaWVudCIsCiAgICAgICAgICJsaWJ6IiwKICAgICAgICAgImxpYmx6NCIsCiAgICAgICAgICJsaWJleHQ0X3V0aWxzIiwKICAgICAgICAgImxpYnVyaW5nIiwKKyAgICAgICAgImxpYnpzdGQiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY3V0aWxzX2hlYWRlcnMiLAogICAgICAgICAibGlic3RvcmFnZV9saXRlcmFsc19oZWFkZXJzIiwKICAgICBdLAogCkBAIC0xMjYsMTIgKzE1Nyw2IEBACiAgICAgLy8gc25hcHVzZXJkLCB3aGljaCB3b3VsZCBsZWFkIHRvIGRlYWRsb2NrIGlmIHdlIGhhZCB0byBoYW5kbGUgcGFnZQogICAgIC8vIGZhdWx0cyBmb3IgaXRzIGNvZGUgcGFnZXMuCiAgICAgc3RhdGljX2V4ZWN1dGFibGU6IHRydWUsCi0KLSAgICAvLyBTbmFwdXNlcmQgc2VnZmF1bHRzIHdpdGggVGhpbkxUTwotICAgIC8vIGh0dHA6Ly9iLzIwODU2NTcxNwotICAgIGx0bzogewotICAgICAgICAgbmV2ZXI6IHRydWUsCi0gICAgfSwKIH0KIAogY2NfYmluYXJ5IHsKQEAgLTE0MCw2ICsxNjUsOSBAQAogICAgIGluaXRfcmM6IFsKICAgICAgICAgInNuYXB1c2VyZC5yYyIsCiAgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic25hcHVzZXJkX2NsaWVudCIsCisgICAgXSwKICAgICByYW1kaXNrX2F2YWlsYWJsZTogZmFsc2UsCiAgICAgdmVuZG9yX3JhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogfQpAQCAtMTYzLDcgKzE5MSw3IEBACiB9CiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJjb3dfc25hcHVzZXJkX3Rlc3QiLAorICAgIG5hbWU6ICJzbmFwdXNlcmRfdGVzdF9sZWdhY3kiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJmc19tZ3JfZGVmYXVsdHMiLAogICAgICAgICAibGlic25hcHNob3RfY293X2RlZmF1bHRzIiwKQEAgLTE4MiwxMiArMjEwLDEzIEBACiAgICAgICAgICJsaWJicm90bGkiLAogICAgICAgICAibGliZ3Rlc3QiLAogICAgICAgICAibGlic25hcHNob3RfY293IiwKLSAgICAgICAgImxpYnNuYXBzaG90X3NuYXB1c2VyZCIsCisgICAgICAgICJsaWJzbmFwdXNlcmRfY2xpZW50IiwKICAgICAgICAgImxpYmN1dGlsc19zb2NrZXRzIiwKICAgICAgICAgImxpYnoiLAotICAgICAgICAibGliZnNfbWdyIiwKICAgICAgICAgImxpYmRtIiwKKyAgICAgICAgImxpYmV4dDJfdXVpZCIsCiAgICAgICAgICJsaWJleHQ0X3V0aWxzIiwKKyAgICAgICAgImxpYmZzX21ncl9maWxlX3dhaXQiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYnN0b3JhZ2VfbGl0ZXJhbHNfaGVhZGVycyIsCkBAIC0yMDAsNDAgKzIyOSwxMjYgQEAKICAgICByZXF1aXJlX3Jvb3Q6IGZhbHNlLAogfQogCi1jY190ZXN0IHsKLSAgICBuYW1lOiAic25hcHVzZXJkX3Rlc3QiLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJzbmFwdXNlcmRfdGVzdF9kZWZhdWx0cyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImZzX21ncl9kZWZhdWx0cyIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3dfZGVmYXVsdHMiLAogICAgIF0sCiAgICAgc3JjczogWworICAgICAgICAidGVzdGluZy9kbV91c2VyX2hhcm5lc3MuY3BwIiwKKyAgICAgICAgInRlc3RpbmcvaGFybmVzcy5jcHAiLAorICAgICAgICAidGVzdGluZy9ob3N0X2hhcm5lc3MuY3BwIiwKICAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3Rlc3QuY3BwIiwKICAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURfRklMRV9PRkZTRVRfQklUUz02NCIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliYnJvdGxpIiwKKyAgICAgICAgImxpYmN1dGlsc19zb2NrZXRzIiwKKyAgICAgICAgImxpYmRtIiwKKyAgICAgICAgImxpYmV4dDJfdXVpZCIsCisgICAgICAgICJsaWJleHQ0X3V0aWxzIiwKKyAgICAgICAgImxpYmZzX21ncl9maWxlX3dhaXQiLAorICAgICAgICAibGliZ2ZsYWdzIiwKICAgICAgICAgImxpYmd0ZXN0IiwKICAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCi0gICAgICAgICJsaWJzbmFwc2hvdF9zbmFwdXNlcmQiLAotICAgICAgICAibGliY3V0aWxzX3NvY2tldHMiLAotICAgICAgICAibGlieiIsCi0gICAgICAgICJsaWJmc19tZ3IiLAotICAgICAgICAibGliZG0iLAotICAgICAgICAibGliZXh0NF91dGlscyIsCisgICAgICAgICJsaWJzbmFwdXNlcmQiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgICAgICAibGliY2dyb3VwcmMiLAorICAgICAgICAibGliY2dyb3VwcmNfZm9ybWF0IiwKICAgICAgICAgImxpYnVyaW5nIiwKLSAgICAgICAgImxpYmdmbGFncyIsCisgICAgICAgICJsaWJ6IiwKICAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWyJiaW9uaWMvbGliYy9rZXJuZWwiXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImJpb25pYy9saWJjL2tlcm5lbCIsCisgICAgICAgICIuIiwKKyAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdG9yYWdlX2xpdGVyYWxzX2hlYWRlcnMiLAogICAgICAgICAibGliZmllbWFwX2hlYWRlcnMiLAorICAgICAgICAibGliY3V0aWxzX2hlYWRlcnMiLAogICAgIF0sCiAgICAgdGVzdF9vcHRpb25zOiB7CiAgICAgICAgIG1pbl9zaGlwcGluZ19hcGlfbGV2ZWw6IDMwLAogICAgIH0sCiAgICAgYXV0b19nZW5fY29uZmlnOiB0cnVlLAotICAgIHJlcXVpcmVfcm9vdDogZmFsc2UsCisgICAgcmVxdWlyZV9yb290OiB0cnVlLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJzbmFwdXNlcmRfdGVzdCIsCisgICAgZGVmYXVsdHM6IFsic25hcHVzZXJkX3Rlc3RfZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZGV2aWNlLXRlc3RzIiwKKyAgICBdLAorfQorCisvLyB2dHMgdGVzdHMgY2Fubm90IGJlIGhvc3Rfc3VwcG9ydGVkLgorY2NfdGVzdCB7CisgICAgbmFtZTogInZ0c19zbmFwdXNlcmRfdGVzdCIsCisgICAgZGVmYXVsdHM6IFsic25hcHVzZXJkX3Rlc3RfZGVmYXVsdHMiXSwKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAidnRzIiwKKyAgICBdLAorfQorCitjY19iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogInNuYXB1c2VyZF9leHRyYWN0b3IiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJmc19tZ3JfZGVmYXVsdHMiLAorICAgICAgICAibGlic25hcHNob3RfY293X2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RpbmcvZG1fdXNlcl9oYXJuZXNzLmNwcCIsCisgICAgICAgICJ0ZXN0aW5nL2hhcm5lc3MuY3BwIiwKKyAgICAgICAgInRlc3RpbmcvaG9zdF9oYXJuZXNzLmNwcCIsCisgICAgICAgICJ1c2VyLXNwYWNlLW1lcmdlL2V4dHJhY3Rvci5jcHAiLAorICAgICAgICAic25hcHVzZXJkX2V4dHJhY3Rvci5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJicm90bGkiLAorICAgICAgICAibGliY3V0aWxzX3NvY2tldHMiLAorICAgICAgICAibGliZG0iLAorICAgICAgICAibGliZXh0Ml91dWlkIiwKKyAgICAgICAgImxpYmV4dDRfdXRpbHMiLAorICAgICAgICAibGliZnNfbWdyX2ZpbGVfd2FpdCIsCisgICAgICAgICJsaWJnZmxhZ3MiLAorICAgICAgICAibGlic25hcHNob3RfY293IiwKKyAgICAgICAgImxpYnNuYXB1c2VyZCIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlianNvbmNwcCIsCisgICAgICAgICJsaWJjZ3JvdXByYyIsCisgICAgICAgICJsaWJjZ3JvdXByY19mb3JtYXQiLAorICAgICAgICAibGlidXJpbmciLAorICAgICAgICAibGlieiIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImJpb25pYy9saWJjL2tlcm5lbCIsCisgICAgICAgICIuIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdG9yYWdlX2xpdGVyYWxzX2hlYWRlcnMiLAorICAgICAgICAibGliZmllbWFwX2hlYWRlcnMiLAorICAgICAgICAibGliY3V0aWxzX2hlYWRlcnMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL2Nvd19zbmFwdXNlcmRfdGVzdC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL2Nvd19zbmFwdXNlcmRfdGVzdC5jcHAKaW5kZXggM2M0YWIyZS4uNzM3YzQ4MCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9jb3dfc25hcHVzZXJkX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2UvY293X3NuYXB1c2VyZF90ZXN0LmNwcApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgdm9pZCBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKICAgICB2b2lkIFN0YXJ0TWVyZ2UoKTsKIAorICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOwogICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlKCk7CiAgICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzKCk7CiAgICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzSW52ZXJ0ZWQoKTsKQEAgLTE2NCw2ICsxNjUsNyBAQAogCiAgIHByaXZhdGU6CiAgICAgdm9pZCBJbml0TWV0YWRhdGEoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKICAgICB2b2lkIENyZWF0ZUNvd0RldmljZSgpOwogICAgIHZvaWQgQ3JlYXRlQ293UGFydGlhbEZpbGxlZEFyZWEoKTsKIApAQCAtMjU4LDYgKzI2MCwxOSBAQAogICAgIH0KIH0KIAorc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IENvd1NuYXB1c2VyZFRlc3Q6OkNyZWF0ZUNvd0RldmljZUludGVybmFsKCkgeworICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CisgICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOworCisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOworCisgICAgdW5pcXVlX2ZkIGZkKGNvd19zeXN0ZW1fLT5mZCk7CisgICAgY293X3N5c3RlbV8tPmZkID0gLTE7CisKKyAgICByZXR1cm4gQ3JlYXRlQ293V3JpdGVyKGtEZWZhdWx0Q293VmVyc2lvbiwgb3B0aW9ucywgc3RkOjptb3ZlKGZkKSk7Cit9CisKIHZvaWQgQ293U25hcHVzZXJkVGVzdDo6UmVhZExhc3RCbG9jaygpIHsKICAgICB1bmlxdWVfZmQgcm5kX2ZkOwogICAgIHRvdGFsX2Jhc2Vfc2l6ZV8gPSBCTE9DS19TWiAqIDI7CkBAIC0yODAsOSArMjk1LDYgQEAKICAgICBiYXNlX2xvb3BfID0gc3RkOjptYWtlX3VuaXF1ZTxMb29wRGV2aWNlPihiYXNlX2ZkXywgMTBzKTsKICAgICBBU1NFUlRfVFJVRShiYXNlX2xvb3BfLT52YWxpZCgpKTsKIAotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOwotCiAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcmFuZG9tX2J1ZmZlcl8xXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPih0b3RhbF9iYXNlX3NpemVfKTsKICAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKIApAQCAtMjk0LDE2ICszMDYsMTMgQEAKICAgICAgICAgb2Zmc2V0ICs9IEJMT0NLX1NaOwogICAgIH0KIAotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKIAotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd19zeXN0ZW1fLT5mZCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDAsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIEJMT0NLX1NaKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoMSwgKGNoYXIqKXJhbmRvbV9idWZmZXJfMV8uZ2V0KCkgKyBCTE9DS19TWiwgQkxPQ0tfU1opKTsKIAotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMCwgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgQkxPQ0tfU1opKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDEsIChjaGFyKilyYW5kb21fYnVmZmVyXzFfLmdldCgpICsgQkxPQ0tfU1osIEJMT0NLX1NaKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKIAogICAgIFNldERldmljZUNvbnRyb2xOYW1lKCk7CiAKQEAgLTM4MSwyMiArMzkwLDE2IEBACiB9CiAKIHZvaWQgQ293U25hcHVzZXJkVGVzdDo6Q3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzIoKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOwogCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7CisgICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIHdyaXRlci0+R2V0QmxvY2tTaXplKCk7CiAgICAgc2l6ZV90IHggPSBudW1fYmxvY2tzOwogICAgIHNpemVfdCBibGtfc3JjX2NvcHkgPSAwOwogCiAgICAgLy8gQ3JlYXRlIG92ZXJsYXBwaW5nIGNvcHkgb3BlcmF0aW9ucwogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KGJsa19zcmNfY29weSwgYmxrX3NyY19jb3B5ICsgMSkpOworICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoYmxrX3NyY19jb3B5LCBibGtfc3JjX2NvcHkgKyAxKSk7CiAgICAgICAgIHggLT0gMTsKICAgICAgICAgaWYgKHggPT0gMSkgewogICAgICAgICAgICAgYnJlYWs7CkBAIC00MDUsNyArNDA4LDcgQEAKICAgICB9CiAKICAgICAvLyBGbHVzaCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CiAKICAgICAvLyBDb25zdHJ1Y3QgdGhlIGJ1ZmZlciByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbgogICAgIG9yaWdfYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPih0b3RhbF9iYXNlX3NpemVfKTsKQEAgLTQzMywyMiArNDM2LDE2IEBACiB9CiAKIHZvaWQgQ293U25hcHVzZXJkVGVzdDo6Q3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzEoKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOwogCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7CisgICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIHdyaXRlci0+R2V0QmxvY2tTaXplKCk7CiAgICAgc2l6ZV90IHggPSBudW1fYmxvY2tzOwogICAgIHNpemVfdCBibGtfc3JjX2NvcHkgPSBudW1fYmxvY2tzIC0gMTsKIAogICAgIC8vIENyZWF0ZSBvdmVybGFwcGluZyBjb3B5IG9wZXJhdGlvbnMKICAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShibGtfc3JjX2NvcHkgKyAxLCBibGtfc3JjX2NvcHkpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KGJsa19zcmNfY29weSArIDEsIGJsa19zcmNfY29weSkpOwogICAgICAgICB4IC09IDE7CiAgICAgICAgIGlmICh4ID09IDApIHsKICAgICAgICAgICAgIEFTU0VSVF9FUShibGtfc3JjX2NvcHksIDApOwpAQCAtNDU4LDcgKzQ1NSw3IEBACiAgICAgfQogCiAgICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwogCiAgICAgLy8gQ29uc3RydWN0IHRoZSBidWZmZXIgcmVxdWlyZWQgZm9yIHZhbGlkYXRpb24KICAgICBvcmlnX2J1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7CkBAIC00NjgsMTAgKzQ2NSwxMSBAQAogICAgICAgICAgICAgICB0cnVlKTsKIAogICAgIC8vIE1lcmdlZCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIG9wdGlvbnMuYmxvY2tfc2l6ZSwgMCksCisgICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHdyaXRlci0+R2V0QmxvY2tTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAogICAgICAgICAgICAgICB0cnVlKTsKICAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoCi0gICAgICAgICAgICAgICAgICAgICAgYmFzZV9mZF8sIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBvcHRpb25zLmJsb2NrX3NpemUsIHNpemVfLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlX2ZkXywgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIHdyaXRlci0+R2V0QmxvY2tTaXplKCksIHNpemVfLCAwKSwKICAgICAgICAgICAgICAgdHJ1ZSk7CiB9CiAKQEAgLTQ3OSw4ICs0NzcsOCBAQAogICAgIHVuaXF1ZV9mZCBybmRfZmQ7CiAgICAgbG9mZl90IG9mZnNldCA9IDA7CiAKLSAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGNvd19zeXN0ZW1fID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wb3JhcnlGaWxlPihwYXRoKTsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd0RldmljZUludGVybmFsKCk7CisgICAgQVNTRVJUX05FKHdyaXRlciwgbnVsbHB0cik7CiAKICAgICBybmRfZmQucmVzZXQob3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSkpOwogICAgIEFTU0VSVF9UUlVFKHJuZF9mZCA+IDApOwpAQCAtNDk1LDEzICs0OTMsNyBAQAogICAgICAgICBvZmZzZXQgKz0gMV9NaUI7CiAgICAgfQogCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7CisgICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIHdyaXRlci0+R2V0QmxvY2tTaXplKCk7CiAgICAgc2l6ZV90IGJsa19lbmRfY29weSA9IG51bV9ibG9ja3MgKiAzOwogICAgIHNpemVfdCBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrcyAtIDE7CiAgICAgc2l6ZV90IGJsa19zcmNfY29weSA9IGJsa19lbmRfY29weSAtIDE7CkBAIC01MDksNyArNTAxLDcgQEAKIAogICAgIHNpemVfdCB4ID0gbnVtX2Jsb2NrczsKICAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KHNvdXJjZV9ibGssIGJsa19zcmNfY29weSkpOwogICAgICAgICB4IC09IDE7CiAgICAgICAgIGlmICh4ID09IDApIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTE5LDEyICs1MTEsMTIgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gbnVtX2Jsb2NrczsgaSA+IDA7IGktLSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWG9yQmxvY2tzKG51bV9ibG9ja3MgKyBpIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKVtvcHRpb25zLmJsb2NrX3NpemUgKiAoaSAtIDEpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJsb2NrX3NpemUsIDIgKiBudW1fYmxvY2tzICsgaSAtIDEsIHhvcl9vZmZzZXQpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRYb3JCbG9ja3MoCisgICAgICAgICAgICAgICAgbnVtX2Jsb2NrcyArIGkgLSAxLCAmcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKVt3cml0ZXItPkdldEJsb2NrU2l6ZSgpICogKGkgLSAxKV0sCisgICAgICAgICAgICAgICAgd3JpdGVyLT5HZXRCbG9ja1NpemUoKSwgMiAqIG51bV9ibG9ja3MgKyBpIC0gMSwgeG9yX29mZnNldCkpOwogICAgIH0KICAgICAvLyBGbHVzaCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CiAgICAgLy8gQ29uc3RydWN0IHRoZSBidWZmZXIgcmVxdWlyZWQgZm9yIHZhbGlkYXRpb24KICAgICBvcmlnX2J1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7CiAgICAgLy8gUmVhZCB0aGUgZW50aXJlIGJhc2UgZGV2aWNlCkBAIC01NDIsOCArNTM0LDggQEAKICAgICB1bmlxdWVfZmQgcm5kX2ZkOwogICAgIGxvZmZfdCBvZmZzZXQgPSAwOwogCi0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOwogCiAgICAgcm5kX2ZkLnJlc2V0KG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKICAgICBBU1NFUlRfVFJVRShybmRfZmQgPiAwKTsKQEAgLTU1OSwyMCArNTUxLDE0IEBACiAgICAgfQogICAgIG1lbXNldChyYW5kb21fYnVmZmVyXzFfLmdldCgpLCAwLCBzaXplXyk7CiAKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd19zeXN0ZW1fLT5mZCkpOwotCi0gICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIG9wdGlvbnMuYmxvY2tfc2l6ZTsKKyAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gd3JpdGVyLT5HZXRCbG9ja1NpemUoKTsKICAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7CiAgICAgc2l6ZV90IHNvdXJjZV9ibGsgPSAwOwogICAgIHNpemVfdCBibGtfc3JjX2NvcHkgPSAyICogbnVtX2Jsb2NrczsKICAgICB1aW50MTZfdCB4b3Jfb2Zmc2V0ID0gNTsKIAogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KHNvdXJjZV9ibGssIGJsa19zcmNfY29weSkpOworICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoc291cmNlX2JsaywgYmxrX3NyY19jb3B5KSk7CiAKICAgICAgICAgeCAtPSAxOwogICAgICAgICBpZiAoeCA9PSAwKSB7CkBAIC01ODIsMTAgKzU2OCwxMCBAQAogICAgICAgICBibGtfc3JjX2NvcHkgKz0gMTsKICAgICB9CiAKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWG9yQmxvY2tzKG51bV9ibG9ja3MsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfLCAyICogbnVtX2Jsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvcl9vZmZzZXQpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFhvckJsb2NrcyhudW1fYmxvY2tzLCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXywgMiAqIG51bV9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9yX29mZnNldCkpOwogICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKICAgICAvLyBDb25zdHJ1Y3QgdGhlIGJ1ZmZlciByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbgogICAgIG9yaWdfYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPih0b3RhbF9iYXNlX3NpemVfKTsKICAgICAvLyBSZWFkIHRoZSBlbnRpcmUgYmFzZSBkZXZpY2UKQEAgLTYwMyw4ICs1ODksOCBAQAogICAgIHVuaXF1ZV9mZCBybmRfZmQ7CiAgICAgbG9mZl90IG9mZnNldCA9IDA7CiAKLSAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGNvd19zeXN0ZW1fID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wb3JhcnlGaWxlPihwYXRoKTsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd0RldmljZUludGVybmFsKCk7CisgICAgQVNTRVJUX05FKHdyaXRlciwgbnVsbHB0cik7CiAKICAgICBybmRfZmQucmVzZXQob3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSkpOwogICAgIEFTU0VSVF9UUlVFKHJuZF9mZCA+IDApOwpAQCAtNjE5LDEzICs2MDUsNyBAQAogICAgICAgICBvZmZzZXQgKz0gMV9NaUI7CiAgICAgfQogCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7CisgICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIHdyaXRlci0+R2V0QmxvY2tTaXplKCk7CiAgICAgc2l6ZV90IGJsa19lbmRfY29weSA9IG51bV9ibG9ja3MgKiAyOwogICAgIHNpemVfdCBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrcyAtIDE7CiAgICAgc2l6ZV90IGJsa19zcmNfY29weSA9IGJsa19lbmRfY29weSAtIDE7CkBAIC02MzksMTEgKzYxOSwxMSBAQAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CiAgICAgICAgIHNlcXVlbmNlW251bV9ibG9ja3MgKyBpXSA9IDUgKiBudW1fYmxvY2tzIC0gMSAtIGk7CiAgICAgfQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRTZXF1ZW5jZURhdGEoMiAqIG51bV9ibG9ja3MsIHNlcXVlbmNlKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRTZXF1ZW5jZURhdGEoMiAqIG51bV9ibG9ja3MsIHNlcXVlbmNlKSk7CiAKICAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7CiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoc291cmNlX2JsaywgYmxrX3NyY19jb3B5KSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKICAgICAgICAgeCAtPSAxOwogICAgICAgICBpZiAoeCA9PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTY1NSwyNCArNjM1LDI0IEBACiAgICAgc291cmNlX2JsayA9IG51bV9ibG9ja3M7CiAgICAgYmxrX3NyY19jb3B5ID0gYmxrX2VuZF9jb3B5OwogCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyhzb3VyY2VfYmxrLCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXykpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKHNvdXJjZV9ibGssIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKSk7CiAKICAgICBzaXplX3QgYmxrX3plcm9fY29weV9zdGFydCA9IHNvdXJjZV9ibGsgKyBudW1fYmxvY2tzOwogICAgIHNpemVfdCBibGtfemVyb19jb3B5X2VuZCA9IGJsa196ZXJvX2NvcHlfc3RhcnQgKyBudW1fYmxvY2tzOwogCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoYmxrX3plcm9fY29weV9zdGFydCwgbnVtX2Jsb2NrcykpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcyhibGtfemVyb19jb3B5X3N0YXJ0LCBudW1fYmxvY2tzKSk7CiAKICAgICBzaXplX3QgYmxrX3JhbmRvbTJfcmVwbGFjZV9zdGFydCA9IGJsa196ZXJvX2NvcHlfZW5kOwogCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2NrcyhibGtfcmFuZG9tMl9yZXBsYWNlX3N0YXJ0LCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXykpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKSk7CiAKICAgICBzaXplX3QgYmxrX3hvcl9zdGFydCA9IGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQgKyBudW1fYmxvY2tzOwogICAgIHNpemVfdCB4b3Jfb2Zmc2V0ID0gQkxPQ0tfU1ogLyAyOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRYb3JCbG9ja3MoYmxrX3hvcl9zdGFydCwgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8sIG51bV9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b3Jfb2Zmc2V0KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRYb3JCbG9ja3MoYmxrX3hvcl9zdGFydCwgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8sIG51bV9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9yX29mZnNldCkpOwogCiAgICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwogICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCiAgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwogICAgIHN0ZDo6c3RyaW5nIHplcm9fYnVmZmVyKHNpemVfLCAwKTsKQEAgLTkwMiwyOSArODgyLDM2IEBACiAgICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7CiB9CiAKLXZvaWQgQ293U25hcHVzZXJkTWV0YWRhdGFUZXN0OjpDcmVhdGVDb3dQYXJ0aWFsRmlsbGVkQXJlYSgpIHsKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDb3dTbmFwdXNlcmRNZXRhZGF0YVRlc3Q6OkNyZWF0ZUNvd0RldmljZUludGVybmFsKCkgewogICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CiAgICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOwogCiAgICAgQ293T3B0aW9ucyBvcHRpb25zOwogICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7CiAKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKKyAgICB1bmlxdWVfZmQgZmQoY293X3N5c3RlbV8tPmZkKTsKKyAgICBjb3dfc3lzdGVtXy0+ZmQgPSAtMTsKKworICAgIHJldHVybiBDcmVhdGVDb3dXcml0ZXIoa0RlZmF1bHRDb3dWZXJzaW9uLCBvcHRpb25zLCBzdGQ6Om1vdmUoZmQpKTsKK30KKwordm9pZCBDb3dTbmFwdXNlcmRNZXRhZGF0YVRlc3Q6OkNyZWF0ZUNvd1BhcnRpYWxGaWxsZWRBcmVhKCkgeworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKIAogICAgIC8vIEFyZWEgMCBpcyBjb21wbGV0ZWx5IGZpbGxlZCB3aXRoIDI1NiBleGNlcHRpb25zCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShpLCAyNTYgKyBpKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weShpLCAyNTYgKyBpKSk7CiAgICAgfQogCiAgICAgLy8gQXJlYSAxIGlzIHBhcnRpYWxseSBmaWxsZWQgd2l0aCAyIGNvcHkgb3BzIGFuZCAxMCB6ZXJvIG9wcwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDUwMCwgMTAwMCkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDUwMSwgMTAwMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSg1MDAsIDEwMDApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoNTAxLCAxMDAxKSk7CiAKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygzMDAsIDEwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDMwMCwgMTApKTsKIAogICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKIH0KIAogdm9pZCBDb3dTbmFwdXNlcmRNZXRhZGF0YVRlc3Q6OlZhbGlkYXRlUGFydGlhbEZpbGxlZEFyZWEoKSB7CkBAIC05NTYsOCArOTQzLDggQEAKICAgICB1bmlxdWVfZmQgcm5kX2ZkOwogICAgIGxvZmZfdCBvZmZzZXQgPSAwOwogCi0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOwogCiAgICAgcm5kX2ZkLnJlc2V0KG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKICAgICBBU1NFUlRfVFJVRShybmRfZmQgPiAwKTsKQEAgLTk3Miw1MCArOTU5LDQ0IEBACiAgICAgICAgIG9mZnNldCArPSAxX01pQjsKICAgICB9CiAKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd19zeXN0ZW1fLT5mZCkpOwotCi0gICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIG9wdGlvbnMuYmxvY2tfc2l6ZTsKKyAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gd3JpdGVyLT5HZXRCbG9ja1NpemUoKTsKIAogICAgIC8vIE92ZXJsYXBwaW5nIHJlZ2lvbi4gVGhpcyBoYXMgdG8gYmUgc3BsaXQKICAgICAvLyBpbnRvIHR3byBiYXRjaCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjMsIDIwKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjIsIDE5KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjEsIDE4KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjAsIDE3KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTksIDE2KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTgsIDE1KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDIzLCAyMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSgyMiwgMTkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoMjEsIDE4KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDIwLCAxNykpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSgxOSwgMTYpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoMTgsIDE1KSk7CiAKICAgICAvLyBDb250aWd1b3VzIHJlZ2lvbiBidXQgYmxvY2tzIGluIGFzY2VuZGluZyBvcmRlcgogICAgIC8vIERhZW1vbiBoYXMgdG8gZW5zdXJlIHRoYXQgdGhlc2UgYmxvY2tzIGFyZSBtZXJnZWQKICAgICAvLyBpbiBhIGJhdGNoCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNTAsIDc1KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNTEsIDc2KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNTIsIDc3KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNTMsIDc4KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDUwLCA3NSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSg1MSwgNzYpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoNTIsIDc3KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDUzLCA3OCkpOwogCiAgICAgLy8gRGlzLWNvbnRpZ3VvdXMgcmVnaW9uCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTEwLCAxMzApKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMDUsIDEyNSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwMCwgMTIwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDExMCwgMTMwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDEwNSwgMTI1KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDEwMCwgMTIwKSk7CiAKICAgICAvLyBPdmVybGFwCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjUsIDMwKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMzAsIDMxKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDI1LCAzMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSgzMCwgMzEpKTsKIAogICAgIHNpemVfdCBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrczsKIAotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3Moc291cmNlX2JsaywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyhzb3VyY2VfYmxrLCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXykpOwogCiAgICAgc2l6ZV90IGJsa196ZXJvX2NvcHlfc3RhcnQgPSBzb3VyY2VfYmxrICsgbnVtX2Jsb2NrczsKIAotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKGJsa196ZXJvX2NvcHlfc3RhcnQsIG51bV9ibG9ja3MpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoYmxrX3plcm9fY29weV9zdGFydCwgbnVtX2Jsb2NrcykpOwogCiAgICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwogfQogCiB2b2lkIENvd1NuYXB1c2VyZE1ldGFkYXRhVGVzdDo6SW5pdE1ldGFkYXRhKCkgewpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmQuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmQuY3BwCmluZGV4IDg5MjYwMzAuLjkzYmIwYjIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZC5jcHAKQEAgLTM0Nyw3ICszNDcsNiBAQAogICovCiBib29sIFNuYXB1c2VyZDo6UmVhZE1ldGFkYXRhKCkgewogICAgIHJlYWRlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1JlYWRlcj4oKTsKLSAgICBDb3dIZWFkZXIgaGVhZGVyOwogICAgIENvd09wdGlvbnMgb3B0aW9uczsKICAgICBib29sIG1ldGFkYXRhX2ZvdW5kID0gZmFsc2U7CiAgICAgaW50IHJlcGxhY2Vfb3BzID0gMCwgemVyb19vcHMgPSAwLCBjb3B5X29wcyA9IDA7CkBAIC0zNTksMTEgKzM1OCw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIXJlYWRlcl8tPkdldEhlYWRlcigmaGVhZGVyKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgaGVhZGVyIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQorICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogICAgIGlmICghKGhlYWRlci5ibG9ja19zaXplID09IEJMT0NLX1NaKSkgewogICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkludmFsaWQgaGVhZGVyIGJsb2NrIHNpemUgZm91bmQ6ICIgPDwgaGVhZGVyLmJsb2NrX3NpemU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM5NSw4ICszOTAsOCBAQAogICAgIC8vIHRoaXMgbWVtc2V0IHdpbGwgZW5zdXJlIHRoYXQgbWV0YWRhdGEgcmVhZCBpcyBjb21wbGV0ZWQuCiAgICAgbWVtc2V0KGRlX3B0ci5nZXQoKSwgMCwgKGV4Y2VwdGlvbnNfcGVyX2FyZWFfICogc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbikpKTsKIAotICAgIHdoaWxlICghY293b3Bfcm1faXRlci0+RG9uZSgpKSB7Ci0gICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gJmNvd29wX3JtX2l0ZXItPkdldCgpOworICAgIHdoaWxlICghY293b3Bfcm1faXRlci0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9IGNvd29wX3JtX2l0ZXItPkdldCgpOwogICAgICAgICBzdHJ1Y3QgZGlza19leGNlcHRpb24qIGRlID0KICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBkaXNrX2V4Y2VwdGlvbio+KChjaGFyKilkZV9wdHIuZ2V0KCkgKyBvZmZzZXQpOwogCkBAIC00MTEsOSArNDA2LDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293UmVwbGFjZU9wKSB7CisgICAgICAgIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CiAgICAgICAgICAgICByZXBsYWNlX29wcysrOwotICAgICAgICB9IGVsc2UgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293WmVyb09wKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY293X29wLT50eXBlKCkgPT0ga0Nvd1plcm9PcCkgewogICAgICAgICAgICAgemVyb19vcHMrKzsKICAgICAgICAgfQogCkBAIC00NDIsNyArNDM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKSk7CiAgICAgICAgICAgICBtZW1zZXQoZGVfcHRyLmdldCgpLCAwLCAoZXhjZXB0aW9uc19wZXJfYXJlYV8gKiBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKSkpOwogCi0gICAgICAgICAgICBpZiAoY293b3Bfcm1faXRlci0+RG9uZSgpKSB7CisgICAgICAgICAgICBpZiAoY293b3Bfcm1faXRlci0+QXRFbmQoKSkgewogICAgICAgICAgICAgICAgIHZlY18ucHVzaF9iYWNrKHN0ZDo6bW92ZShkZV9wdHIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDYyLDkgKzQ1Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIDw8ICIgTnVtYmVyIG9mIHJlcGxhY2UvemVybyBvcHMgY29tcGxldGVkIGluIHRoaXMgYXJlYTogIiA8PCBudW1fb3BzCiAgICAgICAgICAgICAgICAgICAgIDw8ICIgUGVuZGluZyBjb3B5IG9wcyBmb3IgdGhpcyBhcmVhOiAiIDw8IHBlbmRpbmdfb3JkZXJlZF9vcHM7CiAKLSAgICB3aGlsZSAoIWNvd29wX3JtX2l0ZXItPkRvbmUoKSkgeworICAgIHdoaWxlICghY293b3Bfcm1faXRlci0+QXRFbmQoKSkgewogICAgICAgICBkbyB7Ci0gICAgICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9ICZjb3dvcF9ybV9pdGVyLT5HZXQoKTsKKyAgICAgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gY293b3Bfcm1faXRlci0+R2V0KCk7CiAKICAgICAgICAgICAgIC8vIFdlIGhhdmUgdHdvIGNhc2VzIHNwZWNpZmljIGNhc2VzOgogICAgICAgICAgICAgLy8KQEAgLTUxMywxMSArNTA4LDkgQEAKICAgICAgICAgICAgIC8vIHRoZSBtZXJnZSBvZiBvcGVyYXRpb25zIGFyZSBkb25lIGJhc2VkIG9uIHRoZSBvcHMgcHJlc2VudAogICAgICAgICAgICAgLy8gaW4gdGhlIGZpbGUuCiAgICAgICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICB1aW50NjRfdCBibG9ja19zb3VyY2UgPSBjb3dfb3AtPnNvdXJjZTsKLSAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrX29mZnNldCA9IDA7CisgICAgICAgICAgICB1aW50NjRfdCBibG9ja19zb3VyY2UgPSBjb3dfb3AtPnNvdXJjZSgpOwogICAgICAgICAgICAgaWYgKHByZXZfaWQuaGFzX3ZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVzdF9ibG9ja3MuY291bnQoY293X29wLT5uZXdfYmxvY2spIHx8IHNvdXJjZV9ibG9ja3MuY291bnQoYmxvY2tfc291cmNlKSB8fAotICAgICAgICAgICAgICAgICAgICAoYmxvY2tfb2Zmc2V0ID4gMCAmJiBzb3VyY2VfYmxvY2tzLmNvdW50KGJsb2NrX3NvdXJjZSArIDEpKSkgeworICAgICAgICAgICAgICAgIGlmIChkZXN0X2Jsb2Nrcy5jb3VudChjb3dfb3AtPm5ld19ibG9jaykgfHwgc291cmNlX2Jsb2Nrcy5jb3VudChibG9ja19zb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTUyNSwxMyArNTE4LDEwIEBACiAgICAgICAgICAgICBwZW5kaW5nX29yZGVyZWRfb3BzIC09IDE7CiAgICAgICAgICAgICB2ZWMucHVzaF9iYWNrKGNvd19vcCk7CiAgICAgICAgICAgICBkZXN0X2Jsb2Nrcy5pbnNlcnQoYmxvY2tfc291cmNlKTsKLSAgICAgICAgICAgIGlmIChibG9ja19vZmZzZXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9ibG9ja3MuaW5zZXJ0KGJsb2NrX3NvdXJjZSArIDEpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgc291cmNlX2Jsb2Nrcy5pbnNlcnQoY293X29wLT5uZXdfYmxvY2spOwogICAgICAgICAgICAgcHJldl9pZCA9IGNvd19vcC0+bmV3X2Jsb2NrOwogICAgICAgICAgICAgY293b3Bfcm1faXRlci0+TmV4dCgpOwotICAgICAgICB9IHdoaWxlICghY293b3Bfcm1faXRlci0+RG9uZSgpICYmIHBlbmRpbmdfb3JkZXJlZF9vcHMpOworICAgICAgICB9IHdoaWxlICghY293b3Bfcm1faXRlci0+QXRFbmQoKSAmJiBwZW5kaW5nX29yZGVyZWRfb3BzKTsKIAogICAgICAgICBkYXRhX2NodW5rX2lkID0gR2V0TmV4dEFsbG9jYXRhYmxlQ2h1bmtJZChkYXRhX2NodW5rX2lkKTsKICAgICAgICAgU05BUF9MT0coREVCVUcpIDw8ICJCYXRjaCBNZXJnZSBjb3B5LW9wcyBvZiBzaXplOiAiIDw8IHZlYy5zaXplKCkKQEAgLTU1MCw3ICs1NDAsNyBAQAogICAgICAgICAgICAgY2h1bmtfdmVjXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQ2h1bmtUb1NlY3RvcihkYXRhX2NodW5rX2lkKSwgY293X29wKSk7CiAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7CiAgICAgICAgICAgICBudW1fb3BzICs9IDE7Ci0gICAgICAgICAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKKyAgICAgICAgICAgIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293Q29weU9wKSB7CiAgICAgICAgICAgICAgICAgY29weV9vcHMrKzsKICAgICAgICAgICAgIH0KIApAQCAtNTc0LDcgKzU2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pKTsKICAgICAgICAgICAgICAgICBtZW1zZXQoZGVfcHRyLmdldCgpLCAwLCAoZXhjZXB0aW9uc19wZXJfYXJlYV8gKiBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKSkpOwogCi0gICAgICAgICAgICAgICAgaWYgKGNvd29wX3JtX2l0ZXItPkRvbmUoKSkgeworICAgICAgICAgICAgICAgIGlmIChjb3dvcF9ybV9pdGVyLT5BdEVuZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHZlY18ucHVzaF9iYWNrKHN0ZDo6bW92ZShkZV9wdHIpKTsKICAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coREVCVUcpIDw8ICJSZWFkTWV0YWRhdGEoKSBjb21wbGV0ZWQ7IE51bWJlciBvZiBBcmVhczogIiA8PCB2ZWNfLnNpemUoKTsKICAgICAgICAgICAgICAgICB9CkBAIC02MzYsMTEgKzYyNiwxMCBAQAogfQogCiBib29sIFNuYXB1c2VyZDo6TW1hcE1ldGFkYXRhKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogCi0gICAgaWYgKGhlYWRlci5tYWpvcl92ZXJzaW9uID49IDIgJiYgaGVhZGVyLmJ1ZmZlcl9zaXplID4gMCkgewotICAgICAgICB0b3RhbF9tYXBwZWRfYWRkcl9sZW5ndGhfID0gaGVhZGVyLmhlYWRlcl9zaXplICsgQlVGRkVSX1JFR0lPTl9ERUZBVUxUX1NJWkU7CisgICAgaWYgKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiA+PSAyICYmIGhlYWRlci5idWZmZXJfc2l6ZSA+IDApIHsKKyAgICAgICAgdG90YWxfbWFwcGVkX2FkZHJfbGVuZ3RoXyA9IGhlYWRlci5wcmVmaXguaGVhZGVyX3NpemUgKyBCVUZGRVJfUkVHSU9OX0RFRkFVTFRfU0laRTsKICAgICAgICAgcmVhZF9haGVhZF9mZWF0dXJlXyA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gbW1hcCB0aGUgZmlyc3QgNGsgcGFnZSAtIG9sZGVyIENPVyBmb3JtYXQKQEAgLTc0NSw4ICs3MzQsOCBAQAogICAgIG9mZl90IG9mZnNldCA9IDA7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKLSAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZTbmFwdXNlcmQ6OlJlYWRCbG9ja3NUb0NhY2hlLCB0aGlzLCBkbV9ibG9ja19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX25hbWUsIG9mZnNldCwgcmVhZF9zel9wZXJfdGhyZWFkKTsKKyAgICAgICAgKHZvaWQpc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZTbmFwdXNlcmQ6OlJlYWRCbG9ja3NUb0NhY2hlLCB0aGlzLCBkbV9ibG9ja19kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX25hbWUsIG9mZnNldCwgcmVhZF9zel9wZXJfdGhyZWFkKTsKIAogICAgICAgICBvZmZzZXQgKz0gcmVhZF9zel9wZXJfdGhyZWFkOwogICAgIH0KQEAgLTgzMiwxMCArODIxLDkgQEAKIH0KIAogdWludDY0X3QgU25hcHVzZXJkOjpHZXRCdWZmZXJNZXRhZGF0YU9mZnNldCgpIHsKLSAgICBDb3dIZWFkZXIgaGVhZGVyOwotICAgIHJlYWRlcl8tPkdldEhlYWRlcigmaGVhZGVyKTsKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXJfLT5HZXRIZWFkZXIoKTsKIAotICAgIHNpemVfdCBzaXplID0gaGVhZGVyLmhlYWRlcl9zaXplICsgc2l6ZW9mKEJ1ZmZlclN0YXRlKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGhlYWRlci5wcmVmaXguaGVhZGVyX3NpemUgKyBzaXplb2YoQnVmZmVyU3RhdGUpOwogICAgIHJldHVybiBzaXplOwogfQogCkBAIC04NDgsMzcgKzgzNiwzMyBAQAogICoKICAqLwogc2l6ZV90IFNuYXB1c2VyZDo6R2V0QnVmZmVyTWV0YWRhdGFTaXplKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogCiAgICAgc2l6ZV90IG1ldGFkYXRhX2J5dGVzID0gKGhlYWRlci5idWZmZXJfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgU2NyYXRjaE1ldGFkYXRhKSkgLyBCTE9DS19TWjsKICAgICByZXR1cm4gbWV0YWRhdGFfYnl0ZXM7CiB9CiAKIHNpemVfdCBTbmFwdXNlcmQ6OkdldEJ1ZmZlckRhdGFPZmZzZXQoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7CisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyXy0+R2V0SGVhZGVyKCk7CiAKLSAgICByZXR1cm4gKGhlYWRlci5oZWFkZXJfc2l6ZSArIEdldEJ1ZmZlck1ldGFkYXRhU2l6ZSgpKTsKKyAgICByZXR1cm4gKGhlYWRlci5wcmVmaXguaGVhZGVyX3NpemUgKyBHZXRCdWZmZXJNZXRhZGF0YVNpemUoKSk7CiB9CiAKIC8qCiAgKiAoMk1CIC0gOEsgPSAyMDg4OTYwIGJ5dGVzKSB3aWxsIGJlIHRoZSBidWZmZXIgcmVnaW9uIHRvIGhvbGQgdGhlIGRhdGEuCiAgKi8KIHNpemVfdCBTbmFwdXNlcmQ6OkdldEJ1ZmZlckRhdGFTaXplKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogCiAgICAgc2l6ZV90IHNpemUgPSBoZWFkZXIuYnVmZmVyX3NpemUgLSBHZXRCdWZmZXJNZXRhZGF0YVNpemUoKTsKICAgICByZXR1cm4gc2l6ZTsKIH0KIAogc3RydWN0IEJ1ZmZlclN0YXRlKiBTbmFwdXNlcmQ6OkdldEJ1ZmZlclN0YXRlKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogCiAgICAgc3RydWN0IEJ1ZmZlclN0YXRlKiByYV9zdGF0ZSA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBCdWZmZXJTdGF0ZSo+KChjaGFyKiltYXBwZWRfYWRkcl8gKyBoZWFkZXIuaGVhZGVyX3NpemUpOworICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgQnVmZmVyU3RhdGUqPigoY2hhciopbWFwcGVkX2FkZHJfICsgaGVhZGVyLnByZWZpeC5oZWFkZXJfc2l6ZSk7CiAgICAgcmV0dXJuIHJhX3N0YXRlOwogfQogCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmRfcmVhZGFoZWFkLmNwcAppbmRleCAwMTEyM2Y4Li5mMWI5MjQ1IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5jcHAKQEAgLTE3MiwxNyArMTcyLDEyIEBACiB9CiAKIHZvaWQgUmVhZEFoZWFkVGhyZWFkOjpDaGVja092ZXJsYXAoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApIHsKLSAgICB1aW50NjRfdCBzb3VyY2VfYmxvY2sgPSBjb3dfb3AtPnNvdXJjZTsKLSAgICB1aW50NjRfdCBzb3VyY2Vfb2Zmc2V0ID0gMDsKLSAgICBpZiAoZGVzdF9ibG9ja3NfLmNvdW50KGNvd19vcC0+bmV3X2Jsb2NrKSB8fCBzb3VyY2VfYmxvY2tzXy5jb3VudChzb3VyY2VfYmxvY2spIHx8Ci0gICAgICAgIChzb3VyY2Vfb2Zmc2V0ID4gMCAmJiBzb3VyY2VfYmxvY2tzXy5jb3VudChzb3VyY2VfYmxvY2sgKyAxKSkpIHsKKyAgICB1aW50NjRfdCBzb3VyY2VfYmxvY2sgPSBjb3dfb3AtPnNvdXJjZSgpOworICAgIGlmIChkZXN0X2Jsb2Nrc18uY291bnQoY293X29wLT5uZXdfYmxvY2spIHx8IHNvdXJjZV9ibG9ja3NfLmNvdW50KHNvdXJjZV9ibG9jaykpIHsKICAgICAgICAgb3ZlcmxhcF8gPSB0cnVlOwogICAgIH0KIAogICAgIGRlc3RfYmxvY2tzXy5pbnNlcnQoc291cmNlX2Jsb2NrKTsKLSAgICBpZiAoc291cmNlX29mZnNldCA+IDApIHsKLSAgICAgICAgZGVzdF9ibG9ja3NfLmluc2VydChzb3VyY2VfYmxvY2sgKyAxKTsKLSAgICB9CiAgICAgc291cmNlX2Jsb2Nrc18uaW5zZXJ0KGNvd19vcC0+bmV3X2Jsb2NrKTsKIH0KIApAQCAtMTk2LDggKzE5MSw4IEBACiAgICAgICAgIC8vIEdldCB0aGUgZmlyc3QgYmxvY2sgd2l0aCBvZmZzZXQKICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSBHZXRSQU9wSXRlcigpOwogICAgICAgICBDSEVDS19ORShjb3dfb3AsIG51bGxwdHIpOwotICAgICAgICAqc291cmNlX29mZnNldCA9IGNvd19vcC0+c291cmNlOwotICAgICAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKKyAgICAgICAgKnNvdXJjZV9vZmZzZXQgPSBjb3dfb3AtPnNvdXJjZSgpOworICAgICAgICBpZiAoY293X29wLT50eXBlKCkgPT0ga0Nvd0NvcHlPcCkgewogICAgICAgICAgICAgKnNvdXJjZV9vZmZzZXQgKj0gQkxPQ0tfU1o7CiAgICAgICAgIH0KICAgICAgICAgUkFJdGVyTmV4dCgpOwpAQCAtMjE1LDggKzIxMCw4IEBACiAgICAgICAgIHdoaWxlICghUkFJdGVyRG9uZSgpICYmIG51bV9vcHMpIHsKICAgICAgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSBHZXRSQU9wSXRlcigpOwogICAgICAgICAgICAgQ0hFQ0tfTkUob3AsIG51bGxwdHIpOwotICAgICAgICAgICAgdWludDY0X3QgbmV4dF9vZmZzZXQgPSBvcC0+c291cmNlOwotICAgICAgICAgICAgaWYgKG9wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IG5leHRfb2Zmc2V0ID0gb3AtPnNvdXJjZSgpOworICAgICAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd0NvcHlPcCkgewogICAgICAgICAgICAgICAgIG5leHRfb2Zmc2V0ICo9IEJMT0NLX1NaOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5leHRfb2Zmc2V0ICsgbnJfY29uc2VjdXRpdmUgKiBCTE9DS19TWiAhPSAqc291cmNlX29mZnNldCkgewpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmRfd29ya2VyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3dvcmtlci5jcHAKaW5kZXggOTY1YWY0MC4uMWY1ZDU2OCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmRfd29ya2VyLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF93b3JrZXIuY3BwCkBAIC05NSwxMSArOTUsMTcgQEAKIC8vIGludGVybmFsIENPVyBmb3JtYXQgYW5kIGlmIHRoZSBibG9jayBpcyBjb21wcmVzc2VkLAogLy8gaXQgd2lsbCBiZSBkZS1jb21wcmVzc2VkLgogYm9vbCBXb3JrZXJUaHJlYWQ6OlByb2Nlc3NSZXBsYWNlT3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApIHsKLSAgICBpZiAoIXJlYWRlcl8tPlJlYWREYXRhKCpjb3dfb3AsICZidWZzaW5rXykpIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJQcm9jZXNzUmVwbGFjZU9wIGZhaWxlZCBmb3IgYmxvY2sgIiA8PCBjb3dfb3AtPm5ld19ibG9jazsKKyAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rXy5HZXRQYXlsb2FkQnVmZmVyKEJMT0NLX1NaKTsKKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIk5vIHNwYWNlIGluIGJ1ZmZlciBzaW5rIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLQorICAgIHNzaXplX3QgcnYgPSByZWFkZXJfLT5SZWFkRGF0YShjb3dfb3AsIGJ1ZmZlciwgQkxPQ0tfU1opOworICAgIGlmIChydiAhPSBCTE9DS19TWikgeworICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NSZXBsYWNlT3AgZmFpbGVkIGZvciBibG9jayAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCByZXR1cm4gPSAiIDw8IHJ2IDw8ICIsIENPVyBvcGVyYXRpb24gPSAiIDw8ICpjb3dfb3A7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTEwOSwxMiArMTE1LDEzIEBACiAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZEZyb21CYXNlRGV2aWNlOiBGYWlsZWQgdG8gZ2V0IHBheWxvYWQgYnVmZmVyIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIiBSZWFkRnJvbUJhc2VEZXZpY2UuLi46IG5ldy1ibG9jazogIiA8PCBjb3dfb3AtPm5ld19ibG9jawotICAgICAgICAgICAgICAgICAgICA8PCAiIFNvdXJjZTogIiA8PCBjb3dfb3AtPnNvdXJjZTsKLSAgICB1aW50NjRfdCBvZmZzZXQgPSBjb3dfb3AtPnNvdXJjZTsKLSAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKLSAgICAgICAgb2Zmc2V0ICo9IEJMT0NLX1NaOworICAgIHVpbnQ2NF90IG9mZnNldDsKKyAgICBpZiAoIXJlYWRlcl8tPkdldFNvdXJjZU9mZnNldChjb3dfb3AsICZvZmZzZXQpKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZEZyb21CYXNlRGV2aWNlOiBGYWlsZWQgdG8gZ2V0IHNvdXJjZSBvZmZzZXQiOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiIFJlYWRGcm9tQmFzZURldmljZS4uLjogbmV3LWJsb2NrOiAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgIDw8ICIgU291cmNlOiAiIDw8IG9mZnNldDsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhY2tpbmdfc3RvcmVfZmRfLCBidWZmZXIsIEJMT0NLX1NaLCBvZmZzZXQpKSB7CiAgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkNvcHkgb3AgZmFpbGVkLiBSZWFkIGZyb20gYmFja2luZyBzdG9yZTogIiA8PCBiYWNraW5nX3N0b3JlX2RldmljZV8KICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiYXQgYmxvY2sgOiIgPDwgb2Zmc2V0IC8gQkxPQ0tfU1ogPDwgIiBvZmZzZXQ6IiA8PCBvZmZzZXQgJSBCTE9DS19TWjsKQEAgLTE3MCw3ICsxNzcsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc3dpdGNoIChjb3dfb3AtPnR5cGUpIHsKKyAgICBzd2l0Y2ggKGNvd19vcC0+dHlwZSgpKSB7CiAgICAgICAgIGNhc2Uga0Nvd1JlcGxhY2VPcDogewogICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NSZXBsYWNlT3AoY293X29wKTsKICAgICAgICAgfQpAQCAtMTg0LDcgKzE5MSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIG9wZXJhdGlvbi10eXBlIGZvdW5kOiAiIDw8IGNvd19vcC0+dHlwZTsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uLXR5cGUgZm91bmQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1aW50OF90Pihjb3dfb3AtPnR5cGUoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTAyLDcgKzUxMCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHJlYWRfYWhlYWRfYnVmZmVyX21hcC5maW5kKGNvd19vcC0+bmV3X2Jsb2NrKSA9PSByZWFkX2FoZWFkX2J1ZmZlcl9tYXAuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBCbG9jazogIiA8PCBjb3dfb3AtPm5ld19ibG9jayA8PCAiIG5vdCBmb3VuZCBpbiByZWFkLWFoZWFkIGNhY2hlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgU291cmNlOiAiIDw8IGNvd19vcC0+c291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgT3A6ICIgPDwgKmNvd19vcDsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgZmluYWwgYmxvY2sgbWVyZ2VkIGluIHRoZSByZWFkLWFoZWFkIGJ1ZmZlcgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbV91c2VyX2Jsb2NrX3NlcnZlci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtX3VzZXJfYmxvY2tfc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTg4MzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbV91c2VyX2Jsb2NrX3NlcnZlci5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8c25hcHVzZXJkL2RtX3VzZXJfYmxvY2tfc2VydmVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL3NuYXB1c2VyZF9rZXJuZWwuaD4KKyNpbmNsdWRlICJzbmFwdXNlcmRfbG9nZ2luZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKK0RtVXNlckJsb2NrU2VydmVyOjpEbVVzZXJCbG9ja1NlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCB1bmlxdWVfZmQmJiBjdHJsX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGVnYXRlKiBkZWxlZ2F0ZSwgc2l6ZV90IGJ1ZmZlcl9zaXplKQorICAgIDogbWlzY19uYW1lXyhtaXNjX25hbWUpLCBjdHJsX2ZkXyhzdGQ6Om1vdmUoY3RybF9mZCkpLCBkZWxlZ2F0ZV8oZGVsZWdhdGUpIHsKKyAgICBidWZmZXJfLkluaXRpYWxpemUoYnVmZmVyX3NpemUpOworfQorCitib29sIERtVXNlckJsb2NrU2VydmVyOjpQcm9jZXNzUmVxdWVzdHMoKSB7CisgICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIgPSBidWZmZXJfLkdldEhlYWRlclB0cigpOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGN0cmxfZmRfLCBoZWFkZXIsIHNpemVvZigqaGVhZGVyKSkpIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVOT1RCTEspIHsKKyAgICAgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkNvbnRyb2wtcmVhZCBmYWlsZWQiOworICAgICAgICB9CisKKyAgICAgICAgU05BUF9QTE9HKERFQlVHKSA8PCAiUmVhZERtVXNlckhlYWRlciBmYWlsZWQuLi4uIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPnNlcTogIiA8PCBzdGQ6OmRlYyA8PCBoZWFkZXItPnNlcTsKKyAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT5sZW46ICIgPDwgc3RkOjpkZWMgPDwgaGVhZGVyLT5sZW47CisgICAgU05BUF9MT0coREVCVUcpIDw8ICJEYWVtb246IG1zZy0+c2VjdG9yOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+c2VjdG9yOworICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPnR5cGU6ICIgPDwgc3RkOjpkZWMgPDwgaGVhZGVyLT50eXBlOworICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPmZsYWdzOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+ZmxhZ3M7CisKKyAgICBpZiAoIVByb2Nlc3NSZXF1ZXN0KGhlYWRlcikpIHsKKyAgICAgICAgaWYgKGhlYWRlci0+dHlwZSAhPSBETV9VU0VSX1JFU1BfRVJST1IpIHsKKyAgICAgICAgICAgIFNlbmRFcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRG1Vc2VyQmxvY2tTZXJ2ZXI6OlByb2Nlc3NSZXF1ZXN0KGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIpIHsKKyAgICAvLyBVc2UgdGhlIHNhbWUgaGVhZGVyIGJ1ZmZlciBhcyB0aGUgcmVzcG9uc2UgaGVhZGVyLgorICAgIGludCByZXF1ZXN0X3R5cGUgPSBoZWFkZXItPnR5cGU7CisgICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX1NVQ0NFU1M7CisgICAgaGVhZGVyX3Jlc3BvbnNlXyA9IHRydWU7CisKKyAgICAvLyBSZXNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICBidWZmZXJfLlJlc2V0QnVmZmVyT2Zmc2V0KCk7CisKKyAgICBzd2l0Y2ggKHJlcXVlc3RfdHlwZSkgeworICAgICAgICBjYXNlIERNX1VTRVJfUkVRX01BUF9SRUFEOgorICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlXy0+UmVxdWVzdFNlY3RvcnMoaGVhZGVyLT5zZWN0b3IsIGhlYWRlci0+bGVuKTsKKworICAgICAgICBjYXNlIERNX1VTRVJfUkVRX01BUF9XUklURToKKyAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgZ2V0IGFueSB3cml0ZSByZXF1ZXN0IHRvIGRtLXVzZXIgYXMgd2UgbW91bnQgYWxsCisgICAgICAgICAgICAvLyBwYXJ0aXRpb25zIGFzIHJlYWQtb25seS4KKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCB3cml0ZSByZXF1ZXN0IGZyb20gZG0tdXNlciI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCByZXF1ZXN0IGZyb20gZG0tdXNlcjogIiA8PCByZXF1ZXN0X3R5cGU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkKiBEbVVzZXJCbG9ja1NlcnZlcjo6R2V0UmVzcG9uc2VCdWZmZXIoc2l6ZV90IHNpemUsIHNpemVfdCB0b193cml0ZSkgeworICAgIHJldHVybiBidWZmZXJfLkFjcXVpcmVCdWZmZXIoc2l6ZSwgdG9fd3JpdGUpOworfQorCitib29sIERtVXNlckJsb2NrU2VydmVyOjpTZW5kQnVmZmVyZWRJbygpIHsKKyAgICByZXR1cm4gV3JpdGVEbVVzZXJQYXlsb2FkKGJ1ZmZlcl8uR2V0UGF5bG9hZEJ5dGVzV3JpdHRlbigpKTsKK30KKwordm9pZCBEbVVzZXJCbG9ja1NlcnZlcjo6U2VuZEVycm9yKCkgeworICAgIHN0cnVjdCBkbV91c2VyX2hlYWRlciogaGVhZGVyID0gYnVmZmVyXy5HZXRIZWFkZXJQdHIoKTsKKyAgICBoZWFkZXItPnR5cGUgPSBETV9VU0VSX1JFU1BfRVJST1I7CisgICAgLy8gVGhpcyBpcyBhbiBpc3N1ZSB3aXRoIHRoZSBkbS11c2VyIGludGVyZmFjZS4gVGhlcmUKKyAgICAvLyBpcyBubyB3YXkgdG8gcHJvcGFnYXRlIHRoZSBJL08gZXJyb3IgYmFjayB0byBkbS11c2VyCisgICAgLy8gaWYgd2UgaGF2ZSBhbHJlYWR5IGNvbW11bmljYXRlZCB0aGUgaGVhZGVyIGJhY2suIEhlYWRlcgorICAgIC8vIGlzIHJlc3BvbmRlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmc7IGhvd2V2ZXIgSS9PIGNhbgorICAgIC8vIGJlIHByb2Nlc3NlZCBpbiBjaHVua3MuIElmIHdlIGVuY291bnRlciBhbiBJL08gZXJyb3IKKyAgICAvLyBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcHJvY2Vzc2luZywgd2UgY2FuJ3QgY29tbXVuaWNhdGUKKyAgICAvLyB0aGlzIGJhY2sgdG8gZG0tdXNlci4KKyAgICAvLworICAgIC8vIFRPRE86IEZpeCB0aGUgaW50ZXJmYWNlCisgICAgQ0hFQ0soaGVhZGVyX3Jlc3BvbnNlXyk7CisKKyAgICBXcml0ZURtVXNlclBheWxvYWQoMCk7Cit9CisKK2Jvb2wgRG1Vc2VyQmxvY2tTZXJ2ZXI6OldyaXRlRG1Vc2VyUGF5bG9hZChzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCBwYXlsb2FkX3NpemUgPSBzaXplOworICAgIHZvaWQqIGJ1ZiA9IGJ1ZmZlcl8uR2V0UGF5bG9hZEJ1ZlB0cigpOworICAgIGlmIChoZWFkZXJfcmVzcG9uc2VfKSB7CisgICAgICAgIHBheWxvYWRfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGRtX3VzZXJfaGVhZGVyKTsKKyAgICAgICAgYnVmID0gYnVmZmVyXy5HZXRCdWZQdHIoKTsKKyAgICB9CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoY3RybF9mZF8sIGJ1ZiwgcGF5bG9hZF9zaXplKSkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJXcml0ZSB0byBkbS11c2VyIGZhaWxlZCBzaXplOiAiIDw8IHBheWxvYWRfc2l6ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEFmdGVyIHRoZSBmaXJzdCBoZWFkZXIgaXMgc2VudCBpbiByZXNwb25zZSB0byBhIHJlcXVlc3QsIHdlIGNhbm5vdAorICAgIC8vIHNlbmQgYW55IGFkZGl0aW9uYWwgaGVhZGVycy4KKyAgICBoZWFkZXJfcmVzcG9uc2VfID0gZmFsc2U7CisKKyAgICAvLyBSZXNldCB0aGUgYnVmZmVyIGZvciB1c2UgYnkgdGhlIG5leHQgcmVxdWVzdC4KKyAgICBidWZmZXJfLlJlc2V0QnVmZmVyT2Zmc2V0KCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0RtVXNlckJsb2NrU2VydmVyT3BlbmVyOjpEbVVzZXJCbG9ja1NlcnZlck9wZW5lcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV91c2VyX3BhdGgpCisgICAgOiBtaXNjX25hbWVfKG1pc2NfbmFtZSksIGRtX3VzZXJfcGF0aF8oZG1fdXNlcl9wYXRoKSB7fQorCitzdGQ6OnVuaXF1ZV9wdHI8SUJsb2NrU2VydmVyPiBEbVVzZXJCbG9ja1NlcnZlck9wZW5lcjo6T3BlbihJQmxvY2tTZXJ2ZXI6OkRlbGVnYXRlKiBkZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSkgeworICAgIHVuaXF1ZV9mZCBmZChvcGVuKGRtX3VzZXJfcGF0aF8uY19zdHIoKSwgT19SRFdSIHwgT19DTE9FWEVDKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJDb3VsZCBub3Qgb3BlbiBkbS11c2VyIHBhdGg6ICIgPDwgZG1fdXNlcl9wYXRoXzsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPERtVXNlckJsb2NrU2VydmVyPihtaXNjX25hbWVfLCBzdGQ6Om1vdmUoZmQpLCBkZWxlZ2F0ZSwgYnVmZmVyX3NpemUpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBEbVVzZXJCbG9ja1NlcnZlckZhY3Rvcnk6OkNyZWF0ZU9wZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgeworICAgIGF1dG8gZG1fcGF0aCA9ICIvZGV2L2RtLXVzZXIvIiArIG1pc2NfbmFtZTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxEbVVzZXJCbG9ja1NlcnZlck9wZW5lcj4obWlzY19uYW1lLCBkbV9wYXRoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9ibG9ja19zZXJ2ZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvYmxvY2tfc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2YmYxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvYmxvY2tfc2VydmVyLmgKQEAgLTAsMCArMSw5NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKKy8vIFRoZXNlIGludGVyZmFjZXMgbW9kZWwgdGhlIGJsb2NrIGRldmljZSBkcml2ZXIgY29tcG9uZW50IG9mIHNuYXB1c2VyZCAoZWcsCisvLyBkbS11c2VyKS4KKworLy8gQW4gb3BlbiBjb25uZWN0aW9uIHRvIGEgdXNlcnNwYWNlIGJsb2NrIGRldmljZSBjb250cm9sCitjbGFzcyBJQmxvY2tTZXJ2ZXIgeworICBwdWJsaWM6CisgICAgY2xhc3MgRGVsZWdhdGUgeworICAgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5EZWxlZ2F0ZSgpIHt9CisKKyAgICAgICAgLy8gUmVzcG9uZCB0byBhIHJlcXVlc3QgZm9yIHJlYWRpbmcgYSBjb250aWd1b3VzIHJ1biBvZiBzZWN0b3JzLiBUaGlzCisgICAgICAgIC8vIGNhbGwgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIEdldFJlc3BvbnNlQnVmZmVyL0NvbW1pdEJ1ZmZlcgorICAgICAgICAvLyB1bnRpbCB0aGUgfHNpemV8IGlzIGZ1bGZpbGxlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGFuIGVycm9yIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBvcnRlZCB1bmxlc3MKKyAgICAgICAgLy8gU2VuZEVycm9yIHdhcyBjYWxsZWQuCisgICAgICAgIHZpcnR1YWwgYm9vbCBSZXF1ZXN0U2VjdG9ycyh1aW50NjRfdCBzZWN0b3IsIHVpbnQ2NF90IHNpemUpID0gMDsKKyAgICB9OworCisgICAgdmlydHVhbCB+SUJsb2NrU2VydmVyKCkge30KKworICAgIC8vIFByb2Nlc3MgSS9PIHJlcXVlc3RzLiBUaGlzIGNhbiBibG9jayB0aGUgd29ya2VyIHRocmVhZCB1bnRpbCBlaXRoZXIgYQorICAgIC8vIHJlcXVlc3QgaXMgYXZhaWxhYmxlIG9yIHRoZSB1bmRlcmx5aW5nIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkLgorICAgIC8vCisgICAgLy8gVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBvbmUgb3IgbW9yZSByZXF1ZXN0cyB3YXMgcHJvY2Vzc2VkLiBGYWxzZSBpbmRpY2F0ZXMKKyAgICAvLyBhbiB1bnJlY292ZXJhYmxlIGNvbmRpdGlvbiBhbmQgcHJvY2Vzc2luZyBzaG91bGQgc3RvcC4KKyAgICB2aXJ0dWFsIGJvb2wgUHJvY2Vzc1JlcXVlc3RzKCkgPSAwOworCisgICAgLy8gUmV0dXJuIGEgYnVmZmVyIGZvciBmdWxmaWxsaW5nIGEgUmVxdWVzdFNlY3RvcnMgcmVxdWVzdC4gVGhpcyBidWZmZXIKKyAgICAvLyBpcyB2YWxpZCB1bnRpbCBjYWxsaW5nIFNlbmRCdWZmZXJlZElvLiBUaGlzIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZQorICAgIC8vIG9mIFJlcXVlc3RTZWN0b3JzKCkuCisgICAgLy8KKyAgICAvLyAidG9fd3JpdGUiIG11c3QgYmUgPD0gInNpemUiLiBJZiBpdCBpcyA8IHNpemUsIHRoZSBleGNlc3MgYnl0ZXMgYXJlCisgICAgLy8gYXZhaWxhYmxlIGZvciB3cml0aW5nLCBidXQgd2lsbCBub3QgYmUgc2VuZCB2aWEgU2VuZEJ1ZmZlcmVkSW8sIGFuZAorICAgIC8vIG1heSBiZSByZWFsbG9jYXRlZCBpbiB0aGUgbmV4dCBjYWxsIHRvIEdldFJlc3BvbnNlQnVmZmVyLgorICAgIC8vCisgICAgLy8gQWxsIGJ1ZmZlcnMgcmV0dXJuZWQgYXJlIGludmFsaWRhdGVkIGFmdGVyIFNlbmRCdWZmZXJlZElvIG9yIHJldHVybmluZworICAgIC8vIGNvbnRyb2wgZnJvbSBSZXF1ZXN0U2VjdG9ycy4KKyAgICB2aXJ0dWFsIHZvaWQqIEdldFJlc3BvbnNlQnVmZmVyKHNpemVfdCBzaXplLCBzaXplX3QgdG9fd3JpdGUpID0gMDsKKworICAgIC8vIFNlbmQgYWxsIG91dHN0YW5kaW5nIGJ1ZmZlcnMgdG8gdGhlIGRyaXZlciwgaW4gb3JkZXIuIFRoaXMgc2hvdWxkCisgICAgLy8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UgaW4gcmVzcG9uc2UgdG8gUmVxdWVzdFNlY3RvcnMuIFRoaXMgcmV0dXJucworICAgIC8vIG93bmVyc2hpcCBvZiBhbnkgYnVmZmVycyByZXR1cm5lZCBieSBHZXRSZXNwb25zZUJ1ZmZlci4KKyAgICAvLworICAgIC8vIElmIGZhbHNlIGlzIHJldHVybmVkLCBhbiBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IHJlcG9ydGVkIHRvIHRoZSBkcml2ZXIuCisgICAgdmlydHVhbCBib29sIFNlbmRCdWZmZXJlZElvKCkgPSAwOworCisgICAgdm9pZCogR2V0UmVzcG9uc2VCdWZmZXIoc2l6ZV90IHNpemUpIHsgcmV0dXJuIEdldFJlc3BvbnNlQnVmZmVyKHNpemUsIHNpemUpOyB9Cit9OworCitjbGFzcyBJQmxvY2tTZXJ2ZXJPcGVuZXIgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SUJsb2NrU2VydmVyT3BlbmVyKCkgPSBkZWZhdWx0OworCisgICAgLy8gT3BlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZpY2UuIFRoaXMgaXMgY2FsbGVkIG9uIHRoZSBkYWVtb24gdGhyZWFkLgorICAgIC8vCisgICAgLy8gYnVmZmVyX3NpemUgaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGJ1ZmZlcmVkIEkvTyB0byB1c2UuCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SUJsb2NrU2VydmVyPiBPcGVuKElCbG9ja1NlcnZlcjo6RGVsZWdhdGUqIGRlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUpID0gMDsKK307CisKK2NsYXNzIElCbG9ja1NlcnZlckZhY3RvcnkgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SUJsb2NrU2VydmVyRmFjdG9yeSgpIHt9CisKKyAgICAvLyBSZXR1cm4gYSBuZXcgSUJsb2NrU2VydmVyT3BlbmVyIGdpdmVuIGEgdW5pcXVlIGRldmljZSBuYW1lLgorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gQ3JlYXRlT3BlbmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvZG1fdXNlcl9ibG9ja19zZXJ2ZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvZG1fdXNlcl9ibG9ja19zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWY4ZGExCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9kbV91c2VyX2Jsb2NrX3NlcnZlci5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHNuYXB1c2VyZC9ibG9ja19zZXJ2ZXIuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitjbGFzcyBEbVVzZXJCbG9ja1NlcnZlciA6IHB1YmxpYyBJQmxvY2tTZXJ2ZXIgeworICBwdWJsaWM6CisgICAgRG1Vc2VyQmxvY2tTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgY3RybF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICBEZWxlZ2F0ZSogZGVsZWdhdGUsIHNpemVfdCBidWZmZXJfc2l6ZSk7CisKKyAgICBib29sIFByb2Nlc3NSZXF1ZXN0cygpIG92ZXJyaWRlOworICAgIHZvaWQqIEdldFJlc3BvbnNlQnVmZmVyKHNpemVfdCBzaXplLCBzaXplX3QgdG9fd3JpdGUpIG92ZXJyaWRlOworICAgIGJvb2wgU2VuZEJ1ZmZlcmVkSW8oKSBvdmVycmlkZTsKKyAgICB2b2lkIFNlbmRFcnJvcigpOworCisgIHByaXZhdGU6CisgICAgYm9vbCBQcm9jZXNzUmVxdWVzdChkbV91c2VyX2hlYWRlciogaGVhZGVyKTsKKyAgICBib29sIFdyaXRlRG1Vc2VyUGF5bG9hZChzaXplX3Qgc2l6ZSk7CisKKyAgICBzdGQ6OnN0cmluZyBtaXNjX25hbWVfOworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBjdHJsX2ZkXzsKKyAgICBEZWxlZ2F0ZSogZGVsZWdhdGVfOworCisgICAgLy8gUGVyLXJlcXVlc3Qgc3RhdGUuCisgICAgQnVmZmVyU2luayBidWZmZXJfOworICAgIGJvb2wgaGVhZGVyX3Jlc3BvbnNlXyA9IGZhbHNlOworfTsKKworY2xhc3MgRG1Vc2VyQmxvY2tTZXJ2ZXJPcGVuZXIgOiBwdWJsaWMgSUJsb2NrU2VydmVyT3BlbmVyIHsKKyAgcHVibGljOgorICAgIERtVXNlckJsb2NrU2VydmVyT3BlbmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV91c2VyX3BhdGgpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPElCbG9ja1NlcnZlcj4gT3BlbihJQmxvY2tTZXJ2ZXI6OkRlbGVnYXRlKiBkZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtaXNjX25hbWVfOworICAgIHN0ZDo6c3RyaW5nIGRtX3VzZXJfcGF0aF87Cit9OworCitjbGFzcyBEbVVzZXJCbG9ja1NlcnZlckZhY3RvcnkgOiBwdWJsaWMgSUJsb2NrU2VydmVyRmFjdG9yeSB7CisgIHB1YmxpYzoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBDcmVhdGVPcGVuZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oCmluZGV4IDJlNGNhYzYuLmM1Y2EyYjEgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oCkBAIC0yNSwxOCArMjUsMzIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKLWNsYXNzIEJ1ZmZlclNpbmsgOiBwdWJsaWMgSUJ5dGVTaW5rIHsKK2NsYXNzIEJ1ZmZlclNpbmsgZmluYWwgewogICBwdWJsaWM6CiAgICAgdm9pZCBJbml0aWFsaXplKHNpemVfdCBzaXplKTsKICAgICB2b2lkKiBHZXRCdWZQdHIoKSB7IHJldHVybiBidWZmZXJfLmdldCgpOyB9CiAgICAgdm9pZCBDbGVhcigpIHsgbWVtc2V0KEdldEJ1ZlB0cigpLCAwLCBidWZmZXJfc2l6ZV8pOyB9CiAgICAgdm9pZCogR2V0UGF5bG9hZEJ1ZmZlcihzaXplX3Qgc2l6ZSk7Ci0gICAgdm9pZCogR2V0QnVmZmVyKHNpemVfdCByZXF1ZXN0ZWQsIHNpemVfdCogYWN0dWFsKSBvdmVycmlkZTsKKyAgICB2b2lkKiBHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpOwogICAgIHZvaWQgVXBkYXRlQnVmZmVyT2Zmc2V0KHNpemVfdCBzaXplKSB7IGJ1ZmZlcl9vZmZzZXRfICs9IHNpemU7IH0KICAgICBzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIqIEdldEhlYWRlclB0cigpOwotICAgIGJvb2wgUmV0dXJuRGF0YSh2b2lkKiwgc2l6ZV90KSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAgICAgdm9pZCBSZXNldEJ1ZmZlck9mZnNldCgpIHsgYnVmZmVyX29mZnNldF8gPSAwOyB9CiAgICAgdm9pZCogR2V0UGF5bG9hZEJ1ZlB0cigpOworICAgIGxvZmZfdCBHZXRQYXlsb2FkQnl0ZXNXcml0dGVuKCkgeyByZXR1cm4gYnVmZmVyX29mZnNldF87IH0KKworICAgIC8vIFNhbWUgYXMgY2FsbGluZyBHZXRQYXlsb2FkQnVmZmVyIGFuZCB0aGVuIFVwZGF0ZUJ1ZmZlck9mZnNldC4KKyAgICAvLworICAgIC8vIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgR2V0UGF5bG9hZEJ1ZmZlciBhcyBpdCBkb2VzIG5vdCByZXF1aXJlIGEKKyAgICAvLyBzZXBhcmF0ZSBjYWxsIHRvIFVwZGF0ZUJ1ZmZlck9mZnNldC4KKyAgICB2b2lkKiBBY3F1aXJlQnVmZmVyKHNpemVfdCBzaXplKSB7IHJldHVybiBBY3F1aXJlQnVmZmVyKHNpemUsIHNpemUpOyB9CisKKyAgICAvLyBTYW1lIGFzIEFjcXVpcmVCdWZmZXIsIGJ1dCBzZXBhcmF0ZXMgdGhlIHJlcXVlc3RlZCBzaXplIGZyb20gdGhlIGJ1ZmZlcgorICAgIC8vIG9mZnNldC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgc2l0dWF0aW9uIHdoZXJlIGEgZnVsbCBydW4gb2YgZGF0YSB3aWxsIGJlCisgICAgLy8gcmVhZCwgYnV0IG9ubHkgYSBwYXJ0aWFsIGFtb3VudCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgc2l6ZSAhPSB0b193cml0ZSwgdGhlIGV4Y2VzcyBieXRlcyBtYXkgYmUgcmVhbGxvY2F0ZWQgYnkgdGhlIG5leHQKKyAgICAvLyBjYWxsIHRvIEFjcXVpcmVCdWZmZXIuCisgICAgdm9pZCogQWNxdWlyZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc2l6ZV90IHRvX3dyaXRlKTsKIAogICBwcml2YXRlOgogICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlcl87CkBAIC00NCwxOSArNTgsNSBAQAogICAgIHNpemVfdCBidWZmZXJfc2l6ZV87CiB9OwogCi1jbGFzcyBYb3JTaW5rIDogcHVibGljIElCeXRlU2luayB7Ci0gIHB1YmxpYzoKLSAgICB2b2lkIEluaXRpYWxpemUoQnVmZmVyU2luayogc2luaywgc2l6ZV90IHNpemUpOwotICAgIHZvaWQgUmVzZXQoKTsKLSAgICB2b2lkKiBHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpIG92ZXJyaWRlOwotICAgIGJvb2wgUmV0dXJuRGF0YSh2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4pIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgQnVmZmVyU2luayogYnVmc2lua187Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYnVmZmVyXzsKLSAgICBzaXplX3QgYnVmZmVyX3NpemVfOwotICAgIHNpemVfdCByZXR1cm5lZF87Ci19OwotCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL3NuYXB1c2VyZF9jbGllbnQuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5oCmluZGV4IDAxMGJlYjMuLmVkZTkyZGQgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5oCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5oCkBAIC0xNywxMSArMTcsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKQEAgLTUzLDkgKzQ5LDE0IEBACiAgICAgZXhwbGljaXQgU25hcHVzZXJkQ2xpZW50KGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYmIHNvY2tmZCk7CiAgICAgU25hcHVzZXJkQ2xpZW50KCl7fTsKIAorICAgIC8vIEF0dGVtcHQgdG8gY29ubmVjdCB0byBzbmFwc3VlcmQsIHdhaXQgZm9yIHRoZSBkYWVtb24gdG8gc3RhcnQgaWYKKyAgICAvLyBjb25uZWN0aW9uIGZhaWxlZC4KICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNuYXB1c2VyZENsaWVudD4gQ29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgc29ja2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0X21zKTsKLQorICAgIC8vIEF0dGVtcHQgdG8gY29ubmVjdCB0byBzbmFwc3VlcmQsIGJ1dCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgZGFlbW9uIHRvCisgICAgLy8gc3RhcnQuCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTbmFwdXNlcmRDbGllbnQ+IFRyeUNvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNvY2tldF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dF9tcyk7CiAgICAgYm9vbCBTdG9wU25hcHVzZXJkKCk7CiAKICAgICAvLyBJbml0aWFsaXppbmcgYSBzbmFwdXNlcmQgaGFuZGxlciBpcyBhIHRocmVlLXN0ZXAgcHJvY2VzczoKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvc25hcHVzZXJkX2tlcm5lbC5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9zbmFwdXNlcmRfa2VybmVsLmgKaW5kZXggYzU5MjI1Ny4uN2FiNzVkYyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9zbmFwdXNlcmRfa2VybmVsLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9zbmFwdXNlcmRfa2VybmVsLmgKQEAgLTE0LDYgKzE0LDggQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCkBAIC00MCw2ICs0MiwxMCBAQAogICogbXVsdGlwbGUgb2YgNTEyIGJ5dGVzLiBIZW5jZSB0aGVzZSB0d28gY29uc3RhbnRzLgogICovCiBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFNFQ1RPUl9TSElGVCA9IDk7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IFNFQ1RPUl9TSVpFID0gKDFVTEwgPDwgU0VDVE9SX1NISUZUKTsKKworc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQkxPQ0tfU1ogPSA0MDk2Oworc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQkxPQ0tfU0hJRlQgPSAoX19idWlsdGluX2ZmcyhCTE9DS19TWikgLSAxKTsKIAogdHlwZWRlZiBfX3U2NCBzZWN0b3JfdDsKIHR5cGVkZWYgc2VjdG9yX3QgY2h1bmtfdDsKQEAgLTY2LDcgKzcyLDcgQEAKIAogICAgIC8qIEluIHNlY3RvcnMgKi8KICAgICB1aW50MzJfdCBjaHVua19zaXplOwotfSBfX3BhY2tlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8vIEEgZGlzayBleGNlcHRpb24gaXMgYSBtYXBwaW5nIG9mIG9sZF9jaHVuayB0byBuZXdfY2h1bmsKIC8vIG9sZF9jaHVuayBpcyB0aGUgY2h1bmsgSUQgb2YgYSBkbS1zbmFwc2hvdCBkZXZpY2UuCkBAIC03NCw3ICs4MCw3IEBACiBzdHJ1Y3QgZGlza19leGNlcHRpb24gewogICAgIHVpbnQ2NF90IG9sZF9jaHVuazsKICAgICB1aW50NjRfdCBuZXdfY2h1bms7Ci19IF9fcGFja2VkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLy8gQ29udHJvbCBzdHJ1Y3R1cmVzIHRvIGNvbW11bmljYXRlIHdpdGggZG0tdXNlcgogLy8gSXQgY29tcHJpc2VzIG9mIGhlYWRlciBhbmQgYSBwYXlsb2FkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfYnVmZmVyLmNwcAppbmRleCBhYjc2M2FiLi40OTBjMGU2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5jcHAKQEAgLTE1LDIyICsxNSwzNiBAQAogICovCiAKICNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2tlcm5lbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCiB2b2lkIEJ1ZmZlclNpbms6OkluaXRpYWxpemUoc2l6ZV90IHNpemUpIHsKLSAgICBidWZmZXJfc2l6ZV8gPSBzaXplOworICAgIGJ1ZmZlcl9zaXplXyA9IHNpemUgKyBzaXplb2Yoc3RydWN0IGRtX3VzZXJfaGVhZGVyKTsKICAgICBidWZmZXJfb2Zmc2V0XyA9IDA7Ci0gICAgYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihzaXplKTsKKyAgICBidWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KGJ1ZmZlcl9zaXplXyk7Cit9CisKK3ZvaWQqIEJ1ZmZlclNpbms6OkFjcXVpcmVCdWZmZXIoc2l6ZV90IHNpemUsIHNpemVfdCB0b193cml0ZSkgeworICAgIENIRUNLKHRvX3dyaXRlIDw9IHNpemUpOworCisgICAgdm9pZCogcHRyID0gR2V0UGF5bG9hZEJ1ZmZlcihzaXplKTsKKyAgICBpZiAoIXB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgVXBkYXRlQnVmZmVyT2Zmc2V0KHRvX3dyaXRlKTsKKyAgICByZXR1cm4gcHRyOwogfQogCiB2b2lkKiBCdWZmZXJTaW5rOjpHZXRQYXlsb2FkQnVmZmVyKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKChidWZmZXJfc2l6ZV8gLSBidWZmZXJfb2Zmc2V0XykgPCBzaXplKSByZXR1cm4gbnVsbHB0cjsKLQogICAgIGNoYXIqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KEdldEJ1ZlB0cigpKTsKICAgICBzdHJ1Y3QgZG1fdXNlcl9tZXNzYWdlKiBtc2cgPSAoc3RydWN0IGRtX3VzZXJfbWVzc2FnZSopKCYoYnVmZmVyWzBdKSk7CisgICAgaWYgKChidWZmZXJfc2l6ZV8gLSBidWZmZXJfb2Zmc2V0XyAtIHNpemVvZihtc2ctPmhlYWRlcikpIDwgc2l6ZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAgICAgcmV0dXJuIChjaGFyKiltc2ctPnBheWxvYWQuYnVmICsgYnVmZmVyX29mZnNldF87CiB9CiAKQEAgLTU5LDM4ICs3Myw1IEBACiAgICAgcmV0dXJuIG1zZy0+cGF5bG9hZC5idWY7CiB9CiAKLXZvaWQgWG9yU2luazo6SW5pdGlhbGl6ZShCdWZmZXJTaW5rKiBzaW5rLCBzaXplX3Qgc2l6ZSkgewotICAgIGJ1ZnNpbmtfID0gc2luazsKLSAgICBidWZmZXJfc2l6ZV8gPSBzaXplOwotICAgIHJldHVybmVkXyA9IDA7Ci0gICAgYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihzaXplKTsKLX0KLQotdm9pZCBYb3JTaW5rOjpSZXNldCgpIHsKLSAgICByZXR1cm5lZF8gPSAwOwotfQotCi12b2lkKiBYb3JTaW5rOjpHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpIHsKLSAgICBpZiAocmVxdWVzdGVkID4gYnVmZmVyX3NpemVfKSB7Ci0gICAgICAgICphY3R1YWwgPSBidWZmZXJfc2l6ZV87Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmFjdHVhbCA9IHJlcXVlc3RlZDsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlcl8uZ2V0KCk7Ci19Ci0KLWJvb2wgWG9yU2luazo6UmV0dXJuRGF0YSh2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4pIHsKLSAgICB1aW50OF90KiB4b3JfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZmZlcik7Ci0gICAgdWludDhfdCogYnVmZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZnNpbmtfLT5HZXRQYXlsb2FkQnVmZmVyKGxlbiArIHJldHVybmVkXykpOwotICAgIGlmIChidWZmID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIGJ1ZmZbcmV0dXJuZWRfICsgaV0gXj0geG9yX2RhdGFbaV07Ci0gICAgfQotICAgIHJldHVybmVkXyArPSBsZW47Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9jbGllbnQuY3BwCmluZGV4IDNiZWQzYTQuLjc4OWM5ODAgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50LmNwcApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgpAQCAtNjQsNiArNjQsNDAgQEAKICAgICByZXR1cm4gZXJybm8gPT0gRUNPTk5SRUZVU0VEIHx8IGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVOT0VOVDsKIH0KIAorc3RkOjp1bmlxdWVfcHRyPFNuYXB1c2VyZENsaWVudD4gU25hcHVzZXJkQ2xpZW50OjpUcnlDb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXRfbXMpIHsKKyAgICB1bmlxdWVfZmQgZmQ7CisgICAgY29uc3QgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGZkLnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShzb2NrZXRfbG9jYWxfY2xpZW50KAorICAgICAgICAgICAgICAgIHNvY2tldF9uYW1lLmNfc3RyKCksIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9SRVNFUlZFRCwgU09DS19TVFJFQU0pKSk7CisgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICBhdXRvIGNsaWVudCA9IHN0ZDo6bWFrZV91bmlxdWU8U25hcHVzZXJkQ2xpZW50PihzdGQ6Om1vdmUoZmQpKTsKKyAgICAgICAgICAgIGlmICghY2xpZW50LT5WYWxpZGF0ZUNvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkRhZW1vbiBzb2NrZXQgIiA8PCBzb2NrZXRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3QgZXhpc3QsIHJldHVybiB3aXRob3V0IHdhaXRpbmcuIjsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChlcnJubyA9PSBFQ09OTlJFRlVTRUQpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgICAgICAgICBjb25zdCBhdXRvIGVsYXBzZWQgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihub3cgLSBzdGFydCk7CisgICAgICAgICAgICBpZiAoZWxhcHNlZCA+PSB0aW1lb3V0X21zKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVGltZWQgb3V0IGNvbm5lY3RpbmcgdG8gc25hcHVzZXJkIHNvY2tldDogIiA8PCBzb2NrZXRfbmFtZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMG1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJjb25uZWN0IGZhaWxlZDogIiA8PCBzb2NrZXRfbmFtZTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorfQorCiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHVzZXJkQ2xpZW50PiBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNvY2tldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dF9tcykgewogICAgIHVuaXF1ZV9mZCBmZDsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2RhZW1vbi5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9kYWVtb24uY3BwCmluZGV4IGFlMjBlMWYuLjM2ZGFkMzMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2RhZW1vbi5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfZGFlbW9uLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgYXV0byBoYW5kbGVyID0gdXNlcl9zZXJ2ZXJfLkFkZEhhbmRsZXIocGFydHNbMF0sIHBhcnRzWzFdLCBwYXJ0c1syXSwgcGFydHNbM10pOwotICAgICAgICBpZiAoIWhhbmRsZXIgfHwgIXVzZXJfc2VydmVyXy5TdGFydEhhbmRsZXIoaGFuZGxlcikpIHsKKyAgICAgICAgaWYgKCFoYW5kbGVyIHx8ICF1c2VyX3NlcnZlcl8uU3RhcnRIYW5kbGVyKHBhcnRzWzBdKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfZXh0cmFjdG9yLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2Y2Q1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2V4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxnZmxhZ3MvZ2ZsYWdzLmg+CisjaW5jbHVkZSAidXNlci1zcGFjZS1tZXJnZS9leHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOworCitERUZJTkVfc3RyaW5nKGJhc2UsICIiLCAiQmFzZSBkZXZpY2UvaW1hZ2UiKTsKK0RFRklORV9zdHJpbmcoY293LCAiIiwgIkNPVyBkZXZpY2UvaW1hZ2UiKTsKK0RFRklORV9zdHJpbmcob3V0LCAiIiwgIk91dHB1dCBwYXRoIik7CitERUZJTkVfaW50MzIobnVtX3NlY3RvcnMsIDAsICJOdW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkIik7CisKK2ludCBtYWluKFtbbWF5YmVfdW51c2VkXV0gaW50IGFyZ2MsIFtbbWF5YmVfdW51c2VkXV0gY2hhcioqIGFyZ3YpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2KTsKKyAgICBnZmxhZ3M6OlBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIHRydWUpOworCisgICAgaWYgKEZMQUdTX291dC5lbXB0eSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk1pc3NpbmcgLW91dCBhcmd1bWVudC4iOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKEZMQUdTX2Jhc2UuZW1wdHkoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJNaXNzaW5nIC1iYXNlIGFyZ3VtZW50LiI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoRkxBR1NfY293LmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAibWlzc2luZyAtb3V0IGFyZ3VtZW50LiI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIUZMQUdTX251bV9zZWN0b3JzKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIm1pc3NpbmcgLW51bV9zZWN0b3JzIGFyZ3VtZW50LiI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGFuZHJvaWQ6OnNuYXBzaG90OjpFeHRyYWN0b3IgZXh0cmFjdG9yKEZMQUdTX2Jhc2UsIEZMQUdTX2Nvdyk7CisgICAgaWYgKCFleHRyYWN0b3IuSW5pdCgpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIWV4dHJhY3Rvci5FeHRyYWN0KEZMQUdTX251bV9zZWN0b3JzLCBGTEFHU19vdXQpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2xvZ2dpbmcuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ3MGNlCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfbG9nZ2luZy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNkZWZpbmUgU05BUF9MT0cobGV2ZWwpIExPRyhsZXZlbCkgPDwgbWlzY19uYW1lXyA8PCAiOiAiCisjZGVmaW5lIFNOQVBfUExPRyhsZXZlbCkgUExPRyhsZXZlbCkgPDwgbWlzY19uYW1lXyA8PCAiOiAiCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvZG1fdXNlcl9oYXJuZXNzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9kbV91c2VyX2hhcm5lc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWRmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvZG1fdXNlcl9oYXJuZXNzLmNwcApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImRtX3VzZXJfaGFybmVzcy5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8ZnNfbWdyL2ZpbGVfd2FpdC5oPgorI2luY2x1ZGUgPGxpYmRtL2RtLmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL2RtX3VzZXJfYmxvY2tfc2VydmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworRG1Vc2VyRGV2aWNlOjpEbVVzZXJEZXZpY2Uoc3RkOjp1bmlxdWVfcHRyPFRlbXBkZXZpY2U+JiYgZGV2KSA6IGRldl8oc3RkOjptb3ZlKGRldikpIHt9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBEbVVzZXJEZXZpY2U6OkdldFBhdGgoKSB7CisgICAgcmV0dXJuIGRldl8tPnBhdGgoKTsKK30KKworYm9vbCBEbVVzZXJEZXZpY2U6OkRlc3Ryb3koKSB7CisgICAgcmV0dXJuIGRldl8tPkRlc3Ryb3koKTsKK30KKworRG1Vc2VyVGVzdEhhcm5lc3M6OkRtVXNlclRlc3RIYXJuZXNzKCkgeworICAgIGJsb2NrX3NlcnZlcl9mYWN0b3J5XyA9IHN0ZDo6bWFrZV91bmlxdWU8RG1Vc2VyQmxvY2tTZXJ2ZXJGYWN0b3J5PigpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SVVzZXJEZXZpY2U+IERtVXNlclRlc3RIYXJuZXNzOjpDcmVhdGVVc2VyRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbnVtX3NlY3RvcnMpIHsKKyAgICBhbmRyb2lkOjpkbTo6RG1UYWJsZSBkbXVzZXJfdGFibGU7CisgICAgZG11c2VyX3RhYmxlLkVtcGxhY2U8YW5kcm9pZDo6ZG06OkRtVGFyZ2V0VXNlcj4oMCwgbnVtX3NlY3RvcnMsIG1pc2NfbmFtZSk7CisgICAgYXV0byBkZXYgPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBkZXZpY2U+KGRldl9uYW1lLCBkbXVzZXJfdGFibGUpOworICAgIGlmICghZGV2LT52YWxpZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGF1dG8gbWlzY19kZXZpY2UgPSAiL2Rldi9kbS11c2VyLyIgKyBtaXNjX25hbWU7CisgICAgaWYgKCFhbmRyb2lkOjpmc19tZ3I6OldhaXRGb3JGaWxlKG1pc2NfZGV2aWNlLCAxMHMpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPERtVXNlckRldmljZT4oc3RkOjptb3ZlKGRldikpOworfQorCitJQmxvY2tTZXJ2ZXJGYWN0b3J5KiBEbVVzZXJUZXN0SGFybmVzczo6R2V0QmxvY2tTZXJ2ZXJGYWN0b3J5KCkgeworICAgIHJldHVybiBibG9ja19zZXJ2ZXJfZmFjdG9yeV8uZ2V0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9kbV91c2VyX2hhcm5lc3MuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9kbV91c2VyX2hhcm5lc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI2YmVkCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2RtX3VzZXJfaGFybmVzcy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKworI2luY2x1ZGUgImhhcm5lc3MuaCIKKyNpbmNsdWRlICJ0ZW1wX2RldmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKK2NsYXNzIERtVXNlckJsb2NrU2VydmVyRmFjdG9yeTsKKworY2xhc3MgRG1Vc2VyRGV2aWNlIGZpbmFsIDogcHVibGljIElVc2VyRGV2aWNlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IERtVXNlckRldmljZShzdGQ6OnVuaXF1ZV9wdHI8VGVtcGRldmljZT4mJiBkZXYpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRQYXRoKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBEZXN0cm95KCkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVtcGRldmljZT4gZGV2XzsKK307CisKK2NsYXNzIERtVXNlclRlc3RIYXJuZXNzIGZpbmFsIDogcHVibGljIElUZXN0SGFybmVzcyB7CisgIHB1YmxpYzoKKyAgICBEbVVzZXJUZXN0SGFybmVzcygpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPElVc2VyRGV2aWNlPiBDcmVhdGVVc2VyRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbnVtX3NlY3RvcnMpIG92ZXJyaWRlOworICAgIElCbG9ja1NlcnZlckZhY3RvcnkqIEdldEJsb2NrU2VydmVyRmFjdG9yeSgpIG92ZXJyaWRlOworICAgIGJvb2wgSGFzVXNlckRldmljZSgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxEbVVzZXJCbG9ja1NlcnZlckZhY3Rvcnk+IGJsb2NrX3NlcnZlcl9mYWN0b3J5XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9oYXJuZXNzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9oYXJuZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmFlNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hhcm5lc3MuY3BwCkBAIC0wLDAgKzEsMTE2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImhhcm5lc3MuaCIKKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8bGludXgvbWVtZmQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgorI2luY2x1ZGUgPGxpYmRtL2xvb3BfY29udHJvbC5oPgorI2luY2x1ZGUgInNuYXB1c2VyZF9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKK3VzaW5nIGFuZHJvaWQ6OmRtOjpMb29wRGV2aWNlOworCisjaWZkZWYgX19BTkRST0lEX18KKy8vIFByZWZlciB0aGlzIG9uIGRldmljZSBzaW5jZSBpdCBpcyBhIHJlYWwgYmxvY2sgZGV2aWNlLCB3aGljaCBpcyBtb3JlIHNpbWlsYXIKKy8vIHRvIGhvdyB3ZSB1c2Ugc25hcHVzZXJkLgorY2xhc3MgTWVtb3J5QmFja2VkRGV2aWNlIGZpbmFsIDogcHVibGljIElCYWNraW5nRGV2aWNlIHsKKyAgcHVibGljOgorICAgIGJvb2wgSW5pdCh1aW50NjRfdCBzaXplKSB7CisgICAgICAgIG1lbWZkXy5yZXNldChtZW1mZF9jcmVhdGUoInNuYXB1c2VyZF90ZXN0IiwgTUZEX0FMTE9XX1NFQUxJTkcpKTsKKyAgICAgICAgaWYgKG1lbWZkXyA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJtZW1mZF9jcmVhdGUgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnRydW5jYXRlKG1lbWZkXy5nZXQoKSwgc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZnRydW5jYXRlIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZjbnRsKG1lbWZkXy5nZXQoKSwgRl9BRERfU0VBTFMsIEZfU0VBTF9HUk9XIHwgRl9TRUFMX1NIUklOSykgPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZmNudGwgc2VhbCBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRldl8gPSBzdGQ6Om1ha2VfdW5pcXVlPExvb3BEZXZpY2U+KG1lbWZkXywgMTBzKTsKKyAgICAgICAgcmV0dXJuIGRldl8tPnZhbGlkKCk7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRQYXRoKCkgb3ZlcnJpZGUgeyByZXR1cm4gZGV2Xy0+ZGV2aWNlKCk7IH0KKyAgICB1aW50NjRfdCBHZXRTaXplKCkgb3ZlcnJpZGUgeworICAgICAgICB1bmlxdWVfZmQgZmQob3BlbihHZXRQYXRoKCkuY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKKyAgICAgICAgaWYgKGZkIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIm9wZW4gZmFpbGVkOiAiIDw8IEdldFBhdGgoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRfYmxvY2tfZGV2aWNlX3NpemUoZmQuZ2V0KCkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHVuaXF1ZV9mZCBtZW1mZF87CisgICAgc3RkOjp1bmlxdWVfcHRyPExvb3BEZXZpY2U+IGRldl87Cit9OworI2VuZGlmCisKK2NsYXNzIEZpbGVCYWNrZWREZXZpY2UgZmluYWwgOiBwdWJsaWMgSUJhY2tpbmdEZXZpY2UgeworICBwdWJsaWM6CisgICAgYm9vbCBJbml0KHVpbnQ2NF90IHNpemUpIHsKKyAgICAgICAgaWYgKHRlbXBfLmZkIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChmdHJ1bmNhdGUodGVtcF8uZmQsIHNpemUpIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgImZ0cnVuY2F0ZSBmYWlsZWQ6ICIgPDwgdGVtcF8ucGF0aDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwYXRoXyA9IHRlbXBfLnBhdGg7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRQYXRoKCkgb3ZlcnJpZGUgeyByZXR1cm4gcGF0aF87IH0KKyAgICB1aW50NjRfdCBHZXRTaXplKCkgb3ZlcnJpZGUgeworICAgICAgICBvZmZfdCBvZmYgPSBsc2Vlayh0ZW1wXy5mZCwgMCwgU0VFS19FTkQpOworICAgICAgICBpZiAob2ZmIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGZhaWxlZDogIiA8PCB0ZW1wXy5wYXRoOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9mZjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBUZW1wb3JhcnlGaWxlIHRlbXBfOworICAgIHN0ZDo6c3RyaW5nIHBhdGhfOworfTsKKworc3RkOjp1bmlxdWVfcHRyPElCYWNraW5nRGV2aWNlPiBJVGVzdEhhcm5lc3M6OkNyZWF0ZUJhY2tpbmdEZXZpY2UodWludDY0X3Qgc2l6ZSkgeworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgYXV0byBkZXYgPSBzdGQ6Om1ha2VfdW5pcXVlPE1lbW9yeUJhY2tlZERldmljZT4oKTsKKyNlbHNlCisgICAgYXV0byBkZXYgPSBzdGQ6Om1ha2VfdW5pcXVlPEZpbGVCYWNrZWREZXZpY2U+KCk7CisjZW5kaWYKKyAgICBpZiAoIWRldi0+SW5pdChzaXplKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGRldjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hhcm5lc3MuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9oYXJuZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlOWY3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9oYXJuZXNzLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL2Jsb2NrX3NlcnZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCisvLyBJbnRlcmZhY2UgZm9yIGEgImJsb2NrIGRyaXZlciBpbiB1c2Vyc3BhY2UiIGRldmljZS4KK2NsYXNzIElVc2VyRGV2aWNlIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfklVc2VyRGV2aWNlKCkge30KKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRQYXRoKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBEZXN0cm95KCkgPSAwOworfTsKKworLy8gSW50ZXJmYWNlIGZvciBhbiBmZC90ZW1wIGZpbGUgdGhhdCBpcyBhIGJsb2NrIGRldmljZSB3aGVuIHBvc3NpYmxlLgorY2xhc3MgSUJhY2tpbmdEZXZpY2UgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SUJhY2tpbmdEZXZpY2UoKSB7fQorICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFBhdGgoKSA9IDA7CisgICAgdmlydHVhbCB1aW50NjRfdCBHZXRTaXplKCkgPSAwOworfTsKKworY2xhc3MgSVRlc3RIYXJuZXNzIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfklUZXN0SGFybmVzcygpIHt9CisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVVzZXJEZXZpY2U+IENyZWF0ZVVzZXJEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRldl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbnVtX3NlY3RvcnMpID0gMDsKKyAgICB2aXJ0dWFsIElCbG9ja1NlcnZlckZhY3RvcnkqIEdldEJsb2NrU2VydmVyRmFjdG9yeSgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgSGFzVXNlckRldmljZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJQmFja2luZ0RldmljZT4gQ3JlYXRlQmFja2luZ0RldmljZSh1aW50NjRfdCBzaXplKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9ob3N0X2hhcm5lc3MuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hvc3RfaGFybmVzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyMzBhZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9ob3N0X2hhcm5lc3MuY3BwCkBAIC0wLDAgKzEsMTEyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImhvc3RfaGFybmVzcy5oIgorCisjaW5jbHVkZSAic25hcHVzZXJkX2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKwordm9pZCBUZXN0QmxvY2tTZXJ2ZXJRdWV1ZTo6V2FpdEZvclNodXRkb3duKCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtXyk7CisgICAgaWYgKHNodXRkb3duXykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGN2Xy53YWl0KGxvY2ssIFt0aGlzXSgpIC0+IGJvb2wgeyByZXR1cm4gc2h1dGRvd25fOyB9KTsKK30KKwordm9pZCBUZXN0QmxvY2tTZXJ2ZXJRdWV1ZTo6U2h1dGRvd24oKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1fKTsKKyAgICBzaHV0ZG93bl8gPSB0cnVlOworICAgIGN2Xy5ub3RpZnlfYWxsKCk7Cit9CisKK1Rlc3RCbG9ja1NlcnZlcjo6VGVzdEJsb2NrU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKQorICAgIDogcXVldWVfKHF1ZXVlKSwgbWlzY19uYW1lXyhtaXNjX25hbWUpIHt9CisKK2Jvb2wgVGVzdEJsb2NrU2VydmVyOjpQcm9jZXNzUmVxdWVzdHMoKSB7CisgICAgcXVldWVfLT5XYWl0Rm9yU2h1dGRvd24oKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQqIFRlc3RCbG9ja1NlcnZlcjo6R2V0UmVzcG9uc2VCdWZmZXIoc2l6ZV90IHNpemUsIHNpemVfdCB0b193cml0ZSkgeworICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihzaXplLCAnXDAnKTsKKyAgICBidWZmZXJlZF8uZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShidWZmZXIpLCB0b193cml0ZSk7CisgICAgcmV0dXJuIGJ1ZmZlcmVkXy5iYWNrKCkuZmlyc3QuZGF0YSgpOworfQorCitib29sIFRlc3RCbG9ja1NlcnZlcjo6U2VuZEJ1ZmZlcmVkSW8oKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBbZGF0YSwgdG9fd3JpdGVdIDogYnVmZmVyZWRfKSB7CisgICAgICAgIHNlbnRfaW9fICs9IGRhdGEuc3Vic3RyKDAsIHRvX3dyaXRlKTsKKyAgICB9CisgICAgYnVmZmVyZWRfLmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Rlc3RCbG9ja1NlcnZlck9wZW5lcjo6VGVzdEJsb2NrU2VydmVyT3BlbmVyKHN0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKQorICAgIDogcXVldWVfKHF1ZXVlKSwgbWlzY19uYW1lXyhtaXNjX25hbWUpIHt9CisKK3N0ZDo6dW5pcXVlX3B0cjxJQmxvY2tTZXJ2ZXI+IFRlc3RCbG9ja1NlcnZlck9wZW5lcjo6T3BlbihJQmxvY2tTZXJ2ZXI6OkRlbGVnYXRlKiwgc2l6ZV90KSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8VGVzdEJsb2NrU2VydmVyPihxdWV1ZV8sIG1pc2NfbmFtZV8pOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VGVzdEJsb2NrU2VydmVyT3BlbmVyPiBUZXN0QmxvY2tTZXJ2ZXJGYWN0b3J5OjpDcmVhdGVUZXN0T3BlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSB7CisgICAgaWYgKHF1ZXVlc18uY291bnQobWlzY19uYW1lKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIG9wZW5lciBmb3IgIiA8PCBtaXNjX25hbWUgPDwgIiwgYWxyZWFkeSBleGlzdHMiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgYXV0byBxdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJsb2NrU2VydmVyUXVldWU+KCk7CisgICAgcXVldWVzXy5lbXBsYWNlKG1pc2NfbmFtZSwgcXVldWUpOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCbG9ja1NlcnZlck9wZW5lcj4ocXVldWUsIG1pc2NfbmFtZSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJQmxvY2tTZXJ2ZXJPcGVuZXI+IFRlc3RCbG9ja1NlcnZlckZhY3Rvcnk6OkNyZWF0ZU9wZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgeworICAgIHJldHVybiBDcmVhdGVUZXN0T3BlbmVyKG1pc2NfbmFtZSk7Cit9CisKK2Jvb2wgVGVzdEJsb2NrU2VydmVyRmFjdG9yeTo6RGVsZXRlUXVldWUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgeworICAgIGF1dG8gaXRlciA9IHF1ZXVlc18uZmluZChtaXNjX25hbWUpOworICAgIGlmIChpdGVyID09IHF1ZXVlc18uZW5kKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGRlbGV0ZSBxdWV1ZSAiIDw8IG1pc2NfbmFtZSA8PCAiLCBub3QgZm91bmQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGl0ZXItPnNlY29uZC0+U2h1dGRvd24oKTsKKyAgICBxdWV1ZXNfLmVyYXNlKGl0ZXIpOworICAgIHJldHVybiB0cnVlOworfQorCitIb3N0VXNlckRldmljZTo6SG9zdFVzZXJEZXZpY2UoVGVzdEJsb2NrU2VydmVyRmFjdG9yeSogZmFjdG9yeSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkKKyAgICA6IGZhY3RvcnlfKGZhY3RvcnkpLCBtaXNjX25hbWVfKG1pc2NfbmFtZSkge30KKworYm9vbCBIb3N0VXNlckRldmljZTo6RGVzdHJveSgpIHsKKyAgICByZXR1cm4gZmFjdG9yeV8tPkRlbGV0ZVF1ZXVlKG1pc2NfbmFtZV8pOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SVVzZXJEZXZpY2U+IEhvc3RUZXN0SGFybmVzczo6Q3JlYXRlVXNlckRldmljZShjb25zdCBzdGQ6OnN0cmluZyYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIb3N0VXNlckRldmljZT4oJmZhY3RvcnlfLCBtaXNjX25hbWUpOworfQorCitJQmxvY2tTZXJ2ZXJGYWN0b3J5KiBIb3N0VGVzdEhhcm5lc3M6OkdldEJsb2NrU2VydmVyRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gJmZhY3RvcnlfOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvaG9zdF9oYXJuZXNzLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvaG9zdF9oYXJuZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwYmQyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9ob3N0X2hhcm5lc3MuaApAQCAtMCwwICsxLDEwNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiaGFybmVzcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitjbGFzcyBUZXN0QmxvY2tTZXJ2ZXJRdWV1ZSBmaW5hbCB7CisgIHB1YmxpYzoKKyAgICB2b2lkIFdhaXRGb3JTaHV0ZG93bigpOworICAgIHZvaWQgU2h1dGRvd24oKTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbV87CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY3ZfOworICAgIGJvb2wgc2h1dGRvd25fID0gZmFsc2U7Cit9OworCitjbGFzcyBUZXN0QmxvY2tTZXJ2ZXIgZmluYWwgOiBwdWJsaWMgSUJsb2NrU2VydmVyIHsKKyAgcHVibGljOgorICAgIFRlc3RCbG9ja1NlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VGVzdEJsb2NrU2VydmVyUXVldWU+IHF1ZXVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKTsKKyAgICBib29sIFByb2Nlc3NSZXF1ZXN0cygpIG92ZXJyaWRlOworICAgIHZvaWQqIEdldFJlc3BvbnNlQnVmZmVyKHNpemVfdCBzaXplLCBzaXplX3QgdG9fd3JpdGUpIG92ZXJyaWRlOworICAgIGJvb2wgU2VuZEJ1ZmZlcmVkSW8oKSBvdmVycmlkZTsKKworICAgIHN0ZDo6c3RyaW5nJiYgc2VudF9pbygpIHsgcmV0dXJuIHN0ZDo6bW92ZShzZW50X2lvXyk7IH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJRdWV1ZT4gcXVldWVfOworICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87CisgICAgc3RkOjpzdHJpbmcgc2VudF9pb187CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzaXplX3Q+PiBidWZmZXJlZF87Cit9OworCitjbGFzcyBUZXN0QmxvY2tTZXJ2ZXJPcGVuZXIgZmluYWwgOiBwdWJsaWMgSUJsb2NrU2VydmVyT3BlbmVyIHsKKyAgcHVibGljOgorICAgIFRlc3RCbG9ja1NlcnZlck9wZW5lcihzdGQ6OnNoYXJlZF9wdHI8VGVzdEJsb2NrU2VydmVyUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUJsb2NrU2VydmVyPiBPcGVuKElCbG9ja1NlcnZlcjo6RGVsZWdhdGUqIGRlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJRdWV1ZT4gcXVldWVfOworICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87Cit9OworCitjbGFzcyBUZXN0QmxvY2tTZXJ2ZXJGYWN0b3J5IGZpbmFsIDogcHVibGljIElCbG9ja1NlcnZlckZhY3RvcnkgeworICBwdWJsaWM6CisgICAgc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gQ3JlYXRlT3BlbmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIG92ZXJyaWRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJPcGVuZXI+IENyZWF0ZVRlc3RPcGVuZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7CisgICAgYm9vbCBEZWxldGVRdWV1ZShjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPFRlc3RCbG9ja1NlcnZlclF1ZXVlPj4gcXVldWVzXzsKK307CisKK2NsYXNzIFRlc3RCbG9ja1NlcnZlckZhY3Rvcnk7CisKK2NsYXNzIEhvc3RVc2VyRGV2aWNlIGZpbmFsIDogcHVibGljIElVc2VyRGV2aWNlIHsKKyAgcHVibGljOgorICAgIEhvc3RVc2VyRGV2aWNlKFRlc3RCbG9ja1NlcnZlckZhY3RvcnkqIGZhY3RvcnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRQYXRoKCkgb3ZlcnJpZGUgeyByZXR1cm4gZW1wdHlfcGF0aF87IH0KKyAgICBib29sIERlc3Ryb3koKTsKKworICBwcml2YXRlOgorICAgIFRlc3RCbG9ja1NlcnZlckZhY3RvcnkqIGZhY3RvcnlfOworICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87CisgICAgc3RkOjpzdHJpbmcgZW1wdHlfcGF0aF87Cit9OworCitjbGFzcyBIb3N0VGVzdEhhcm5lc3MgZmluYWwgOiBwdWJsaWMgSVRlc3RIYXJuZXNzIHsKKyAgcHVibGljOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxJVXNlckRldmljZT4gQ3JlYXRlVXNlckRldmljZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG51bV9zZWN0b3JzKSBvdmVycmlkZTsKKyAgICBJQmxvY2tTZXJ2ZXJGYWN0b3J5KiBHZXRCbG9ja1NlcnZlckZhY3RvcnkoKSBvdmVycmlkZTsKKyAgICBib29sIEhhc1VzZXJEZXZpY2UoKSBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgIHByaXZhdGU6CisgICAgVGVzdEJsb2NrU2VydmVyRmFjdG9yeSBmYWN0b3J5XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy90ZW1wX2RldmljZS5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL3RlbXBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2ZDNlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy90ZW1wX2RldmljZS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsaWJkbS9kbS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBhbmRyb2lkOjpkbTo6RGV2aWNlTWFwcGVyOwordXNpbmcgYW5kcm9pZDo6ZG06OkRtVGFibGU7CisKK2NsYXNzIFRlbXBkZXZpY2UgeworICBwdWJsaWM6CisgICAgVGVtcGRldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgRG1UYWJsZSYgdGFibGUpCisgICAgICAgIDogZG1fKERldmljZU1hcHBlcjo6SW5zdGFuY2UoKSksIG5hbWVfKG5hbWUpLCB2YWxpZF8oZmFsc2UpIHsKKyAgICAgICAgdmFsaWRfID0gZG1fLkNyZWF0ZURldmljZShuYW1lLCB0YWJsZSwgJnBhdGhfLCBzdGQ6OmNocm9ubzo6c2Vjb25kcyg1KSk7CisgICAgfQorICAgIFRlbXBkZXZpY2UoVGVtcGRldmljZSYmIG90aGVyKSBub2V4Y2VwdAorICAgICAgICA6IGRtXyhvdGhlci5kbV8pLCBuYW1lXyhvdGhlci5uYW1lXyksIHBhdGhfKG90aGVyLnBhdGhfKSwgdmFsaWRfKG90aGVyLnZhbGlkXykgeworICAgICAgICBvdGhlci52YWxpZF8gPSBmYWxzZTsKKyAgICB9CisgICAgflRlbXBkZXZpY2UoKSB7CisgICAgICAgIGlmICh2YWxpZF8pIHsKKyAgICAgICAgICAgIGRtXy5EZWxldGVEZXZpY2VJZkV4aXN0cyhuYW1lXyk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBEZXN0cm95KCkgeworICAgICAgICBpZiAoIXZhbGlkXykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmFsaWRfID0gZmFsc2U7CisgICAgICAgIHJldHVybiBkbV8uRGVsZXRlRGV2aWNlSWZFeGlzdHMobmFtZV8pOworICAgIH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorICAgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiB2YWxpZF87IH0KKworICAgIFRlbXBkZXZpY2UoY29uc3QgVGVtcGRldmljZSYpID0gZGVsZXRlOworICAgIFRlbXBkZXZpY2UmIG9wZXJhdG9yPShjb25zdCBUZW1wZGV2aWNlJikgPSBkZWxldGU7CisKKyAgICBUZW1wZGV2aWNlJiBvcGVyYXRvcj0oVGVtcGRldmljZSYmIG90aGVyKSBub2V4Y2VwdCB7CisgICAgICAgIG5hbWVfID0gb3RoZXIubmFtZV87CisgICAgICAgIHZhbGlkXyA9IG90aGVyLnZhbGlkXzsKKyAgICAgICAgb3RoZXIudmFsaWRfID0gZmFsc2U7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBEZXZpY2VNYXBwZXImIGRtXzsKKyAgICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgICBzdGQ6OnN0cmluZyBwYXRoXzsKKyAgICBib29sIHZhbGlkXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9leHRyYWN0b3IuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL2V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1MzMxYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9leHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiZXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitFeHRyYWN0b3I6OkV4dHJhY3Rvcihjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9wYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgY293X3BhdGgpCisgICAgOiBiYXNlX3BhdGhfKGJhc2VfcGF0aCksIGNvd19wYXRoXyhjb3dfcGF0aCksIGNvbnRyb2xfbmFtZV8oInRlc3QiKSB7fQorCitib29sIEV4dHJhY3Rvcjo6SW5pdCgpIHsKKyAgICBhdXRvIG9wZW5lciA9IGZhY3RvcnlfLkNyZWF0ZVRlc3RPcGVuZXIoY29udHJvbF9uYW1lXyk7CisgICAgaGFuZGxlcl8gPSBzdGQ6Om1ha2Vfc2hhcmVkPFNuYXBzaG90SGFuZGxlcj4oY29udHJvbF9uYW1lXywgY293X3BhdGhfLCBiYXNlX3BhdGhfLCBiYXNlX3BhdGhfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lciwgMSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgaWYgKCFoYW5kbGVyXy0+SW5pdENvd0RldmljZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFoYW5kbGVyXy0+SW5pdGlhbGl6ZVdvcmtlcnMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmVhZF93b3JrZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxSZWFkV29ya2VyPihjb3dfcGF0aF8sIGJhc2VfcGF0aF8sIGNvbnRyb2xfbmFtZV8sIGJhc2VfcGF0aF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyXy0+R2V0U2hhcmVkUHRyKCksIG9wZW5lciwgZmFsc2UpOworICAgIGlmICghcmVhZF93b3JrZXJfLT5Jbml0KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBibG9ja19zZXJ2ZXJfID0gc3RhdGljX2Nhc3Q8VGVzdEJsb2NrU2VydmVyKj4ocmVhZF93b3JrZXJfLT5ibG9ja19zZXJ2ZXIoKSk7CisKKyAgICBoYW5kbGVyX3RocmVhZF8gPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgJlNuYXBzaG90SGFuZGxlcjo6U3RhcnQsIGhhbmRsZXJfLmdldCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworRXh0cmFjdG9yOjp+RXh0cmFjdG9yKCkgeworICAgIGZhY3RvcnlfLkRlbGV0ZVF1ZXVlKGNvbnRyb2xfbmFtZV8pOworfQorCitib29sIEV4dHJhY3Rvcjo6RXh0cmFjdChvZmZfdCBudW1fc2VjdG9ycywgY29uc3Qgc3RkOjpzdHJpbmcmIG91dF9wYXRoKSB7CisgICAgdW5pcXVlX2ZkIG91dF9mZChvcGVuKG91dF9wYXRoLmNfc3RyKCksIE9fUkRXUiB8IE9fQ0xPRVhFQyB8IE9fVFJVTkMgfCBPX0NSRUFULCAwNjY0KSk7CisgICAgaWYgKG91dF9mZCA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBvcGVuIGZvciB3cml0aW5nOiAiIDw8IG91dF9wYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChvZmZfdCBpID0gMDsgaSA8IG51bV9zZWN0b3JzOyBpKyspIHsKKyAgICAgICAgaWYgKCFyZWFkX3dvcmtlcl8tPlJlcXVlc3RTZWN0b3JzKGksIDUxMikpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJlYWQgc2VjdG9yICIgPDwgaSA8PCAiIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHN0ZDo6bW92ZShibG9ja19zZXJ2ZXJfLT5zZW50X2lvKCkpOworICAgICAgICBvZmZfdCBvZmZzZXQgPSBpICogNTEyOworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHlBdE9mZnNldChvdXRfZmQsIHJlc3VsdC5kYXRhKCksIHJlc3VsdC5zaXplKCksIG9mZnNldCkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvZXh0cmFjdG9yLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvZXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyODViMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9leHRyYWN0b3IuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgIm1lcmdlX3dvcmtlci5oIgorI2luY2x1ZGUgInJlYWRfd29ya2VyLmgiCisjaW5jbHVkZSAic25hcHVzZXJkX2NvcmUuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2hvc3RfaGFybmVzcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitjbGFzcyBFeHRyYWN0b3IgZmluYWwgeworICBwdWJsaWM6CisgICAgRXh0cmFjdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfcGF0aCk7CisgICAgfkV4dHJhY3RvcigpOworCisgICAgYm9vbCBJbml0KCk7CisgICAgYm9vbCBFeHRyYWN0KG9mZl90IG51bV9zZWN0b3JzLCBjb25zdCBzdGQ6OnN0cmluZyYgb3V0X3BhdGgpOworCisgIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgYmFzZV9wYXRoXzsKKyAgICBzdGQ6OnN0cmluZyBjb3dfcGF0aF87CisKKyAgICBUZXN0QmxvY2tTZXJ2ZXJGYWN0b3J5IGZhY3RvcnlfOworICAgIEhvc3RUZXN0SGFybmVzcyBoYXJuZXNzXzsKKyAgICBzdGQ6OnN0cmluZyBjb250cm9sX25hbWVfOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IGhhbmRsZXJfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWFkV29ya2VyPiByZWFkX3dvcmtlcl87CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gaGFuZGxlcl90aHJlYWRfOworICAgIFRlc3RCbG9ja1NlcnZlciogYmxvY2tfc2VydmVyXyA9IG51bGxwdHI7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvaGFuZGxlcl9tYW5hZ2VyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9oYW5kbGVyX21hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMWU3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvaGFuZGxlcl9tYW5hZ2VyLmNwcApAQCAtMCwwICsxLDM4NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJoYW5kbGVyX21hbmFnZXIuaCIKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgIm1lcmdlX3dvcmtlci5oIgorI2luY2x1ZGUgInJlYWRfd29ya2VyLmgiCisjaW5jbHVkZSAic25hcHVzZXJkX2NvcmUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtNYXhNZXJnZVRocmVhZHMgPSAyOworCitIYW5kbGVyVGhyZWFkOjpIYW5kbGVyVGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCkKKyAgICA6IHNuYXB1c2VyZF8oc25hcHVzZXJkKSwgbWlzY19uYW1lXyhzbmFwdXNlcmRfLT5HZXRNaXNjTmFtZSgpKSB7fQorCit2b2lkIEhhbmRsZXJUaHJlYWQ6OkZyZWVSZXNvdXJjZXMoKSB7CisgICAgLy8gRWFjaCB3b3JrZXIgdGhyZWFkIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHNuYXB1c2VyZC4KKyAgICAvLyBDbGVhciB0aGVtIHNvIHRoYXQgYWxsIHRoZSByZXNvdXJjZXMKKyAgICAvLyBoZWxkIGJ5IHNuYXB1c2VyZCBpcyByZWxlYXNlZAorICAgIGlmIChzbmFwdXNlcmRfKSB7CisgICAgICAgIHNuYXB1c2VyZF8tPkZyZWVSZXNvdXJjZXMoKTsKKyAgICAgICAgc25hcHVzZXJkXyA9IG51bGxwdHI7CisgICAgfQorfQorCitTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyKCkgeworICAgIG1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfLnJlc2V0KGV2ZW50ZmQoMCwgRUZEX0NMT0VYRUMpKTsKKyAgICBpZiAobW9uaXRvcl9tZXJnZV9ldmVudF9mZF8gPT0gLTEpIHsKKyAgICAgICAgUExPRyhGQVRBTCkgPDwgIm1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfOiBmYWlsZWQgdG8gY3JlYXRlIGV2ZW50ZmQiOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+IFNuYXBzaG90SGFuZGxlck1hbmFnZXI6OkFkZEhhbmRsZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlX3BhdGgsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gb3BlbmVyLCBpbnQgbnVtX3dvcmtlcl90aHJlYWRzLCBib29sIHVzZV9pb3VyaW5nLAorICAgICAgICBib29sIG9fZGlyZWN0KSB7CisgICAgYXV0byBzbmFwdXNlcmQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNuYXBzaG90SGFuZGxlcj4oCisgICAgICAgICAgICBtaXNjX25hbWUsIGNvd19kZXZpY2VfcGF0aCwgYmFja2luZ19kZXZpY2UsIGJhc2VfcGF0aF9tZXJnZSwgb3BlbmVyLCBudW1fd29ya2VyX3RocmVhZHMsCisgICAgICAgICAgICB1c2VfaW91cmluZywgcGVyZm9ybV92ZXJpZmljYXRpb25fLCBvX2RpcmVjdCk7CisgICAgaWYgKCFzbmFwdXNlcmQtPkluaXRDb3dEZXZpY2UoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBTbmFwdXNlcmQiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAoIXNuYXB1c2VyZC0+SW5pdGlhbGl6ZVdvcmtlcnMoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3JrZXJzIjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYXV0byBoYW5kbGVyID0gc3RkOjptYWtlX3NoYXJlZDxIYW5kbGVyVGhyZWFkPihzbmFwdXNlcmQpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworICAgICAgICBpZiAoRmluZEhhbmRsZXIoJmxvY2ssIG1pc2NfbmFtZSkgIT0gZG1fdXNlcnNfLmVuZCgpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJIYW5kbGVyIGFscmVhZHkgZXhpc3RzOiAiIDw8IG1pc2NfbmFtZTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGRtX3VzZXJzXy5wdXNoX2JhY2soaGFuZGxlcik7CisgICAgfQorICAgIHJldHVybiBoYW5kbGVyOworfQorCitib29sIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6OlN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBtaXNjX25hbWUpOworICAgIGlmIChpdGVyID09IGRtX3VzZXJzXy5lbmQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZmluZCBoYW5kbGVyOiAiIDw8IG1pc2NfbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoISgqaXRlciktPnNuYXB1c2VyZCgpIHx8ICgqaXRlciktPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJpZWQgdG8gcmUtYXR0YWNoIGNvbnRyb2wgZGV2aWNlOiAiIDw8IG1pc2NfbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIVN0YXJ0SGFuZGxlcigqaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpTdGFydEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+JiBoYW5kbGVyKSB7CisgICAgaWYgKGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGFuZGxlciBhbHJlYWR5IGF0dGFjaGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5BdHRhY2hDb250cm9sRGV2aWNlKCk7CisKKyAgICBoYW5kbGVyLT50aHJlYWQoKSA9IHN0ZDo6dGhyZWFkKHN0ZDo6YmluZCgmU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6UnVuVGhyZWFkLCB0aGlzLCBoYW5kbGVyKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6RGVsZXRlSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBtaXNjX25hbWUpOworICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIEFmdGVyIG1lcmdlIGlzIGNvbXBsZXRlZCwgd2Ugc3dhcCBkbS11c2VyIHRhYmxlIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIGRtLWxpbmVhciBiYXNlIGRldmljZS4gSGVuY2UsIHdvcmtlcgorICAgICAgICAgICAgLy8gdGhyZWFkcyB3b3VsZCBoYXZlIHRlcm1pbnRlZCBhbmQgd2FzIHJlbW92ZWQgZnJvbQorICAgICAgICAgICAgLy8gdGhlIGxpc3QuCisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJDb3VsZCBub3QgZmluZCBoYW5kbGVyOiAiIDw8IG1pc2NfbmFtZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoKml0ZXIpLT5UaHJlYWRUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgICgqaXRlciktPnNuYXB1c2VyZCgpLT5Ob3RpZnlJT1Rlcm1pbmF0ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVJlbW92ZUFuZEpvaW5IYW5kbGVyKG1pc2NfbmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpSdW5UaHJlYWQoc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+IGhhbmRsZXIpIHsKKyAgICBMT0coSU5GTykgPDwgIkVudGVyaW5nIHRocmVhZCBmb3IgaGFuZGxlcjogIiA8PCBoYW5kbGVyLT5taXNjX25hbWUoKTsKKworICAgIHB0aHJlYWRfc2V0bmFtZV9ucChwdGhyZWFkX3NlbGYoKSwgIkhhbmRsZXIiKTsKKworICAgIGlmICghaGFuZGxlci0+c25hcHVzZXJkKCktPlN0YXJ0KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiIEZhaWxlZCB0byBsYXVuY2ggYWxsIHdvcmtlciB0aHJlYWRzIjsKKyAgICB9CisKKyAgICBoYW5kbGVyLT5zbmFwdXNlcmQoKS0+Q2xvc2VGZHMoKTsKKyAgICBib29sIG1lcmdlX2NvbXBsZXRlZCA9IGhhbmRsZXItPnNuYXB1c2VyZCgpLT5DaGVja01lcmdlQ29tcGxldGlvblN0YXR1cygpOworICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Vbm1hcEJ1ZmZlclJlZ2lvbigpOworCisgICAgYXV0byBtaXNjX25hbWUgPSBoYW5kbGVyLT5taXNjX25hbWUoKTsKKyAgICBMT0coSU5GTykgPDwgIkhhbmRsZXIgdGhyZWFkIGFib3V0IHRvIGV4aXQ6ICIgPDwgbWlzY19uYW1lOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgICAgIGlmIChtZXJnZV9jb21wbGV0ZWQpIHsKKyAgICAgICAgICAgIG51bV9wYXJ0aXRpb25zX21lcmdlX2NvbXBsZXRlXyArPSAxOworICAgICAgICAgICAgYWN0aXZlX21lcmdlX3RocmVhZHNfIC09IDE7CisgICAgICAgICAgICBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGVyLT5TZXRUaHJlYWRUZXJtaW5hdGVkKCk7CisgICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBoYW5kbGVyLT5taXNjX25hbWUoKSk7CisgICAgICAgIGlmIChpdGVyID09IGRtX3VzZXJzXy5lbmQoKSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlQW5kSm9pbkhhbmRsZXIoKSBhbHJlYWR5IHJlbW92ZWQgdXMgZnJvbSB0aGUgbGlzdCwgYW5kIGlzCisgICAgICAgICAgICAvLyBub3cgd2FpdGluZyBvbiBhIGpvaW4oKSwgc28ganVzdCByZXR1cm4uIEFkZGl0aW9uYWxseSwgcmVsZWFzZQorICAgICAgICAgICAgLy8gYWxsIHRoZSByZXNvdXJjZXMgaGVsZCBieSBzbmFwdXNlcmQgb2JqZWN0IHdoaWNoIGFyZSBzaGFyZWQKKyAgICAgICAgICAgIC8vIGJ5IHdvcmtlciB0aHJlYWRzLiBUaGlzIHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlCisgICAgICAgICAgICAvLyBvZiAiaGFuZGxlciIgaXMgcmVsZWFzZWQ7IGJ1dCB3ZSB3aWxsIGV4cGxpY2l0bHkgcmVsZWFzZSBoZXJlCisgICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgc25hcHVzZXJkIG9iamVjdCBpcyBmcmVlZCBhcyBpdCBpcyB0aGUgYmlnZ2VzdAorICAgICAgICAgICAgLy8gY29uc3VtZXIgb2YgbWVtb3J5IGluIHRoZSBkYWVtb24uCisgICAgICAgICAgICBoYW5kbGVyLT5GcmVlUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkV4aXRpbmcgaGFuZGxlciB0aHJlYWQgdG8gYWxsb3cgZm9yIGpvaW46ICIgPDwgbWlzY19uYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTE9HKElORk8pIDw8ICJFeGl0aW5nIGhhbmRsZXIgdGhyZWFkIGFuZCBmcmVlaW5nIHJlc291cmNlczogIiA8PCBtaXNjX25hbWU7CisKKyAgICAgICAgaWYgKGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZXItPnRocmVhZCgpLmRldGFjaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW1wb3J0YW50OiBmcmVlIHJlc291cmNlcyB3aXRoaW4gdGhlIGxvY2suIFRoaXMgZW5zdXJlcyB0aGF0IGlmCisgICAgICAgIC8vIFdhaXRGb3JEZWxldGUoKSBpcyBjYWxsZWQsIHRoZSBoYW5kbGVyIGlzIGVpdGhlciBpbiB0aGUgbGlzdCwgb3IKKyAgICAgICAgLy8gaXQncyBub3QgYW5kIGl0cyByZXNvdXJjZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZnJlZWQuCisgICAgICAgIGhhbmRsZXItPkZyZWVSZXNvdXJjZXMoKTsKKyAgICAgICAgZG1fdXNlcnNfLmVyYXNlKGl0ZXIpOworICAgIH0KK30KKworYm9vbCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpJbml0aWF0ZU1lcmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgYXV0byBpdGVyID0gRmluZEhhbmRsZXIoJmxvY2ssIG1pc2NfbmFtZSk7CisgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBmaW5kIGhhbmRsZXI6ICIgPDwgbWlzY19uYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXJ0TWVyZ2UoJmxvY2ssICppdGVyKTsKK30KKworYm9vbCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpTdGFydE1lcmdlKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpIHsKKyAgICBDSEVDSyhwcm9vZl9vZl9sb2NrKTsKKworICAgIGlmICghaGFuZGxlci0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJIYW5kbGVyIG5vdCBhdHRhY2hlZCB0byBkbS11c2VyIC0gTWVyZ2UgdGhyZWFkIGNhbm5vdCBiZSBzdGFydGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Nb25pdG9yTWVyZ2UoKTsKKworICAgIGlmICghbWVyZ2VfbW9uaXRvcl8uam9pbmFibGUoKSkgeworICAgICAgICBtZXJnZV9tb25pdG9yXyA9IHN0ZDo6dGhyZWFkKCZTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpNb25pdG9yTWVyZ2UsIHRoaXMpOworICAgIH0KKworICAgIG1lcmdlX2hhbmRsZXJzXy5wdXNoKGhhbmRsZXIpOworICAgIFdha2V1cE1vbml0b3JNZXJnZVRocmVhZCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6Oldha2V1cE1vbml0b3JNZXJnZVRocmVhZCgpIHsKKyAgICB1aW50NjRfdCBub3RpZnkgPSAxOworICAgIHNzaXplX3QgcmMgPSBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUobW9uaXRvcl9tZXJnZV9ldmVudF9mZF8uZ2V0KCksICZub3RpZnksIHNpemVvZihub3RpZnkpKSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBQTE9HKEZBVEFMKSA8PCAiZmFpbGVkIHRvIG5vdGlmeSBtb25pdG9yIG1lcmdlIHRocmVhZCI7CisgICAgfQorfQorCit2b2lkIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6Ok1vbml0b3JNZXJnZSgpIHsKKyAgICBwdGhyZWFkX3NldG5hbWVfbnAocHRocmVhZF9zZWxmKCksICJNZXJnZSBNb25pdG9yIik7CisgICAgd2hpbGUgKCFzdG9wX21vbml0b3JfbWVyZ2VfdGhyZWFkXykgeworICAgICAgICB1aW50NjRfdCB0ZXN0VmFsOworICAgICAgICBzc2l6ZV90IHJldCA9CisgICAgICAgICAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQobW9uaXRvcl9tZXJnZV9ldmVudF9mZF8uZ2V0KCksICZ0ZXN0VmFsLCBzaXplb2YodGVzdFZhbCkpKTsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byByZWFkIGZyb20gZXZlbnRmZCI7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkhpdCBFT0Ygb24gZXZlbnRmZCI7CisgICAgICAgIH0KKworICAgICAgICBMT0coSU5GTykgPDwgIk1vbml0b3JNZXJnZTogYWN0aXZlLW1lcmdlLXRocmVhZHM6ICIgPDwgYWN0aXZlX21lcmdlX3RocmVhZHNfOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgICAgICAgICB3aGlsZSAoYWN0aXZlX21lcmdlX3RocmVhZHNfIDwga01heE1lcmdlVGhyZWFkcyAmJiBtZXJnZV9oYW5kbGVyc18uc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGF1dG8gaGFuZGxlciA9IG1lcmdlX2hhbmRsZXJzXy5mcm9udCgpOworICAgICAgICAgICAgICAgIG1lcmdlX2hhbmRsZXJzXy5wb3AoKTsKKworICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci0+c25hcHVzZXJkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJNb25pdG9yTWVyZ2U6IHNraXBwaW5nIGRlbGV0ZWQgaGFuZGxlcjogIiA8PCBoYW5kbGVyLT5taXNjX25hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJTdGFydGluZyBtZXJnZSBmb3IgcGFydGl0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGhhbmRsZXItPnNuYXB1c2VyZCgpLT5HZXRNaXNjTmFtZSgpOworICAgICAgICAgICAgICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Jbml0aWF0ZU1lcmdlKCk7CisgICAgICAgICAgICAgICAgYWN0aXZlX21lcmdlX3RocmVhZHNfICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIkV4aXRpbmcgTW9uaXRvck1lcmdlOiBzaXplOiAiIDw8IG1lcmdlX2hhbmRsZXJzXy5zaXplKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6OkdldE1lcmdlU3RhdHVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgYXV0byBpdGVyID0gRmluZEhhbmRsZXIoJmxvY2ssIG1pc2NfbmFtZSk7CisgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBmaW5kIGhhbmRsZXI6ICIgPDwgbWlzY19uYW1lOworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgcmV0dXJuICgqaXRlciktPnNuYXB1c2VyZCgpLT5HZXRNZXJnZVN0YXR1cygpOworfQorCitkb3VibGUgU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6R2V0TWVyZ2VQZXJjZW50YWdlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKKworICAgIGRvdWJsZSBwZXJjZW50YWdlID0gMC4wOworICAgIGludCBuID0gMDsKKworICAgIGZvciAoYXV0byBpdGVyID0gZG1fdXNlcnNfLmJlZ2luKCk7IGl0ZXIgIT0gZG1fdXNlcnNfLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgYXV0byYgdGggPSAoKml0ZXIpLT50aHJlYWQoKTsKKyAgICAgICAgaWYgKHRoLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIE1lcmdlIHBlcmNlbnRhZ2UgYnkgaW5kaXZpZHVhbCBwYXJ0aXRpb25zIHdoZXJlaW4gbWVyZ2UgaXMgc3RpbGwKKyAgICAgICAgICAgIC8vIGluLXByb2dyZXNzCisgICAgICAgICAgICBwZXJjZW50YWdlICs9ICgqaXRlciktPnNuYXB1c2VyZCgpLT5HZXRNZXJnZVBlcmNlbnRhZ2UoKTsKKyAgICAgICAgICAgIG4gKz0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSBmaW5hbCBtZXJnZSBpbmNsdWRpbmcgdGhvc2UgcGFydGl0aW9ucyB3aGVyZSBtZXJnZSB3YXMgYWxyZWFkeQorICAgIC8vIGNvbXBsZXRlZCAtIG51bV9wYXJ0aXRpb25zX21lcmdlX2NvbXBsZXRlXyB3aWxsIHRyYWNrIHRoZW0gd2hlbiBlYWNoCisgICAgLy8gdGhyZWFkIGV4aXN0cyBpbiBSdW5UaHJlYWQuCisgICAgaW50IHRvdGFsX3BhcnRpdGlvbnMgPSBuICsgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfOworCisgICAgaWYgKHRvdGFsX3BhcnRpdGlvbnMpIHsKKyAgICAgICAgcGVyY2VudGFnZSA9ICgobnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfICogMTAwLjApICsgcGVyY2VudGFnZSkgLyB0b3RhbF9wYXJ0aXRpb25zOworICAgIH0KKworICAgIExPRyhERUJVRykgPDwgIk1lcmdlICU6ICIgPDwgcGVyY2VudGFnZQorICAgICAgICAgICAgICAgPDwgIiBudW1fcGFydGl0aW9uc19tZXJnZV9jb21wbGV0ZV86ICIgPDwgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfCisgICAgICAgICAgICAgICA8PCAiIHRvdGFsX3BhcnRpdGlvbnM6ICIgPDwgdG90YWxfcGFydGl0aW9ucyA8PCAiIG46ICIgPDwgbjsKKyAgICByZXR1cm4gcGVyY2VudGFnZTsKK30KKworYm9vbCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpHZXRWZXJpZmljYXRpb25TdGF0dXMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworCisgICAgYm9vbCBzdGF0dXMgPSB0cnVlOworICAgIGZvciAoYXV0byBpdGVyID0gZG1fdXNlcnNfLmJlZ2luKCk7IGl0ZXIgIT0gZG1fdXNlcnNfLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgYXV0byYgdGggPSAoKml0ZXIpLT50aHJlYWQoKTsKKyAgICAgICAgaWYgKHRoLmpvaW5hYmxlKCkgJiYgc3RhdHVzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoKml0ZXIpLT5zbmFwdXNlcmQoKS0+Q2hlY2tQYXJ0aXRpb25WZXJpZmljYXRpb24oKSAmJiBzdGF0dXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlcmUgaXMgYSBmYWlsdXJlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitib29sIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6OlJlbW92ZUFuZEpvaW5IYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gaGFuZGxlcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKKworICAgICAgICBhdXRvIGl0ZXIgPSBGaW5kSGFuZGxlcigmbG9jaywgbWlzY19uYW1lKTsKKyAgICAgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7CisgICAgICAgICAgICAvLyBDbGllbnQgYWxyZWFkeSBkZWxldGVkLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlciA9IHN0ZDo6bW92ZSgqaXRlcik7CisgICAgICAgIGRtX3VzZXJzXy5lcmFzZShpdGVyKTsKKyAgICB9CisKKyAgICBhdXRvJiB0aCA9IGhhbmRsZXItPnRocmVhZCgpOworICAgIGlmICh0aC5qb2luYWJsZSgpKSB7CisgICAgICAgIHRoLmpvaW4oKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6VGVybWluYXRlTWVyZ2VUaHJlYWRzKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChsb2NrXyk7CisKKyAgICBmb3IgKGF1dG8gaXRlciA9IGRtX3VzZXJzXy5iZWdpbigpOyBpdGVyICE9IGRtX3VzZXJzXy5lbmQoKTsgaXRlcisrKSB7CisgICAgICAgIGlmICghKCppdGVyKS0+VGhyZWFkVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICAoKml0ZXIpLT5zbmFwdXNlcmQoKS0+Tm90aWZ5SU9UZXJtaW5hdGVkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6Sm9pbkFsbFRocmVhZHMoKSB7CisgICAgLy8gQWNxdWlyZSB0aGUgdGhyZWFkIGxpc3Qgd2l0aGluIHRoZSBsb2NrLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPj4gZG1fdXNlcnM7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobG9ja18pOworICAgICAgICBkbV91c2VycyA9IHN0ZDo6bW92ZShkbV91c2Vyc18pOworICAgIH0KKworICAgIGZvciAoYXV0byYgY2xpZW50IDogZG1fdXNlcnMpIHsKKyAgICAgICAgYXV0byYgdGggPSBjbGllbnQtPnRocmVhZCgpOworCisgICAgICAgIGlmICh0aC5qb2luYWJsZSgpKSB0aC5qb2luKCk7CisgICAgfQorCisgICAgaWYgKG1lcmdlX21vbml0b3JfLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgc3RvcF9tb25pdG9yX21lcmdlX3RocmVhZF8gPSB0cnVlOworICAgICAgICBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKKworICAgICAgICBtZXJnZV9tb25pdG9yXy5qb2luKCk7CisgICAgfQorfQorCithdXRvIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6OkZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgLT4gSGFuZGxlckxpc3Q6Oml0ZXJhdG9yIHsKKyAgICBDSEVDSyhwcm9vZl9vZl9sb2NrKTsKKworICAgIGZvciAoYXV0byBpdGVyID0gZG1fdXNlcnNfLmJlZ2luKCk7IGl0ZXIgIT0gZG1fdXNlcnNfLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgaWYgKCgqaXRlciktPm1pc2NfbmFtZSgpID09IG1pc2NfbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRtX3VzZXJzXy5lbmQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL2hhbmRsZXJfbWFuYWdlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL2hhbmRsZXJfbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2YwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvaGFuZGxlcl9tYW5hZ2VyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvYmxvY2tfc2VydmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIFNuYXBzaG90SGFuZGxlcjsKKworY2xhc3MgSGFuZGxlclRocmVhZCB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBIYW5kbGVyVGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCk7CisKKyAgICB2b2lkIEZyZWVSZXNvdXJjZXMoKTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiYgc25hcHVzZXJkKCkgY29uc3QgeyByZXR1cm4gc25hcHVzZXJkXzsgfQorICAgIHN0ZDo6dGhyZWFkJiB0aHJlYWQoKSB7IHJldHVybiB0aHJlYWRfOyB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKCkgY29uc3QgeyByZXR1cm4gbWlzY19uYW1lXzsgfQorICAgIGJvb2wgVGhyZWFkVGVybWluYXRlZCgpIHsgcmV0dXJuIHRocmVhZF90ZXJtaW5hdGVkXzsgfQorICAgIHZvaWQgU2V0VGhyZWFkVGVybWluYXRlZCgpIHsgdGhyZWFkX3Rlcm1pbmF0ZWRfID0gdHJ1ZTsgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjp0aHJlYWQgdGhyZWFkXzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmRfOworICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87CisgICAgYm9vbCB0aHJlYWRfdGVybWluYXRlZF8gPSBmYWxzZTsKK307CisKK2NsYXNzIElTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfklTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyKCkge30KKworICAgIC8vIEFkZCBhIG5ldyBzbmFwc2hvdCBoYW5kbGVyIGJ1dCBkbyBub3Qgc3RhcnQgc2VydmluZyByZXF1ZXN0cyB5ZXQuCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gQWRkSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBvcGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3dvcmtlcl90aHJlYWRzLCBib29sIHVzZV9pb3VyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvX2RpcmVjdCkgPSAwOworCisgICAgLy8gU3RhcnQgc2VydmluZyByZXF1ZXN0cyBvbiBhIHNuYXBzaG90IGhhbmRsZXIuCisgICAgdmlydHVhbCBib29sIFN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSA9IDA7CisKKyAgICAvLyBTdG9wIHNlcnZpbmcgcmVxdWVzdHMgb24gYSBzbmFwc2hvdCBoYW5kbGVyIGFuZCByZW1vdmUgaXQuCisgICAgdmlydHVhbCBib29sIERlbGV0ZUhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgPSAwOworCisgICAgLy8gQmVnaW4gbWVyZ2luZyBibG9ja3Mgb24gdGhlIGdpdmVuIHNuYXBzaG90IGhhbmRsZXIuCisgICAgdmlydHVhbCBib29sIEluaXRpYXRlTWVyZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgPSAwOworCisgICAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzdGF0dXMgY29kZSBpbmRpY2F0aW5nIHRoZSBtZXJnZSBzdGF0dXMKKyAgICAvLyBvbiB0aGUgaGFuZGxlci4gUmV0dXJucyBlbXB0eSBvbiBlcnJvci4KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldE1lcmdlU3RhdHVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpID0gMDsKKworICAgIC8vIFdhaXQgdW50aWwgYWxsIGhhbmRsZXJzIGhhdmUgdGVybWluYXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgSm9pbkFsbFRocmVhZHMoKSA9IDA7CisKKyAgICAvLyBTdG9wIGFueSBpbi1wcm9ncmVzcyBtZXJnZSB0aHJlYWRzLgorICAgIHZpcnR1YWwgdm9pZCBUZXJtaW5hdGVNZXJnZVRocmVhZHMoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBtZXJnZSBwcm9ncmVzcyBhY3Jvc3MgYWxsIG1lcmdpbmcgc25hcHNob3QgaGFuZGxlcnMuCisgICAgdmlydHVhbCBkb3VibGUgR2V0TWVyZ2VQZXJjZW50YWdlKCkgPSAwOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGFsbCBzbmFwc2hvdHMgaGF2ZSB2ZXJpZmllZC4KKyAgICB2aXJ0dWFsIGJvb2wgR2V0VmVyaWZpY2F0aW9uU3RhdHVzKCkgPSAwOworCisgICAgLy8gRGlzYWJsZSBwYXJ0aXRpb24gdmVyaWZpY2F0aW9uCisgICAgdmlydHVhbCB2b2lkIERpc2FibGVWZXJpZmljYXRpb24oKSA9IDA7Cit9OworCitjbGFzcyBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyIGZpbmFsIDogcHVibGljIElTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyIHsKKyAgcHVibGljOgorICAgIFNuYXBzaG90SGFuZGxlck1hbmFnZXIoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gQWRkSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gb3BlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fd29ya2VyX3RocmVhZHMsIGJvb2wgdXNlX2lvdXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvX2RpcmVjdCkgb3ZlcnJpZGU7CisgICAgYm9vbCBTdGFydEhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBEZWxldGVIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIG92ZXJyaWRlOworICAgIGJvb2wgSW5pdGlhdGVNZXJnZShjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBHZXRNZXJnZVN0YXR1cyhjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSBvdmVycmlkZTsKKyAgICB2b2lkIEpvaW5BbGxUaHJlYWRzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZXJtaW5hdGVNZXJnZVRocmVhZHMoKSBvdmVycmlkZTsKKyAgICBkb3VibGUgR2V0TWVyZ2VQZXJjZW50YWdlKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBHZXRWZXJpZmljYXRpb25TdGF0dXMoKSBvdmVycmlkZTsKKyAgICB2b2lkIERpc2FibGVWZXJpZmljYXRpb24oKSBvdmVycmlkZSB7IHBlcmZvcm1fdmVyaWZpY2F0aW9uXyA9IGZhbHNlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIFN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpOworICAgIHZvaWQgUnVuVGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiBoYW5kbGVyKTsKKyAgICBib29sIFN0YXJ0TWVyZ2Uoc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+KiBwcm9vZl9vZl9sb2NrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpOworICAgIHZvaWQgTW9uaXRvck1lcmdlKCk7CisgICAgdm9pZCBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKKyAgICBib29sIFJlbW92ZUFuZEpvaW5IYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpOworCisgICAgLy8gRmluZCBhIEhhbmRsZXJUaHJlYWQgd2l0aGluIGEgbG9jay4KKyAgICB1c2luZyBIYW5kbGVyTGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPj47CisgICAgSGFuZGxlckxpc3Q6Oml0ZXJhdG9yIEZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7CisKKyAgICBzdGQ6Om11dGV4IGxvY2tfOworICAgIEhhbmRsZXJMaXN0IGRtX3VzZXJzXzsKKworICAgIGJvb2wgc3RvcF9tb25pdG9yX21lcmdlX3RocmVhZF8gPSBmYWxzZTsKKyAgICBpbnQgYWN0aXZlX21lcmdlX3RocmVhZHNfID0gMDsKKyAgICBzdGQ6OnRocmVhZCBtZXJnZV9tb25pdG9yXzsKKyAgICBpbnQgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfID0gMDsKKyAgICBzdGQ6OnF1ZXVlPHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPj4gbWVyZ2VfaGFuZGxlcnNfOworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtb25pdG9yX21lcmdlX2V2ZW50X2ZkXzsKKyAgICBib29sIHBlcmZvcm1fdmVyaWZpY2F0aW9uXyA9IHRydWU7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX21lcmdlLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9tZXJnZV93b3JrZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIGZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfbWVyZ2UuY3BwCnJlbmFtZSB0byBmc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvbWVyZ2Vfd29ya2VyLmNwcAppbmRleCBkNTdmNDM0Li4xZTdkMGMwIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX21lcmdlLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvbWVyZ2Vfd29ya2VyLmNwcApAQCAtMTMsOCArMTMsMTIgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisjaW5jbHVkZSAibWVyZ2Vfd29ya2VyLmgiCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKICNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgorI2luY2x1ZGUgInV0aWxpdHkuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKQEAgLTIzLDE1ICsyNywyMCBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmRtOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogCi1pbnQgV29ya2VyOjpQcmVwYXJlTWVyZ2UodWludDY0X3QqIHNvdXJjZV9vZmZzZXQsIGludCogcGVuZGluZ19vcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ293T3BlcmF0aW9uKj4qIHJlcGxhY2VfemVyb192ZWMpIHsKK01lcmdlV29ya2VyOjpNZXJnZVdvcmtlcihjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9wYXRoX21lcmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCkKKyAgICA6IFdvcmtlcihjb3dfZGV2aWNlLCBtaXNjX25hbWUsIGJhc2VfcGF0aF9tZXJnZSwgc25hcHVzZXJkKSB7fQorCitpbnQgTWVyZ2VXb3JrZXI6OlByZXBhcmVNZXJnZSh1aW50NjRfdCogc291cmNlX29mZnNldCwgaW50KiBwZW5kaW5nX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+KiByZXBsYWNlX3plcm9fdmVjKSB7CiAgICAgaW50IG51bV9vcHMgPSAqcGVuZGluZ19vcHM7CiAgICAgaW50IG5yX2NvbnNlY3V0aXZlID0gMDsKICAgICBib29sIGNoZWNrT3JkZXJlZE9wID0gKHJlcGxhY2VfemVyb192ZWMgPT0gbnVsbHB0cik7CiAKICAgICBkbyB7Ci0gICAgICAgIGlmICghY293b3BfaXRlcl8tPkRvbmUoKSAmJiBudW1fb3BzKSB7Ci0gICAgICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9ICZjb3dvcF9pdGVyXy0+R2V0KCk7CisgICAgICAgIGlmICghY293b3BfaXRlcl8tPkF0RW5kKCkgJiYgbnVtX29wcykgeworICAgICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSBjb3dvcF9pdGVyXy0+R2V0KCk7CiAgICAgICAgICAgICBpZiAoY2hlY2tPcmRlcmVkT3AgJiYgIUlzT3JkZXJlZE9wKCpjb3dfb3ApKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC00NSw4ICs1NCw4IEBACiAgICAgICAgICAgICBudW1fb3BzIC09IDE7CiAgICAgICAgICAgICBucl9jb25zZWN1dGl2ZSA9IDE7CiAKLSAgICAgICAgICAgIHdoaWxlICghY293b3BfaXRlcl8tPkRvbmUoKSAmJiBudW1fb3BzKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBvcCA9ICZjb3dvcF9pdGVyXy0+R2V0KCk7CisgICAgICAgICAgICB3aGlsZSAoIWNvd29wX2l0ZXJfLT5BdEVuZCgpICYmIG51bV9vcHMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIG9wID0gY293b3BfaXRlcl8tPkdldCgpOwogICAgICAgICAgICAgICAgIGlmIChjaGVja09yZGVyZWRPcCAmJiAhSXNPcmRlcmVkT3AoKm9wKSkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC03MCwyMiArNzksMjIgQEAKICAgICByZXR1cm4gbnJfY29uc2VjdXRpdmU7CiB9CiAKLWJvb2wgV29ya2VyOjpNZXJnZVJlcGxhY2VaZXJvT3BzKCkgewotICAgIC8vIEZsdXNoIGFmdGVyIG1lcmdpbmcgMk1CLiBTaW5jZSBhbGwgb3BzIGFyZSBpbmRlcGVuZGVudCBhbmQgdGhlcmUgaXMgbm8KK2Jvb2wgTWVyZ2VXb3JrZXI6Ok1lcmdlUmVwbGFjZVplcm9PcHMoKSB7CisgICAgLy8gRmx1c2ggYWZ0ZXIgbWVyZ2luZyAxTUIuIFNpbmNlIGFsbCBvcHMgYXJlIGluZGVwZW5kZW50IGFuZCB0aGVyZSBpcyBubwogICAgIC8vIGRlcGVuZGVuY3kgYmV0d2VlbiBDT1cgb3BzLCB3ZSB3aWxsIGZsdXNoIHRoZSBkYXRhIGFuZCB0aGUgbnVtYmVyCiAgICAgLy8gb2Ygb3BzIG1lcmdlZCBpbiBDT1cgYmxvY2sgZGV2aWNlLiBJZiB0aGVyZSBpcyBhIGNyYXNoLCB3ZSB3aWxsCiAgICAgLy8gZW5kIHVwIHJlcGxheWluZyBzb21lIG9mIHRoZSBDT1cgb3BzIHdoaWNoIHdlcmUgYWxyZWFkeSBtZXJnZWQuIFRoYXQgaXMKICAgICAvLyBvay4KICAgICAvLwotICAgIC8vIEFsdGhvdWdoIGluY3JlYXNpbmcgdGhpcyBncmVhdGVyIHRoYW4gMk1CIG1heSBoZWxwIGluIGltcHJvdmluZyBtZXJnZQorICAgIC8vIEFsdGhvdWdoIGluY3JlYXNpbmcgdGhpcyBncmVhdGVyIHRoYW4gMU1CIG1heSBoZWxwIGluIGltcHJvdmluZyBtZXJnZQogICAgIC8vIHRpbWVzOyBob3dldmVyLCBvbiBkZXZpY2VzIHdpdGggbG93IG1lbW9yeSwgdGhpcyBjYW4gYmUgcHJvYmxlbWF0aWMKICAgICAvLyB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXJnZSB0aHJlYWRzIGluIHBhcmFsbGVsLgotICAgIGludCB0b3RhbF9vcHNfbWVyZ2VkX3Blcl9jb21taXQgPSAoUEFZTE9BRF9CVUZGRVJfU1ogLyBCTE9DS19TWikgKiAyOworICAgIGludCB0b3RhbF9vcHNfbWVyZ2VkX3Blcl9jb21taXQgPSAoUEFZTE9BRF9CVUZGRVJfU1ogLyBCTE9DS19TWik7CiAgICAgaW50IG51bV9vcHNfbWVyZ2VkID0gMDsKIAogICAgIFNOQVBfTE9HKElORk8pIDw8ICJNZXJnZVJlcGxhY2VaZXJvT3BzIHN0YXJ0ZWQuLi4uIjsKIAotICAgIHdoaWxlICghY293b3BfaXRlcl8tPkRvbmUoKSkgeworICAgIHdoaWxlICghY293b3BfaXRlcl8tPkF0RW5kKCkpIHsKICAgICAgICAgaW50IG51bV9vcHMgPSBQQVlMT0FEX0JVRkZFUl9TWiAvIEJMT0NLX1NaOwogICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiByZXBsYWNlX3plcm9fdmVjOwogICAgICAgICB1aW50NjRfdCBzb3VyY2Vfb2Zmc2V0OwpAQCAtOTMsMjYgKzEwMiwyNyBAQAogICAgICAgICBpbnQgbGluZWFyX2Jsb2NrcyA9IFByZXBhcmVNZXJnZSgmc291cmNlX29mZnNldCwgJm51bV9vcHMsICZyZXBsYWNlX3plcm9fdmVjKTsKICAgICAgICAgaWYgKGxpbmVhcl9ibG9ja3MgPT0gMCkgewogICAgICAgICAgICAgLy8gTWVyZ2UgY29tcGxldGUKLSAgICAgICAgICAgIENIRUNLKGNvd29wX2l0ZXJfLT5Eb25lKCkpOworICAgICAgICAgICAgQ0hFQ0soY293b3BfaXRlcl8tPkF0RW5kKCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcGxhY2VfemVyb192ZWMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gcmVwbGFjZV96ZXJvX3ZlY1tpXTsKLSAgICAgICAgICAgIGlmIChjb3dfb3AtPnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCkgewotICAgICAgICAgICAgICAgIGlmICghUHJvY2Vzc1JlcGxhY2VPcChjb3dfb3ApKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiTWVyZ2UgLSBSZXBsYWNlT3AgZmFpbGVkIGZvciBibG9jazogIiA8PCBjb3dfb3AtPm5ld19ibG9jazsKKworICAgICAgICAgICAgdm9pZCogYnVmZmVyID0gYnVmc2lua18uQWNxdWlyZUJ1ZmZlcihCTE9DS19TWik7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiQWNxdWlyZUJ1ZmZlciBmYWlsZWQgaW4gTWVyZ2VSZXBsYWNlT3BzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY293X29wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgICAgIGlmICghcmVhZGVyXy0+UmVhZERhdGEoY293X29wLCBidWZmZXIsIEJMT0NLX1NaKSkgeworICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIENPVyBpbiBtZXJnZSI7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLKGNvd19vcC0+dHlwZSA9PSBrQ293WmVyb09wKTsKLSAgICAgICAgICAgICAgICBpZiAoIVByb2Nlc3NaZXJvT3AoKSkgewotICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIk1lcmdlIFplcm9PcCBmYWlsZWQuIjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDSyhjb3dfb3AtPnR5cGUoKSA9PSBrQ293WmVyb09wKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBCTE9DS19TWik7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZnNpbmtfLlVwZGF0ZUJ1ZmZlck9mZnNldChCTE9DS19TWik7CiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgaW9fc2l6ZSA9IGxpbmVhcl9ibG9ja3MgKiBCTE9DS19TWjsKQEAgLTE0OSw3ICsxNTksNyBAQAogCiAgICAgICAgIGlmIChzbmFwdXNlcmRfLT5Jc0lPVGVybWluYXRlZCgpKSB7CiAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikKLSAgICAgICAgICAgICAgICAgICAgPDwgIk1lcmdlUmVwbGFjZVplcm9PcHM6IFdvcmtlciB0aHJlYWRzIHRlcm1pbmF0ZWQgLSBzaHV0dGluZyBkb3duIG1lcmdlIjsKKyAgICAgICAgICAgICAgICAgICAgPDwgIk1lcmdlUmVwbGFjZVplcm9PcHM6IE1lcmdlV29ya2VyIHRocmVhZHMgdGVybWluYXRlZCAtIHNodXR0aW5nIGRvd24gbWVyZ2UiOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTczLDE1ICsxODMsMTUgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBXb3JrZXI6Ok1lcmdlT3JkZXJlZE9wc0FzeW5jKCkgeworYm9vbCBNZXJnZVdvcmtlcjo6TWVyZ2VPcmRlcmVkT3BzQXN5bmMoKSB7CiAgICAgdm9pZCogbWFwcGVkX2FkZHIgPSBzbmFwdXNlcmRfLT5HZXRNYXBwZWRBZGRyKCk7CiAgICAgdm9pZCogcmVhZF9haGVhZF9idWZmZXIgPQogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KChjaGFyKiltYXBwZWRfYWRkciArIHNuYXB1c2VyZF8tPkdldEJ1ZmZlckRhdGFPZmZzZXQoKSk7CiAKICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiTWVyZ2VPcmRlcmVkT3BzQXN5bmMgc3RhcnRlZC4uLi4iOwogCi0gICAgd2hpbGUgKCFjb3dvcF9pdGVyXy0+RG9uZSgpKSB7Ci0gICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gJmNvd29wX2l0ZXJfLT5HZXQoKTsKKyAgICB3aGlsZSAoIWNvd29wX2l0ZXJfLT5BdEVuZCgpKSB7CisgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gY293b3BfaXRlcl8tPkdldCgpOwogICAgICAgICBpZiAoIUlzT3JkZXJlZE9wKCpjb3dfb3ApKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTkwLDYgKzIwMCw3IEBACiAgICAgICAgIC8vIFdhaXQgZm9yIFJBIHRocmVhZCB0byBub3RpZnkgdGhhdCB0aGUgbWVyZ2Ugd2luZG93CiAgICAgICAgIC8vIGlzIHJlYWR5IGZvciBtZXJnaW5nLgogICAgICAgICBpZiAoIXNuYXB1c2VyZF8tPldhaXRGb3JNZXJnZUJlZ2luKCkpIHsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHdhaXRpbmcgZm9yIG1lcmdlIHRvIGJlZ2luIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC0yOTUsNyArMzA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBmYWxsYmFjayB0byBzeW5jaHJvbm91cyBJL08uCiAgICAgICAgICAgICAgICAgICAgIHJldCA9IGlvX3VyaW5nX3dhaXRfY3FlKHJpbmdfLmdldCgpLCAmY3FlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJNZXJnZTogaW9fdXJpbmdfd2FpdF9jcWUgZmFpbGVkOiAiIDw8IHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiTWVyZ2U6IGlvX3VyaW5nX3dhaXRfY3FlIGZhaWxlZDogIiA8PCBzdHJlcnJvcigtcmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1NCwxNSArMzY1LDE1IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgV29ya2VyOjpNZXJnZU9yZGVyZWRPcHMoKSB7Citib29sIE1lcmdlV29ya2VyOjpNZXJnZU9yZGVyZWRPcHMoKSB7CiAgICAgdm9pZCogbWFwcGVkX2FkZHIgPSBzbmFwdXNlcmRfLT5HZXRNYXBwZWRBZGRyKCk7CiAgICAgdm9pZCogcmVhZF9haGVhZF9idWZmZXIgPQogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KChjaGFyKiltYXBwZWRfYWRkciArIHNuYXB1c2VyZF8tPkdldEJ1ZmZlckRhdGFPZmZzZXQoKSk7CiAKICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiTWVyZ2VPcmRlcmVkT3BzIHN0YXJ0ZWQuLi4uIjsKIAotICAgIHdoaWxlICghY293b3BfaXRlcl8tPkRvbmUoKSkgewotICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9ICZjb3dvcF9pdGVyXy0+R2V0KCk7CisgICAgd2hpbGUgKCFjb3dvcF9pdGVyXy0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9IGNvd29wX2l0ZXJfLT5HZXQoKTsKICAgICAgICAgaWYgKCFJc09yZGVyZWRPcCgqY293X29wKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQzOSwxMSArNDUwLDExIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgV29ya2VyOjpBc3luY01lcmdlKCkgeworYm9vbCBNZXJnZVdvcmtlcjo6QXN5bmNNZXJnZSgpIHsKICAgICBpZiAoIU1lcmdlT3JkZXJlZE9wc0FzeW5jKCkpIHsKICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJNZXJnZU9yZGVyZWRPcHNBc3luYyBmYWlsZWQgLSBGYWxsaW5nIGJhY2sgdG8gc3luY2hyb25vdXMgSS9PIjsKICAgICAgICAgLy8gUmVzZXQgdGhlIGl0ZXIgc28gdGhhdCB3ZSByZXRyeSB0aGUgbWVyZ2UKLSAgICAgICAgd2hpbGUgKGJsb2Nrc19tZXJnZWRfaW5fZ3JvdXBfICYmICFjb3dvcF9pdGVyXy0+UkRvbmUoKSkgeworICAgICAgICB3aGlsZSAoYmxvY2tzX21lcmdlZF9pbl9ncm91cF8gJiYgIWNvd29wX2l0ZXJfLT5BdEJlZ2luKCkpIHsKICAgICAgICAgICAgIGNvd29wX2l0ZXJfLT5QcmV2KCk7CiAgICAgICAgICAgICBibG9ja3NfbWVyZ2VkX2luX2dyb3VwXyAtPSAxOwogICAgICAgICB9CkBAIC00NTUsNyArNDY2LDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBXb3JrZXI6OlN5bmNNZXJnZSgpIHsKK2Jvb2wgTWVyZ2VXb3JrZXI6OlN5bmNNZXJnZSgpIHsKICAgICBpZiAoIU1lcmdlT3JkZXJlZE9wcygpKSB7CiAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiTWVyZ2UgZmFpbGVkIGZvciBvcmRlcmVkIG9wcyI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQ2NSw3ICs0NzYsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFdvcmtlcjo6TWVyZ2UoKSB7Citib29sIE1lcmdlV29ya2VyOjpNZXJnZSgpIHsKICAgICBjb3dvcF9pdGVyXyA9IHJlYWRlcl8tPkdldE9wSXRlcih0cnVlKTsKIAogICAgIGJvb2wgcmV0cnkgPSBmYWxzZTsKQEAgLTUxMSw3ICs1MjIsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFdvcmtlcjo6SW5pdGlhbGl6ZUlvdXJpbmcoKSB7Citib29sIE1lcmdlV29ya2VyOjpJbml0aWFsaXplSW91cmluZygpIHsKICAgICBpZiAoIXNuYXB1c2VyZF8tPklzSW91cmluZ1N1cHBvcnRlZCgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC01MzAsMjUgKzU0MSwzNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFdvcmtlcjo6RmluYWxpemVJb3VyaW5nKCkgewordm9pZCBNZXJnZVdvcmtlcjo6RmluYWxpemVJb3VyaW5nKCkgewogICAgIGlmIChtZXJnZV9hc3luY18pIHsKICAgICAgICAgaW9fdXJpbmdfcXVldWVfZXhpdChyaW5nXy5nZXQoKSk7CiAgICAgfQogfQogCi1ib29sIFdvcmtlcjo6UnVuTWVyZ2VUaHJlYWQoKSB7Citib29sIE1lcmdlV29ya2VyOjpSdW4oKSB7CiAgICAgU05BUF9MT0coREVCVUcpIDw8ICJXYWl0aW5nIGZvciBtZXJnZSBiZWdpbi4uLiI7CisKKyAgICBwdGhyZWFkX3NldG5hbWVfbnAocHRocmVhZF9zZWxmKCksICJNZXJnZVdvcmtlciIpOworCiAgICAgaWYgKCFzbmFwdXNlcmRfLT5XYWl0Rm9yTWVyZ2VCZWdpbigpKSB7CiAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiTWVyZ2UgdGVybWluYXRlZCBlYXJseS4uLiI7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGlmIChzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIGdldHRpZCgpLCBrTmljZVZhbHVlRm9yTWVyZ2VUaHJlYWRzKSkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHByaW9yaXR5IGZvciBUSUQ6ICIgPDwgZ2V0dGlkKCk7CisgICAgaWYgKCFTZXRUaHJlYWRQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpKSB7CisgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgdGhyZWFkIHByaW9yaXR5IjsKKyAgICB9CisKKyAgICBpZiAoIVNldFByb2ZpbGVzKHsiQ1BVU0VUX1NQX0JBQ0tHUk9VTkQifSkpIHsKKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFzc2lnbiB0YXNrIHByb2ZpbGUgdG8gTWVyZ2V3b3JrZXIgdGhyZWFkIjsKICAgICB9CiAKICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiTWVyZ2Ugc3RhcnRpbmcuLiI7CiAKKyAgICBidWZzaW5rXy5Jbml0aWFsaXplKFBBWUxPQURfQlVGRkVSX1NaKTsKKwogICAgIGlmICghSW5pdCgpKSB7CiAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiTWVyZ2UgdGhyZWFkIGluaXRpYWxpemF0aW9uIGZhaWxlZC4uLiI7CiAgICAgICAgIHNuYXB1c2VyZF8tPk1lcmdlRmFpbGVkKCk7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvbWVyZ2Vfd29ya2VyLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvbWVyZ2Vfd29ya2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4ZDRjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9tZXJnZV93b3JrZXIuaApAQCAtMCwwICsxLDU5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAid29ya2VyLmgiCisKKyNpbmNsdWRlIDxsaWJ1cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitjbGFzcyBNZXJnZVdvcmtlciA6IHB1YmxpYyBXb3JrZXIgeworICBwdWJsaWM6CisgICAgTWVyZ2VXb3JrZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkKTsKKyAgICBib29sIFJ1bigpOworCisgIHByaXZhdGU6CisgICAgaW50IFByZXBhcmVNZXJnZSh1aW50NjRfdCogc291cmNlX29mZnNldCwgaW50KiBwZW5kaW5nX29wcywKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+KiByZXBsYWNlX3plcm9fdmVjID0gbnVsbHB0cik7CisgICAgYm9vbCBNZXJnZVJlcGxhY2VaZXJvT3BzKCk7CisgICAgYm9vbCBNZXJnZU9yZGVyZWRPcHMoKTsKKyAgICBib29sIE1lcmdlT3JkZXJlZE9wc0FzeW5jKCk7CisgICAgYm9vbCBNZXJnZSgpOworICAgIGJvb2wgQXN5bmNNZXJnZSgpOworICAgIGJvb2wgU3luY01lcmdlKCk7CisgICAgYm9vbCBJbml0aWFsaXplSW91cmluZygpOworICAgIHZvaWQgRmluYWxpemVJb3VyaW5nKCk7CisKKyAgcHJpdmF0ZToKKyAgICBCdWZmZXJTaW5rIGJ1ZnNpbmtfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBjb3dvcF9pdGVyXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGlvX3VyaW5nPiByaW5nXzsKKyAgICBzaXplX3QgcmFfYmxvY2tfaW5kZXhfID0gMDsKKyAgICB1aW50NjRfdCBibG9ja3NfbWVyZ2VkX2luX2dyb3VwXyA9IDA7CisgICAgYm9vbCBtZXJnZV9hc3luY18gPSBmYWxzZTsKKyAgICAvLyBRdWV1ZSBkZXB0aCBvZiA4IHNlZW1zIG9wdGltYWwuIFdlIGRvbid0IHdhbnQKKyAgICAvLyB0byBoYXZlIGEgaHVnZSBkZXB0aCBhcyBpdCBtYXkgcHV0IG1vcmUgbWVtb3J5IHByZXNzdXJlCisgICAgLy8gb24gdGhlIGtlcm5lbCB3b3JrZXIgdGhyZWFkcyBnaXZlbiB0aGF0IHdlIHVzZQorICAgIC8vIElPU1FFX0FTWU5DIGZsYWcgLSBBU1lOQyBmbGFncyBjYW4gcG90ZW50aWFsbHkKKyAgICAvLyByZXN1bHQgaW4gRUlOVFI7IFNpbmNlIHdlIGRvbid0IHJlc3RhcnQKKyAgICAvLyBzeXNjYWxscyBhbmQgZmFsbGJhY2sgdG8gc3luY2hyb25vdXMgSS9PLCB3ZQorICAgIC8vIGRvbid0IHdhbnQgaHVnZSBxdWV1ZSBkZXB0aAorICAgIGludCBxdWV1ZV9kZXB0aF8gPSA4OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3JlYWRfd29ya2VyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9yZWFkX3dvcmtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkNDA2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9yZWFkX3dvcmtlci5jcHAKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicmVhZF93b3JrZXIuaCIKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCisjaW5jbHVkZSAidXRpbGl0eS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpkbTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKwordm9pZCBSZWFkV29ya2VyOjpDbG9zZUZkcygpIHsKKyAgICBibG9ja19zZXJ2ZXJfID0ge307CisgICAgYmFja2luZ19zdG9yZV9mZF8gPSB7fTsKKyAgICBiYWNraW5nX3N0b3JlX2RpcmVjdF9mZF8gPSB7fTsKKyAgICBXb3JrZXI6OkNsb3NlRmRzKCk7Cit9CisKK1JlYWRXb3JrZXI6OlJlYWRXb3JrZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBvcGVuZXIsIGJvb2wgZGlyZWN0X3JlYWQpCisgICAgOiBXb3JrZXIoY293X2RldmljZSwgbWlzY19uYW1lLCBiYXNlX3BhdGhfbWVyZ2UsIHNuYXB1c2VyZCksCisgICAgICBiYWNraW5nX3N0b3JlX2RldmljZV8oYmFja2luZ19kZXZpY2UpLAorICAgICAgZGlyZWN0X3JlYWRfKGRpcmVjdF9yZWFkKSwKKyAgICAgIGJsb2NrX3NlcnZlcl9vcGVuZXJfKG9wZW5lciksCisgICAgICBhbGlnbmVkX2J1ZmZlcl8oc3RkOjp1bmlxdWVfcHRyPHZvaWQsIGRlY2x0eXBlKCY6OmZyZWUpPihudWxscHRyLCAmOjpmcmVlKSkge30KKworLy8gU3RhcnQgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uLiBUaGlzIHdpbGwgcmVhZCB0aGUKKy8vIGludGVybmFsIENPVyBmb3JtYXQgYW5kIGlmIHRoZSBibG9jayBpcyBjb21wcmVzc2VkLAorLy8gaXQgd2lsbCBiZSBkZS1jb21wcmVzc2VkLgorYm9vbCBSZWFkV29ya2VyOjpQcm9jZXNzUmVwbGFjZU9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB2b2lkKiBidWZmZXIpIHsKKyAgICBpZiAoIXJlYWRlcl8tPlJlYWREYXRhKGNvd19vcCwgYnVmZmVyLCBCTE9DS19TWikpIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJQcm9jZXNzUmVwbGFjZU9wIGZhaWxlZCBmb3IgYmxvY2sgIiA8PCBjb3dfb3AtPm5ld19ibG9jazsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZWFkV29ya2VyOjpSZWFkRnJvbVNvdXJjZURldmljZShjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKSB7CisgICAgdWludDY0X3Qgb2Zmc2V0OworICAgIGlmICghcmVhZGVyXy0+R2V0U291cmNlT2Zmc2V0KGNvd19vcCwgJm9mZnNldCkpIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkRnJvbVNvdXJjZURldmljZTogRmFpbGVkIHRvIGdldCBzb3VyY2Ugb2Zmc2V0IjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTTkFQX0xPRyhERUJVRykgPDwgIiBSZWFkRnJvbUJhc2VEZXZpY2UuLi46IG5ldy1ibG9jazogIiA8PCBjb3dfb3AtPm5ld19ibG9jaworICAgICAgICAgICAgICAgICAgICA8PCAiIE9wOiAiIDw8ICpjb3dfb3A7CisKKyAgICBpZiAoZGlyZWN0X3JlYWRfICYmIElzQmxvY2tBbGlnbmVkKG9mZnNldCkpIHsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYWNraW5nX3N0b3JlX2RpcmVjdF9mZF8sIGFsaWduZWRfYnVmZmVyXy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TWiwgb2Zmc2V0KSkgeworICAgICAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiT19ESVJFQ1QgUmVhZCBmYWlsZWQgYXQgb2Zmc2V0OiAiIDw8IG9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6Om1lbWNweShidWZmZXIsIGFsaWduZWRfYnVmZmVyXy5nZXQoKSwgQkxPQ0tfU1opOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhY2tpbmdfc3RvcmVfZmRfLCBidWZmZXIsIEJMT0NLX1NaLCBvZmZzZXQpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9wOworICAgICAgICBpZiAoY293X29wLT50eXBlKCkgPT0ga0Nvd0NvcHlPcCkKKyAgICAgICAgICAgIG9wID0gIkNvcHktb3AiOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG9wID0gIlhvci1vcCI7CisgICAgICAgIH0KKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCBvcCA8PCAiIGZhaWxlZC4gUmVhZCBmcm9tIGJhY2tpbmcgc3RvcmU6ICIgPDwgYmFja2luZ19zdG9yZV9kZXZpY2VfCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImF0IGJsb2NrIDoiIDw8IG9mZnNldCAvIEJMT0NLX1NaIDw8ICIgb2Zmc2V0OiIgPDwgb2Zmc2V0ICUgQkxPQ0tfU1o7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU3RhcnQgdGhlIGNvcHkgb3BlcmF0aW9uLiBUaGlzIHdpbGwgcmVhZCB0aGUgYmFja2luZworLy8gYmxvY2sgZGV2aWNlIHdoaWNoIGlzIHJlcHJlc2VudGVkIGJ5IGNvd19vcC0+c291cmNlLgorYm9vbCBSZWFkV29ya2VyOjpQcm9jZXNzQ29weU9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB2b2lkKiBidWZmZXIpIHsKKyAgICBpZiAoIVJlYWRGcm9tU291cmNlRGV2aWNlKGNvd19vcCwgYnVmZmVyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJlYWRXb3JrZXI6OlByb2Nlc3NYb3JPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKSB7CisgICAgaWYgKCFSZWFkRnJvbVNvdXJjZURldmljZShjb3dfb3AsIGJ1ZmZlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh4b3JfYnVmZmVyXy5lbXB0eSgpKSB7CisgICAgICAgIHhvcl9idWZmZXJfLnJlc2l6ZShCTE9DS19TWik7CisgICAgfQorICAgIENIRUNLKHhvcl9idWZmZXJfLnNpemUoKSA9PSBCTE9DS19TWik7CisKKyAgICBzc2l6ZV90IHNpemUgPSByZWFkZXJfLT5SZWFkRGF0YShjb3dfb3AsIHhvcl9idWZmZXJfLmRhdGEoKSwgeG9yX2J1ZmZlcl8uc2l6ZSgpKTsKKyAgICBpZiAoc2l6ZSAhPSBCTE9DS19TWikgeworICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NYb3JPcCBmYWlsZWQgZm9yIGJsb2NrICIgPDwgY293X29wLT5uZXdfYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHJldHVybiB2YWx1ZTogIiA8PCBzaXplOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byB4b3Jfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEJMT0NLX1NaOyBpKyspIHsKKyAgICAgICAgeG9yX291dFtpXSBePSB4b3JfYnVmZmVyX1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UHJvY2Vzc1plcm9PcCh2b2lkKiBidWZmZXIpIHsKKyAgICBtZW1zZXQoYnVmZmVyLCAwLCBCTE9DS19TWik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UHJvY2Vzc09yZGVyZWRPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKSB7CisgICAgTUVSR0VfR1JPVVBfU1RBVEUgc3RhdGUgPSBzbmFwdXNlcmRfLT5Qcm9jZXNzTWVyZ2luZ0Jsb2NrKGNvd19vcC0+bmV3X2Jsb2NrLCBidWZmZXIpOworCisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9DT01QTEVURUQ6IHsKKyAgICAgICAgICAgIC8vIE1lcmdlIGlzIGNvbXBsZXRlZCBmb3IgdGhpcyBDT1cgb3A7IGp1c3QgcmVhZCBkaXJlY3RseSBmcm9tCisgICAgICAgICAgICAvLyB0aGUgYmFzZSBkZXZpY2UKKyAgICAgICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiTWVyZ2UtY29tcGxldGVkOiBSZWFkaW5nIGZyb20gYmFzZSBkZXZpY2Ugc2VjdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGNvd19vcC0+bmV3X2Jsb2NrID4+IFNFQ1RPUl9TSElGVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIEJsb2NrLW51bWJlcjogIiA8PCBjb3dfb3AtPm5ld19ibG9jazsKKyAgICAgICAgICAgIGlmICghUmVhZERhdGFGcm9tQmFzZURldmljZShDaHVua1RvU2VjdG9yKGNvd19vcC0+bmV3X2Jsb2NrKSwgYnVmZmVyLCBCTE9DS19TWikpIHsKKyAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWREYXRhRnJvbUJhc2VEZXZpY2UgYXQgc2VjdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChjb3dfb3AtPm5ld19ibG9jayA+PiBTRUNUT1JfU0hJRlQpIDw8ICIgYWZ0ZXIgbWVyZ2UtY29tcGxldGUuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9QRU5ESU5HOiB7CisgICAgICAgICAgICBib29sIHJldDsKKyAgICAgICAgICAgIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293Q29weU9wKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gUHJvY2Vzc0NvcHlPcChjb3dfb3AsIGJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IFByb2Nlc3NYb3JPcChjb3dfb3AsIGJ1ZmZlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEkvTyBpcyBjb21wbGV0ZSAtIGRlY3JlbWVudCB0aGUgcmVmY291bnQgaXJyZXNwZWN0aXZlIG9mIHRoZSByZXR1cm4KKyAgICAgICAgICAgIC8vIHN0YXR1cworICAgICAgICAgICAgc25hcHVzZXJkXy0+Tm90aWZ5SU9Db21wbGV0aW9uKGNvd19vcC0+bmV3X2Jsb2NrKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIHRoZSBkYXRhIGluIHRoZSBidWZmZXIgcmV0cmlldmVkIGZyb20gUkEgdGhyZWFkLgorICAgICAgICAvLyBOb3RoaW5nIHRvIHByb2Nlc3MgZnVydGhlci4KKyAgICAgICAgY2FzZSBNRVJHRV9HUk9VUF9TVEFURTo6R1JPVVBfTUVSR0VfUkFfUkVBRFk6IHsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9JTl9QUk9HUkVTUzogeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgLy8gQWxsIG90aGVyIHN0YXRlcywgZmFpbCB0aGUgSS9PIHZpeiAoR1JPVVBfTUVSR0VfRkFJTEVEIGFuZCBHUk9VUF9JTlZBTElEKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlYWRXb3JrZXI6OlByb2Nlc3NDb3dPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKSB7CisgICAgaWYgKGNvd19vcCA9PSBudWxscHRyKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc0Nvd09wOiBJbnZhbGlkIGNvd19vcCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvd19vcC0+dHlwZSgpKSB7CisgICAgICAgIGNhc2Uga0Nvd1JlcGxhY2VPcDogeworICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NSZXBsYWNlT3AoY293X29wLCBidWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrQ293WmVyb09wOiB7CisgICAgICAgICAgICByZXR1cm4gUHJvY2Vzc1plcm9PcChidWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrQ293Q29weU9wOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIGtDb3dYb3JPcDogeworICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NPcmRlcmVkT3AoY293X29wLCBidWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJVbmtub3duIG9wZXJhdGlvbi10eXBlIGZvdW5kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dWludDhfdD4oY293X29wLT50eXBlKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZWFkV29ya2VyOjpJbml0KCkgeworICAgIGlmICghV29ya2VyOjpJbml0KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJhY2tpbmdfc3RvcmVfZmRfLnJlc2V0KG9wZW4oYmFja2luZ19zdG9yZV9kZXZpY2VfLmNfc3RyKCksIE9fUkRPTkxZKSk7CisgICAgaWYgKGJhY2tpbmdfc3RvcmVfZmRfIDwgMCkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcGVuIEZhaWxlZDogIiA8PCBiYWNraW5nX3N0b3JlX2RldmljZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZGlyZWN0X3JlYWRfKSB7CisgICAgICAgIGJhY2tpbmdfc3RvcmVfZGlyZWN0X2ZkXy5yZXNldChvcGVuKGJhY2tpbmdfc3RvcmVfZGV2aWNlXy5jX3N0cigpLCBPX1JET05MWSB8IE9fRElSRUNUKSk7CisgICAgICAgIGlmIChiYWNraW5nX3N0b3JlX2RpcmVjdF9mZF8gPCAwKSB7CisgICAgICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcGVuIEZhaWxlZCB3aXRoIE9fRElSRUNUOiAiIDw8IGJhY2tpbmdfc3RvcmVfZGlyZWN0X2ZkXzsKKyAgICAgICAgICAgIGRpcmVjdF9yZWFkXyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pZCogYWxpZ25lZF9hZGRyOworICAgICAgICAgICAgc3NpemVfdCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworICAgICAgICAgICAgaWYgKHBvc2l4X21lbWFsaWduKCZhbGlnbmVkX2FkZHIsIHBhZ2Vfc2l6ZSwgcGFnZV9zaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBkaXJlY3RfcmVhZF8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJwb3NpeF9tZW1hbGlnbiBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBwYWdlX3NpemU6ICIgPDwgcGFnZV9zaXplIDw8ICIgcmVhZF9zejogIiA8PCBwYWdlX3NpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsaWduZWRfYnVmZmVyXy5yZXNldChhbGlnbmVkX2FkZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYmxvY2tfc2VydmVyXyA9IGJsb2NrX3NlcnZlcl9vcGVuZXJfLT5PcGVuKHRoaXMsIFBBWUxPQURfQlVGRkVSX1NaKTsKKyAgICBpZiAoIWJsb2NrX3NlcnZlcl8pIHsKKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG9wZW4gYmxvY2sgc2VydmVyIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZWFkV29ya2VyOjpSdW4oKSB7CisgICAgU05BUF9MT0coSU5GTykgPDwgIlByb2Nlc3Npbmcgc25hcHNob3QgSS9PIHJlcXVlc3RzLi4uLiI7CisKKyAgICBwdGhyZWFkX3NldG5hbWVfbnAocHRocmVhZF9zZWxmKCksICJSZWFkV29ya2VyIik7CisKKyAgICBpZiAoIVNldFRocmVhZFByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHRocmVhZCBwcmlvcml0eSI7CisgICAgfQorCisgICAgLy8gU3RhcnQgc2VydmluZyBJTworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICghYmxvY2tfc2VydmVyXy0+UHJvY2Vzc1JlcXVlc3RzKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQ2xvc2VGZHMoKTsKKyAgICByZWFkZXJfLT5DbG9zZUNvd0ZkKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZWFkV29ya2VyOjpSZWFkRGF0YUZyb21CYXNlRGV2aWNlKHNlY3Rvcl90IHNlY3Rvciwgdm9pZCogYnVmZmVyLCBzaXplX3QgcmVhZF9zaXplKSB7CisgICAgQ0hFQ0socmVhZF9zaXplIDw9IEJMT0NLX1NaKTsKKworICAgIGxvZmZfdCBvZmZzZXQgPSBzZWN0b3IgPDwgU0VDVE9SX1NISUZUOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFzZV9wYXRoX21lcmdlX2ZkXywgYnVmZmVyLCByZWFkX3NpemUsIG9mZnNldCkpIHsKKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiUmVhZERhdGFGcm9tQmFzZURldmljZSBmYWlsZWQuIGZkOiAiIDw8IGJhc2VfcGF0aF9tZXJnZV9mZF8KKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiYXQgc2VjdG9yIDoiIDw8IHNlY3RvciA8PCAiIHNpemU6ICIgPDwgcmVhZF9zaXplOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yX3Qgc2VjdG9yLCBzaXplX3Qgc3opIHsKKyAgICBzaXplX3QgcmVtYWluaW5nX3NpemUgPSBzejsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+PiYgY2h1bmtfdmVjID0gc25hcHVzZXJkXy0+R2V0Q2h1bmtWZWMoKTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgLy8gUHJvY2VzcyAxTUIgcGF5bG9hZCBhdCBhIHRpbWUKKyAgICAgICAgc2l6ZV90IHJlYWRfc2l6ZSA9IHN0ZDo6bWluKFBBWUxPQURfQlVGRkVSX1NaLCByZW1haW5pbmdfc2l6ZSk7CisKKyAgICAgICAgc2l6ZV90IHRvdGFsX2J5dGVzX3JlYWQgPSAwOworCisgICAgICAgIHdoaWxlIChyZWFkX3NpemUpIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgZXZlcnkgNGsgYmxvY2sgdG8gdmVyaWZ5IGlmIGl0IGlzCisgICAgICAgICAgICAvLyBwcmVzZW50IGluIHRoZSBtYXBwaW5nLgorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzdGQ6Om1pbihCTE9DS19TWiwgcmVhZF9zaXplKTsKKworICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoY2h1bmtfdmVjLmJlZ2luKCksIGNodW5rX3ZlYy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHNlY3RvciwgbnVsbHB0ciksIFNuYXBzaG90SGFuZGxlcjo6Y29tcGFyZSk7CisgICAgICAgICAgICBib29sIG5vdF9mb3VuZCA9IChpdCA9PSBjaHVua192ZWMuZW5kKCkgfHwgaXQtPmZpcnN0ICE9IHNlY3Rvcik7CisKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciA9IGJsb2NrX3NlcnZlcl8tPkdldFJlc3BvbnNlQnVmZmVyKEJMT0NLX1NaLCBzaXplKTsKKyAgICAgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJBY3F1aXJlQnVmZmVyIGZhaWxlZCBpbiBSZWFkQWxpZ25lZFNlY3RvciI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobm90X2ZvdW5kKSB7CisgICAgICAgICAgICAgICAgLy8gQmxvY2sgbm90IGZvdW5kIGluIG1hcCAtIHdoaWNoIG1lYW5zIHRoaXMgYmxvY2sgd2FzIG5vdAorICAgICAgICAgICAgICAgIC8vIGNoYW5nZWQgYXMgcGVyIHRoZSBPVEEuIEp1c3Qgcm91dGUgdGhlIEkvTyB0byB0aGUgYmFzZQorICAgICAgICAgICAgICAgIC8vIGRldmljZS4KKyAgICAgICAgICAgICAgICBpZiAoIVJlYWREYXRhRnJvbUJhc2VEZXZpY2Uoc2VjdG9yLCBidWZmZXIsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZERhdGFGcm9tQmFzZURldmljZSBmYWlsZWQiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ID0gc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgdGhlIHNlY3RvciBpbiBtYXBwaW5nLiBDaGVjayB0aGUgdHlwZSBvZiBDT1cgT1AgYW5kCisgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBpdC4KKyAgICAgICAgICAgICAgICBpZiAoIVByb2Nlc3NDb3dPcChpdC0+c2Vjb25kLCBidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzQ293T3AgZmFpbGVkLCBzZWN0b3IgPSAiIDw8IHNlY3RvciA8PCAiLCBzaXplID0gIiA8PCBzejsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldCA9IHN0ZDo6bWluKEJMT0NLX1NaLCByZWFkX3NpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWFkX3NpemUgLT0gcmV0OworICAgICAgICAgICAgdG90YWxfYnl0ZXNfcmVhZCArPSByZXQ7CisgICAgICAgICAgICBzZWN0b3IgKz0gKHJldCA+PiBTRUNUT1JfU0hJRlQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTZW5kQnVmZmVyZWRJbygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTTkFQX0xPRyhERUJVRykgPDwgIlNlbmRCdWZmZXJlZElvIHN1Y2Nlc3MgdG90YWxfYnl0ZXNfcmVhZDogIiA8PCB0b3RhbF9ieXRlc19yZWFkCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHJlbWFpbmluZ19zaXplOiAiIDw8IHJlbWFpbmluZ19zaXplOworICAgICAgICByZW1haW5pbmdfc2l6ZSAtPSB0b3RhbF9ieXRlc19yZWFkOworICAgIH0gd2hpbGUgKHJlbWFpbmluZ19zaXplID4gMCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IFJlYWRXb3JrZXI6OlJlYWRVbmFsaWduZWRTZWN0b3IoCisgICAgICAgIHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzZWN0b3JfdCwgY29uc3QgQ293T3BlcmF0aW9uKj4+OjppdGVyYXRvciYgaXQpIHsKKyAgICBTTkFQX0xPRyhERUJVRykgPDwgIlJlYWRVbmFsaWduZWRTZWN0b3I6IHNlY3RvciAiIDw8IHNlY3RvciA8PCAiIHNpemU6ICIgPDwgc2l6ZQorICAgICAgICAgICAgICAgICAgICA8PCAiIEFsaWduZWQgc2VjdG9yOiAiIDw8IGl0LT5maXJzdDsKKworICAgIGludCBudW1fc2VjdG9yc19za2lwID0gc2VjdG9yIC0gaXQtPmZpcnN0OworICAgIHNpemVfdCBza2lwX3NpemUgPSBudW1fc2VjdG9yc19za2lwIDw8IFNFQ1RPUl9TSElGVDsKKyAgICBzaXplX3Qgd3JpdGVfc2l6ZSA9IHN0ZDo6bWluKHNpemUsIEJMT0NLX1NaIC0gc2tpcF9zaXplKTsKKyAgICBhdXRvIGJ1ZmZlciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihibG9ja19zZXJ2ZXJfLT5HZXRSZXNwb25zZUJ1ZmZlcihCTE9DS19TWiwgd3JpdGVfc2l6ZSkpOworICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc0Nvd09wIGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIiOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFQcm9jZXNzQ293T3AoaXQtPnNlY29uZCwgYnVmZmVyKSkgeworICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRVbmFsaWduZWRTZWN0b3I6ICIgPDwgc2VjdG9yIDw8ICIgZmFpbGVkIG9mIHNpemU6ICIgPDwgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBBbGlnbmVkIHNlY3RvcjogIiA8PCBpdC0+Zmlyc3Q7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoc2tpcF9zaXplKSB7CisgICAgICAgIGlmIChza2lwX3NpemUgPT0gQkxPQ0tfU1opIHsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCB1bi1hbGlnbmVkIElPIHJlcXVlc3QgYXQgc2VjdG9yOiAiIDw8IHNlY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQmFzZS1zZWN0b3I6ICIgPDwgaXQtPmZpcnN0OworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbW1vdmUoYnVmZmVyLCBidWZmZXIgKyBza2lwX3NpemUsIHdyaXRlX3NpemUpOworICAgIH0KKyAgICByZXR1cm4gd3JpdGVfc2l6ZTsKK30KKworYm9vbCBSZWFkV29ya2VyOjpSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+PiYgY2h1bmtfdmVjID0gc25hcHVzZXJkXy0+R2V0Q2h1bmtWZWMoKTsKKworICAgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKGNodW5rX3ZlYy5iZWdpbigpLCBjaHVua192ZWMuZW5kKCksIHN0ZDo6bWFrZV9wYWlyKHNlY3RvciwgbnVsbHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU25hcHNob3RIYW5kbGVyOjpjb21wYXJlKTsKKworICAgIC8vIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwKKyAgICAvLyAwICAgICAgIDEgICAgICAgMiAgICAgICAzCisgICAgLy8KKyAgICAvLyBCbG9jayAwIC0gb3AgMQorICAgIC8vIEJsb2NrIDEgLSBvcCAyCisgICAgLy8gQmxvY2sgMiAtIG9wIDMKKyAgICAvLworICAgIC8vIGNodW5rX3ZlYyB3aWxsIGhhdmUgYmxvY2sgMCwgMSwgMiB3aGljaCBtYXBzIHRvIHJlbGF2YW50IENPVyBvcHMuCisgICAgLy8KKyAgICAvLyBFYWNoIGJsb2NrIGlzIDRrIGJ5dGVzLiBUaHVzLCB0aGUgbGFzdCBibG9jayB3aWxsIHNwYW4gOCBzZWN0b3JzCisgICAgLy8gcmFuZ2luZyB0aWxsIGJsb2NrIDMgKEhvd2V2ZXIsIGJsb2NrIDMgd29uJ3QgYmUgaW4gY2h1bmtfdmVjIGFzCisgICAgLy8gaXQgZG9lc24ndCBoYXZlIGFueSBtYXBwaW5nIHRvIENPVyBvcHMuIE5vdywgaWYgd2UgZ2V0IGFuIEkvTyByZXF1ZXN0IGZvciBhIHNlY3RvcgorICAgIC8vIHNwYW5uaW5nIGJldHdlZW4gYmxvY2sgMiBhbmQgYmxvY2sgMywgd2UgbmVlZCB0byBzdGVwIGJhY2sKKyAgICAvLyBhbmQgZ2V0IGhvbGQgb2YgdGhlIGxhc3QgZWxlbWVudC4KKyAgICAvLworICAgIC8vIEFkZGl0aW9uYWxseSwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHNlY3RvciBpcworICAgIC8vIGluZGVlZCB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBmaW5hbCBzZWN0b3IuIEl0IGlzIHBlcmZlY3RseSB2YWxpZAorICAgIC8vIHRvIGdldCBhbiBJL08gcmVxdWVzdCBmb3IgYmxvY2sgMyBhbmQgYmV5b25kIHdoaWNoIGFyZSBub3QgbWFwcGVkCisgICAgLy8gdG8gYW55IENPVyBvcHMuIEluIHRoYXQgY2FzZSwgd2UganVzdCBuZWVkIHRvIHJlYWQgZnJvbSB0aGUgYmFzZQorICAgIC8vIGRldmljZS4KKyAgICBib29sIG1lcmdlX2NvbXBsZXRlID0gZmFsc2U7CisgICAgaWYgKGl0ID09IGNodW5rX3ZlYy5lbmQoKSkgeworICAgICAgICBpZiAoY2h1bmtfdmVjLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIC8vIEkvTyByZXF1ZXN0IGJleW9uZCB0aGUgbGFzdCBtYXBwZWQgc2VjdG9yCisgICAgICAgICAgICBpdCA9IHN0ZDo6cHJldihjaHVua192ZWMuZW5kKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBwYXJ0aXRpb24gbWVyZ2UgaXMgY29tcGxldGUgYnV0IHNuYXBzaG90CisgICAgICAgICAgICAvLyBzdGF0ZSBpbiAvbWV0YWRhdGEgaXMgbm90IHlldCBkZWxldGVkOyBkdXJpbmcgdGhpcyB3aW5kb3cgaWYgdGhlCisgICAgICAgICAgICAvLyBkZXZpY2UgaXMgcmVib290ZWQsIHN1YnNlcXVlbnQgYXR0ZW1wdCB3aWxsIG1vdW50IHRoZSBzbmFwc2hvdC4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoZSBtZXJnZSB3YXMgY29tcGxldGVkIHdlIHdvdWxkbid0IGhhdmUgYW55CisgICAgICAgICAgICAvLyBtYXBwaW5nIHRvIENPVyBvcHMgdGh1cyBjaHVua192ZWMgd2lsbCBiZSBlbXB0eS4gSW4gdGhhdCBjYXNlLAorICAgICAgICAgICAgLy8gbWFyayB0aGlzIGFzIG1lcmdlX2NvbXBsZXRlIGFuZCByb3V0ZSB0aGUgSS9PIHRvIHRoZSBiYXNlIGRldmljZS4KKyAgICAgICAgICAgIG1lcmdlX2NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXQtPmZpcnN0ICE9IHNlY3RvcikgeworICAgICAgICBpZiAoaXQgIT0gY2h1bmtfdmVjLmJlZ2luKCkpIHsKKyAgICAgICAgICAgIC0taXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yLCBzaXplKTsKKyAgICB9CisKKyAgICBsb2ZmX3QgcmVxdWVzdGVkX29mZnNldCA9IHNlY3RvciA8PCBTRUNUT1JfU0hJRlQ7CisKKyAgICBsb2ZmX3QgZmluYWxfb2Zmc2V0ID0gMDsKKyAgICBpZiAoIW1lcmdlX2NvbXBsZXRlKSB7CisgICAgICAgIGZpbmFsX29mZnNldCA9IGl0LT5maXJzdCA8PCBTRUNUT1JfU0hJRlQ7CisgICAgfQorCisgICAgLy8gU2luY2UgYSBDT1cgb3Agc3BhbiA0ayBibG9jayBzaXplLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQKKyAgICAvLyBvZmZzZXQgaXMgd2l0aGluIHRoZSA0ayByZWdpb24uIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2FzZToKKyAgICAvLworICAgIC8vIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwKKyAgICAvLyAwICAgICAgIDEgICAgICAgMiAgICAgICAzCisgICAgLy8KKyAgICAvLyBCbG9jayAwIC0gb3AgMQorICAgIC8vIEJsb2NrIDEgLSBvcCAyCisgICAgLy8KKyAgICAvLyBXZSBoYXZlIGFuIEkvTyByZXF1ZXN0IGZvciBhIHNlY3RvciBiZXR3ZWVuIGJsb2NrIDIgYW5kIGJsb2NrIDMuIEhvd2V2ZXIsCisgICAgLy8gd2UgaGF2ZSBtYXBwaW5nIHRvIENPVyBvcHMgb25seSBmb3IgYmxvY2sgMCBhbmQgYmxvY2sgMS4gVGh1cywgdGhlCisgICAgLy8gcmVxdWVzdGVkIG9mZnNldCBpbiB0aGlzIGNhc2UgaXMgYmV5b25kIHRoZSBsYXN0IG1hcHBlZCBDT1cgb3Agc2l6ZSAod2hpY2gKKyAgICAvLyBpcyBibG9jayAxIGluIHRoaXMgY2FzZSkuCisKKyAgICBzaXplX3QgcmVtYWluaW5nX3NpemUgPSBzaXplOworICAgIGludCByZXQgPSAwOworICAgIGlmICghbWVyZ2VfY29tcGxldGUgJiYgKHJlcXVlc3RlZF9vZmZzZXQgPj0gZmluYWxfb2Zmc2V0KSAmJgorICAgICAgICAocmVxdWVzdGVkX29mZnNldCAtIGZpbmFsX29mZnNldCkgPCBCTE9DS19TWikgeworICAgICAgICAvLyBSZWFkIHRoZSBwYXJ0aWFsIHVuLWFsaWduZWQgZGF0YQorICAgICAgICByZXQgPSBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3RvciwgcmVtYWluaW5nX3NpemUsIGl0KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZFVuYWxpZ25lZFNlY3RvciBmYWlsZWQgZm9yIHNlY3RvcjogIiA8PCBzZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNpemU6ICIgPDwgc2l6ZSA8PCAiIGl0LT5zZWN0b3I6ICIgPDwgaXQtPmZpcnN0OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmVtYWluaW5nX3NpemUgLT0gcmV0OworICAgICAgICBzZWN0b3IgKz0gKHJldCA+PiBTRUNUT1JfU0hJRlQpOworCisgICAgICAgIC8vIFNlbmQgdGhlIGRhdGEgYmFjaworICAgICAgICBpZiAoIVNlbmRCdWZmZXJlZElvKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBkYXRhIHRvIGJlIHByb2Nlc3NlZCwgdGhpcyB3aWxsIGJlIGFsaWduZWQgSS9PCisgICAgICAgIGlmIChyZW1haW5pbmdfc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIFJlYWRBbGlnbmVkU2VjdG9yKHNlY3RvciwgcmVtYWluaW5nX3NpemUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhbGwgYWJvdXQgaGFuZGxpbmcgSS9PIHJlcXVlc3QgdG8gYmUgcm91dGVkIHRvIGJhc2UgZGV2aWNlCisgICAgICAgIC8vIGFzIHRoZSBJL08gaXMgbm90IG1hcHBlZCB0byBhbnkgb2YgdGhlIENPVyBvcHMuCisgICAgICAgIGxvZmZfdCBhbGlnbmVkX29mZnNldCA9IHJlcXVlc3RlZF9vZmZzZXQ7CisgICAgICAgIC8vIEFsaWduIHRvIG5lYXJlc3QgNGsKKyAgICAgICAgYWxpZ25lZF9vZmZzZXQgKz0gQkxPQ0tfU1ogLSAxOworICAgICAgICBhbGlnbmVkX29mZnNldCAmPSB+KEJMT0NLX1NaIC0gMSk7CisgICAgICAgIC8vIEZpbmQgdGhlIGRpZmYgb2YgdGhlIGFsaWduZWQgb2Zmc2V0CisgICAgICAgIHNpemVfdCBkaWZmX3NpemUgPSBhbGlnbmVkX29mZnNldCAtIHJlcXVlc3RlZF9vZmZzZXQ7CisgICAgICAgIENIRUNLKGRpZmZfc2l6ZSA8PSBCTE9DS19TWik7CisKKyAgICAgICAgc2l6ZV90IHJlYWRfc2l6ZSA9IHN0ZDo6bWluKHJlbWFpbmluZ19zaXplLCBkaWZmX3NpemUpOworICAgICAgICB2b2lkKiBidWZmZXIgPSBibG9ja19zZXJ2ZXJfLT5HZXRSZXNwb25zZUJ1ZmZlcihCTE9DS19TWiwgcmVhZF9zaXplKTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiQWNxdWlyZUJ1ZmZlciBmYWlsZWQgaW4gUmVhZFVuYWxpZ25lZFNlY3RvciI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFSZWFkRGF0YUZyb21CYXNlRGV2aWNlKHNlY3RvciwgYnVmZmVyLCByZWFkX3NpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFTZW5kQnVmZmVyZWRJbygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVtYWluaW5nX3NpemUgPj0gZGlmZl9zaXplKSB7CisgICAgICAgICAgICByZW1haW5pbmdfc2l6ZSAtPSBkaWZmX3NpemU7CisgICAgICAgICAgICBzaXplX3QgbnVtX3NlY3RvcnNfcmVhZCA9IChkaWZmX3NpemUgPj4gU0VDVE9SX1NISUZUKTsKKyAgICAgICAgICAgIHNlY3RvciArPSBudW1fc2VjdG9yc19yZWFkOworICAgICAgICAgICAgQ0hFQ0soSXNCbG9ja0FsaWduZWQoc2VjdG9yIDw8IFNFQ1RPUl9TSElGVCkpOworCisgICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIHBlbmRpbmcgZGF0YSB0byBiZSBwcm9jZXNzZWQsIHRoaXMgd2lsbCBiZSBhbGlnbmVkIEkvTworICAgICAgICAgICAgcmV0dXJuIFJlYWRBbGlnbmVkU2VjdG9yKHNlY3RvciwgcmVtYWluaW5nX3NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UmVxdWVzdFNlY3RvcnModWludDY0X3Qgc2VjdG9yLCB1aW50NjRfdCBsZW4pIHsKKyAgICAvLyBVbmFsaWduZWQgSS9PIHJlcXVlc3QKKyAgICBpZiAoIUlzQmxvY2tBbGlnbmVkKHNlY3RvciA8PCBTRUNUT1JfU0hJRlQpKSB7CisgICAgICAgIHJldHVybiBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3RvciwgbGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gUmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yLCBsZW4pOworfQorCitib29sIFJlYWRXb3JrZXI6OlNlbmRCdWZmZXJlZElvKCkgeworICAgIHJldHVybiBibG9ja19zZXJ2ZXJfLT5TZW5kQnVmZmVyZWRJbygpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvcmVhZF93b3JrZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9yZWFkX3dvcmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZmY1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvcmVhZF93b3JrZXIuaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHNuYXB1c2VyZC9ibG9ja19zZXJ2ZXIuaD4KKyNpbmNsdWRlICJ3b3JrZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgUmVhZFdvcmtlciA6IHB1YmxpYyBXb3JrZXIsIHB1YmxpYyBJQmxvY2tTZXJ2ZXI6OkRlbGVnYXRlIHsKKyAgcHVibGljOgorICAgIFJlYWRXb3JrZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBvcGVuZXIsIGJvb2wgZGlyZWN0X3JlYWQgPSBmYWxzZSk7CisKKyAgICBib29sIFJ1bigpOworICAgIGJvb2wgSW5pdCgpIG92ZXJyaWRlOworICAgIHZvaWQgQ2xvc2VGZHMoKSBvdmVycmlkZTsKKyAgICBib29sIFJlcXVlc3RTZWN0b3JzKHVpbnQ2NF90IHNlY3RvciwgdWludDY0X3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICBJQmxvY2tTZXJ2ZXIqIGJsb2NrX3NlcnZlcigpIGNvbnN0IHsgcmV0dXJuIGJsb2NrX3NlcnZlcl8uZ2V0KCk7IH0KKworICBwcml2YXRlOgorICAgIGJvb2wgU2VuZEJ1ZmZlcmVkSW8oKTsKKworICAgIGJvb2wgUHJvY2Vzc0Nvd09wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB2b2lkKiBidWZmZXIpOworICAgIGJvb2wgUHJvY2Vzc1hvck9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB2b2lkKiBidWZmZXIpOworICAgIGJvb2wgUHJvY2Vzc09yZGVyZWRPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKTsKKyAgICBib29sIFByb2Nlc3NDb3B5T3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AsIHZvaWQqIGJ1ZmZlcik7CisgICAgYm9vbCBQcm9jZXNzUmVwbGFjZU9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB2b2lkKiBidWZmZXIpOworICAgIGJvb2wgUHJvY2Vzc1plcm9PcCh2b2lkKiBidWZmZXIpOworCisgICAgYm9vbCBSZWFkQWxpZ25lZFNlY3RvcihzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzeik7CisgICAgYm9vbCBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUpOworICAgIGludCBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj46Oml0ZXJhdG9yJiBpdCk7CisgICAgYm9vbCBSZWFkRnJvbVNvdXJjZURldmljZShjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKTsKKyAgICBib29sIFJlYWREYXRhRnJvbUJhc2VEZXZpY2Uoc2VjdG9yX3Qgc2VjdG9yLCB2b2lkKiBidWZmZXIsIHNpemVfdCByZWFkX3NpemUpOworCisgICAgY29uc3RleHByIGJvb2wgSXNCbG9ja0FsaWduZWQoc2l6ZV90IHNpemUpIHsgcmV0dXJuICgoc2l6ZSAmIChCTE9DS19TWiAtIDEpKSA9PSAwKTsgfQorICAgIGNvbnN0ZXhwciBzZWN0b3JfdCBDaHVua1RvU2VjdG9yKGNodW5rX3QgY2h1bmspIHsgcmV0dXJuIGNodW5rIDw8IENIVU5LX1NISUZUOyB9CisKKyAgICBzdGQ6OnN0cmluZyBiYWNraW5nX3N0b3JlX2RldmljZV87CisgICAgdW5pcXVlX2ZkIGJhY2tpbmdfc3RvcmVfZmRfOworICAgIHVuaXF1ZV9mZCBiYWNraW5nX3N0b3JlX2RpcmVjdF9mZF87CisgICAgYm9vbCBkaXJlY3RfcmVhZF8gPSBmYWxzZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJQmxvY2tTZXJ2ZXJPcGVuZXI+IGJsb2NrX3NlcnZlcl9vcGVuZXJfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQmxvY2tTZXJ2ZXI+IGJsb2NrX3NlcnZlcl87CisKKyAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiB4b3JfYnVmZmVyXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoJjo6ZnJlZSk+IGFsaWduZWRfYnVmZmVyXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfY29yZS5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2NvcmUuY3BwCmluZGV4IDJjMjAxZmYuLjA1YmEwNDcgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfY29yZS5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9jb3JlLmNwcApAQCAtMTYsMTIgKzE2LDE1IEBACiAKICNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgogCi0jaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvZG1fdXNlcl9ibG9ja19zZXJ2ZXIuaD4KKworI2luY2x1ZGUgIm1lcmdlX3dvcmtlci5oIgorI2luY2x1ZGUgInJlYWRfd29ya2VyLmgiCisjaW5jbHVkZSAidXRpbGl0eS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewpAQCAtMzIsMjMgKzM1LDI0IEBACiAKIFNuYXBzaG90SGFuZGxlcjo6U25hcHNob3RIYW5kbGVyKHN0ZDo6c3RyaW5nIG1pc2NfbmFtZSwgc3RkOjpzdHJpbmcgY293X2RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJhY2tpbmdfZGV2aWNlLCBzdGQ6OnN0cmluZyBiYXNlX3BhdGhfbWVyZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3dvcmtlcl90aHJlYWRzLCBib29sIHVzZV9pb3VyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gb3BlbmVyLCBpbnQgbnVtX3dvcmtlcl90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfaW91cmluZywgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbiwgYm9vbCBvX2RpcmVjdCkgewogICAgIG1pc2NfbmFtZV8gPSBzdGQ6Om1vdmUobWlzY19uYW1lKTsKICAgICBjb3dfZGV2aWNlXyA9IHN0ZDo6bW92ZShjb3dfZGV2aWNlKTsKICAgICBiYWNraW5nX3N0b3JlX2RldmljZV8gPSBzdGQ6Om1vdmUoYmFja2luZ19kZXZpY2UpOwotICAgIGNvbnRyb2xfZGV2aWNlXyA9ICIvZGV2L2RtLXVzZXIvIiArIG1pc2NfbmFtZV87CisgICAgYmxvY2tfc2VydmVyX29wZW5lcl8gPSBzdGQ6Om1vdmUob3BlbmVyKTsKICAgICBiYXNlX3BhdGhfbWVyZ2VfID0gc3RkOjptb3ZlKGJhc2VfcGF0aF9tZXJnZSk7CiAgICAgbnVtX3dvcmtlcl90aHJlYWRzXyA9IG51bV93b3JrZXJfdGhyZWFkczsKICAgICBpc19pb191cmluZ19lbmFibGVkXyA9IHVzZV9pb3VyaW5nOwogICAgIHBlcmZvcm1fdmVyaWZpY2F0aW9uXyA9IHBlcmZvcm1fdmVyaWZpY2F0aW9uOworICAgIG9fZGlyZWN0XyA9IG9fZGlyZWN0OwogfQogCiBib29sIFNuYXBzaG90SGFuZGxlcjo6SW5pdGlhbGl6ZVdvcmtlcnMoKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fd29ya2VyX3RocmVhZHNfOyBpKyspIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFdvcmtlcj4gd3QgPQotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8V29ya2VyPihjb3dfZGV2aWNlXywgYmFja2luZ19zdG9yZV9kZXZpY2VfLCBjb250cm9sX2RldmljZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NfbmFtZV8sIGJhc2VfcGF0aF9tZXJnZV8sIEdldFNoYXJlZFB0cigpKTsKKyAgICAgICAgYXV0byB3dCA9IHN0ZDo6bWFrZV91bmlxdWU8UmVhZFdvcmtlcj4oY293X2RldmljZV8sIGJhY2tpbmdfc3RvcmVfZGV2aWNlXywgbWlzY19uYW1lXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9wYXRoX21lcmdlXywgR2V0U2hhcmVkUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3NlcnZlcl9vcGVuZXJfLCBvX2RpcmVjdF8pOwogICAgICAgICBpZiAoIXd0LT5Jbml0KCkpIHsKICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiVGhyZWFkIGluaXRpYWxpemF0aW9uIGZhaWxlZCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01Nyw4ICs2MSw4IEBACiAgICAgICAgIHdvcmtlcl90aHJlYWRzXy5wdXNoX2JhY2soc3RkOjptb3ZlKHd0KSk7CiAgICAgfQogCi0gICAgbWVyZ2VfdGhyZWFkXyA9IHN0ZDo6bWFrZV91bmlxdWU8V29ya2VyPihjb3dfZGV2aWNlXywgYmFja2luZ19zdG9yZV9kZXZpY2VfLCBjb250cm9sX2RldmljZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjX25hbWVfLCBiYXNlX3BhdGhfbWVyZ2VfLCBHZXRTaGFyZWRQdHIoKSk7CisgICAgbWVyZ2VfdGhyZWFkXyA9IHN0ZDo6bWFrZV91bmlxdWU8TWVyZ2VXb3JrZXI+KGNvd19kZXZpY2VfLCBtaXNjX25hbWVfLCBiYXNlX3BhdGhfbWVyZ2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTaGFyZWRQdHIoKSk7CiAKICAgICByZWFkX2FoZWFkX3RocmVhZF8gPSBzdGQ6Om1ha2VfdW5pcXVlPFJlYWRBaGVhZD4oY293X2RldmljZV8sIGJhY2tpbmdfc3RvcmVfZGV2aWNlXywgbWlzY19uYW1lXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2hhcmVkUHRyKCkpOwpAQCAtNzksNiArODMsMTAgQEAKICAgICBTTkFQX0xPRyhERUJVRykgPDwgIk1lcmdlLWNvbXBsZXRlICU6ICIgPDwgbWVyZ2VfY29tcGxldGlvbl9wZXJjZW50YWdlXwogICAgICAgICAgICAgICAgICAgICA8PCAiIG51bV9tZXJnZV9vcHM6ICIgPDwgY2gtPm51bV9tZXJnZV9vcHMKICAgICAgICAgICAgICAgICAgICAgPDwgIiB0b3RhbC1vcHM6ICIgPDwgcmVhZGVyXy0+Z2V0X251bV90b3RhbF9kYXRhX29wcygpOworCisgICAgaWYgKGNoLT5udW1fbWVyZ2Vfb3BzID09IHJlYWRlcl8tPmdldF9udW1fdG90YWxfZGF0YV9vcHMoKSkgeworICAgICAgICBNYXJrTWVyZ2VDb21wbGV0ZSgpOworICAgIH0KIH0KIAogYm9vbCBTbmFwc2hvdEhhbmRsZXI6OkNvbW1pdE1lcmdlKGludCBudW1fbWVyZ2Vfb3BzKSB7CkBAIC05OCwxNSArMTA2LDE0IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICByZWFkZXJfLT5VcGRhdGVNZXJnZU9wc0NvbXBsZXRlZChudW1fbWVyZ2Vfb3BzKTsKLSAgICAgICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICAgICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgICAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXJfLT5HZXRIZWFkZXIoKTsKIAogICAgICAgICBpZiAobHNlZWsoY293X2ZkXy5nZXQoKSwgMCwgU0VFS19TRVQpIDwgMCkgewogICAgICAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAibHNlZWsgZmFpbGVkIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShjb3dfZmRfLCAmaGVhZGVyLCBzaXplb2YoQ293SGVhZGVyKSkpIHsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGNvd19mZF8sICZoZWFkZXIsIGhlYWRlci5wcmVmaXguaGVhZGVyX3NpemUpKSB7CiAgICAgICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJXcml0ZSB0byBoZWFkZXIgZmFpbGVkIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMTU0LDcgKzE2MSw2IEBACiAKIGJvb2wgU25hcHNob3RIYW5kbGVyOjpSZWFkTWV0YWRhdGEoKSB7CiAgICAgcmVhZGVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPihDb3dSZWFkZXI6OlJlYWRlckZsYWdzOjpVU0VSU1BBQ0VfTUVSR0UsIHRydWUpOwotICAgIENvd0hlYWRlciBoZWFkZXI7CiAgICAgQ293T3B0aW9ucyBvcHRpb25zOwogCiAgICAgU05BUF9MT0coREVCVUcpIDw8ICJSZWFkTWV0YWRhdGE6IFBhcnNpbmcgY293IGZpbGUiOwpAQCAtMTY0LDE3ICsxNzAsMTcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBoZWFkZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyXy0+R2V0SGVhZGVyKCk7CiAgICAgaWYgKCEoaGVhZGVyLmJsb2NrX3NpemUgPT0gQkxPQ0tfU1opKSB7CiAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBoZWFkZXIgYmxvY2sgc2l6ZSBmb3VuZDogIiA8PCBoZWFkZXIuYmxvY2tfc2l6ZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIFNOQVBfTE9HKElORk8pIDw8ICJNZXJnZS1vcHM6ICIgPDwgaGVhZGVyLm51bV9tZXJnZV9vcHM7CisgICAgaWYgKGhlYWRlci5udW1fbWVyZ2Vfb3BzKSB7CisgICAgICAgIHJlc3VtZV9tZXJnZV8gPSB0cnVlOworICAgICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiUmVzdW1lIFNuYXBzaG90LW1lcmdlIjsKKyAgICB9CiAKICAgICBpZiAoIU1tYXBNZXRhZGF0YSgpKSB7CiAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAibW1hcCBmYWlsZWQiOwpAQCAtMTkxLDE2ICsxOTcsMTYgQEAKIAogICAgIHNpemVfdCBjb3B5X29wcyA9IDAsIHJlcGxhY2Vfb3BzID0gMCwgemVyb19vcHMgPSAwLCB4b3Jfb3BzID0gMDsKIAotICAgIHdoaWxlICghY293b3BfaXRlci0+RG9uZSgpKSB7Ci0gICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gJmNvd29wX2l0ZXItPkdldCgpOworICAgIHdoaWxlICghY293b3BfaXRlci0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9IGNvd29wX2l0ZXItPkdldCgpOwogCi0gICAgICAgIGlmIChjb3dfb3AtPnR5cGUgPT0ga0Nvd0NvcHlPcCkgeworICAgICAgICBpZiAoY293X29wLT50eXBlKCkgPT0ga0Nvd0NvcHlPcCkgewogICAgICAgICAgICAgY29weV9vcHMgKz0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChjb3dfb3AtPnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICB9IGVsc2UgaWYgKGNvd19vcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKICAgICAgICAgICAgIHJlcGxhY2Vfb3BzICs9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoY293X29wLT50eXBlID09IGtDb3daZXJvT3ApIHsKKyAgICAgICAgfSBlbHNlIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293WmVyb09wKSB7CiAgICAgICAgICAgICB6ZXJvX29wcyArPSAxOwotICAgICAgICB9IGVsc2UgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293WG9yT3ApIHsKKyAgICAgICAgfSBlbHNlIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293WG9yT3ApIHsKICAgICAgICAgICAgIHhvcl9vcHMgKz0gMTsKICAgICAgICAgfQogCkBAIC0yNDQsMTIgKzI1MCwxMSBAQAogfQogCiBib29sIFNuYXBzaG90SGFuZGxlcjo6TW1hcE1ldGFkYXRhKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogCi0gICAgdG90YWxfbWFwcGVkX2FkZHJfbGVuZ3RoXyA9IGhlYWRlci5oZWFkZXJfc2l6ZSArIEJVRkZFUl9SRUdJT05fREVGQVVMVF9TSVpFOworICAgIHRvdGFsX21hcHBlZF9hZGRyX2xlbmd0aF8gPSBoZWFkZXIucHJlZml4LmhlYWRlcl9zaXplICsgQlVGRkVSX1JFR0lPTl9ERUZBVUxUX1NJWkU7CiAKLSAgICBpZiAoaGVhZGVyLm1ham9yX3ZlcnNpb24gPj0gMiAmJiBoZWFkZXIuYnVmZmVyX3NpemUgPiAwKSB7CisgICAgaWYgKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiA+PSAyICYmIGhlYWRlci5idWZmZXJfc2l6ZSA+IDApIHsKICAgICAgICAgc2NyYXRjaF9zcGFjZV8gPSB0cnVlOwogICAgIH0KIApAQCAtMjg1LDIwICsyOTAsNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGJhc2VfcGF0aF9tZXJnZV8uY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkNhbm5vdCBvcGVuIGJsb2NrIGRldmljZSI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBkZXZfc3ogPSBnZXRfYmxvY2tfZGV2aWNlX3NpemUoZmQuZ2V0KCkpOwotICAgIGlmICghZGV2X3N6KSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZpbmQgYmxvY2sgZGV2aWNlIHNpemU6ICIgPDwgYmFzZV9wYXRoX21lcmdlXzsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG51bV9zZWN0b3JzXyA9IGRldl9zeiA+PiBTRUNUT1JfU0hJRlQ7Ci0KICAgICByZXR1cm4gUmVhZE1ldGFkYXRhKCk7CiB9CiAKQEAgLTMxMiwyMSArMzAzLDI2IEBACiAgICAgaWYgKHJhX3RocmVhZF8pIHsKICAgICAgICAgcmFfdGhyZWFkX3N0YXR1cyA9CiAgICAgICAgICAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZSZWFkQWhlYWQ6OlJ1blRocmVhZCwgcmVhZF9haGVhZF90aHJlYWRfLmdldCgpKTsKLQotICAgICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiUmVhZC1haGVhZCB0aHJlYWQgc3RhcnRlZC4uLiI7CisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBtZXJnZS1yZXN1bWUgcGF0aCwgd2FpdCB1bnRpbCBSQSB0aHJlYWQgaXMgZnVsbHkgdXAgYXMKKyAgICAgICAgLy8gdGhlIGRhdGEgaGFzIHRvIGJlIHJlLWNvbnN0cnVjdGVkIGZyb20gdGhlIHNjcmF0Y2ggc3BhY2UuCisgICAgICAgIGlmIChyZXN1bWVfbWVyZ2VfICYmIFNob3VsZFJlY29uc3RydWN0RGF0YUZyb21Db3coKSkgeworICAgICAgICAgICAgV2FpdEZvclJhVGhyZWFkVG9TdGFydCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gTGF1bmNoIHdvcmtlciB0aHJlYWRzCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JrZXJfdGhyZWFkc18uc2l6ZSgpOyBpKyspIHsKICAgICAgICAgdGhyZWFkcy5lbXBsYWNlX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZXb3JrZXI6OlJ1blRocmVhZCwgd29ya2VyX3RocmVhZHNfW2ldLmdldCgpKSk7CisgICAgICAgICAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZSZWFkV29ya2VyOjpSdW4sIHdvcmtlcl90aHJlYWRzX1tpXS5nZXQoKSkpOwogICAgIH0KIAogICAgIHN0ZDo6ZnV0dXJlPGJvb2w+IG1lcmdlX3RocmVhZCA9Ci0gICAgICAgICAgICBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgJldvcmtlcjo6UnVuTWVyZ2VUaHJlYWQsIG1lcmdlX3RocmVhZF8uZ2V0KCkpOworICAgICAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZNZXJnZVdvcmtlcjo6UnVuLCBtZXJnZV90aHJlYWRfLmdldCgpKTsKIAogICAgIC8vIE5vdyB0aGF0IHRoZSB3b3JrZXIgdGhyZWFkcyBhcmUgdXAsIHNjYW4gdGhlIHBhcnRpdGlvbnMuCi0gICAgaWYgKHBlcmZvcm1fdmVyaWZpY2F0aW9uXykgeworICAgIC8vIElmIHRoZSBzbmFwc2hvdC1tZXJnZSBpcyBiZWluZyByZXN1bWVkLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNjYW4gYXMgdGhlCisgICAgLy8gY3VycmVudCBzbG90IGlzIGFscmVhZHkgbWFya2VkIGFzIGJvb3QgY29tcGxldGUuCisgICAgaWYgKHBlcmZvcm1fdmVyaWZpY2F0aW9uXyAmJiAhcmVzdW1lX21lcmdlXykgewogICAgICAgICB1cGRhdGVfdmVyaWZ5Xy0+VmVyaWZ5VXBkYXRlUGFydGl0aW9uKCk7CiAgICAgfQogCkBAIC0zNjcsMTAgKzM2Myw5IEBACiB9CiAKIHVpbnQ2NF90IFNuYXBzaG90SGFuZGxlcjo6R2V0QnVmZmVyTWV0YWRhdGFPZmZzZXQoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7CisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyXy0+R2V0SGVhZGVyKCk7CiAKLSAgICByZXR1cm4gKGhlYWRlci5oZWFkZXJfc2l6ZSArIHNpemVvZihCdWZmZXJTdGF0ZSkpOworICAgIHJldHVybiAoaGVhZGVyLnByZWZpeC5oZWFkZXJfc2l6ZSArIHNpemVvZihCdWZmZXJTdGF0ZSkpOwogfQogCiAvKgpAQCAtMzgzLDggKzM3OCw3IEBACiAgKgogICovCiBzaXplX3QgU25hcHNob3RIYW5kbGVyOjpHZXRCdWZmZXJNZXRhZGF0YVNpemUoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7CisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyXy0+R2V0SGVhZGVyKCk7CiAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gaGVhZGVyLmJ1ZmZlcl9zaXplOwogCiAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc2NyYXRjaCBzcGFjZSwgdGhlbiBqdXN0IHVzZSB0aGUKQEAgLTM5NywxOCArMzkxLDE2IEBACiB9CiAKIHNpemVfdCBTbmFwc2hvdEhhbmRsZXI6OkdldEJ1ZmZlckRhdGFPZmZzZXQoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7CisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyXy0+R2V0SGVhZGVyKCk7CiAKLSAgICByZXR1cm4gKGhlYWRlci5oZWFkZXJfc2l6ZSArIEdldEJ1ZmZlck1ldGFkYXRhU2l6ZSgpKTsKKyAgICByZXR1cm4gKGhlYWRlci5wcmVmaXguaGVhZGVyX3NpemUgKyBHZXRCdWZmZXJNZXRhZGF0YVNpemUoKSk7CiB9CiAKIC8qCiAgKiAoMk1CIC0gOEsgPSAyMDg4OTYwIGJ5dGVzKSB3aWxsIGJlIHRoZSBidWZmZXIgcmVnaW9uIHRvIGhvbGQgdGhlIGRhdGEuCiAgKi8KIHNpemVfdCBTbmFwc2hvdEhhbmRsZXI6OkdldEJ1ZmZlckRhdGFTaXplKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogICAgIHNpemVfdCBidWZmZXJfc2l6ZSA9IGhlYWRlci5idWZmZXJfc2l6ZTsKIAogICAgIC8vIElmIHRoZXJlIGlzIG5vIHNjcmF0Y2ggc3BhY2UsIHRoZW4ganVzdCB1c2UgdGhlCkBAIC00MjEsMzYgKzQxMywxNSBAQAogfQogCiBzdHJ1Y3QgQnVmZmVyU3RhdGUqIFNuYXBzaG90SGFuZGxlcjo6R2V0QnVmZmVyU3RhdGUoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7CisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyXy0+R2V0SGVhZGVyKCk7CiAKICAgICBzdHJ1Y3QgQnVmZmVyU3RhdGUqIHJhX3N0YXRlID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IEJ1ZmZlclN0YXRlKj4oKGNoYXIqKW1hcHBlZF9hZGRyXyArIGhlYWRlci5oZWFkZXJfc2l6ZSk7CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBCdWZmZXJTdGF0ZSo+KChjaGFyKiltYXBwZWRfYWRkcl8gKyBoZWFkZXIucHJlZml4LmhlYWRlcl9zaXplKTsKICAgICByZXR1cm4gcmFfc3RhdGU7CiB9CiAKIGJvb2wgU25hcHNob3RIYW5kbGVyOjpJc0lvdXJpbmdTdXBwb3J0ZWQoKSB7Ci0gICAgc3RydWN0IHV0c25hbWUgdXRzOwotICAgIHVuc2lnbmVkIGludCBtYWpvciwgbWlub3I7Ci0KLSAgICBpZiAoYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJzbmFwdXNlcmQudGVzdC5pb191cmluZy5mb3JjZV9kaXNhYmxlIiwgZmFsc2UpKSB7Ci0gICAgICAgIFNOQVBfTE9HKElORk8pIDw8ICJpb191cmluZyBkaXNhYmxlZCBmb3IgdGVzdGluZyI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoKHVuYW1lKCZ1dHMpICE9IDApIHx8IChzc2NhbmYodXRzLnJlbGVhc2UsICIldS4ldSIsICZtYWpvciwgJm1pbm9yKSAhPSAyKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBwYXJzZSB0aGUga2VybmVsIHZlcnNpb24gZnJvbSB1bmFtZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBpb191cmluZyBub3Qgc3VwcG9ydGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFdlIHdpbGwgb25seSBzdXBwb3J0IGtlcm5lbHMgZnJvbSA1LjYgb253YXJkcyBhcyBJT1NRRV9BU1lOQyBmbGFnIGFuZAotICAgIC8vIElPX1VSSU5HX09QX1JFQUQvV1JJVEUgb3Bjb2RlcyB3ZXJlIGludHJvZHVjZWQgb25seSBvbiA1LjYga2VybmVsCi0gICAgaWYgKG1ham9yID49IDUpIHsKLSAgICAgICAgaWYgKG1ham9yID09IDUgJiYgbWlub3IgPCA2KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIGlmICghS2VybmVsU3VwcG9ydHNJb1VyaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNDY1LDUgKzQzNiwzMSBAQAogICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnZpcnR1YWxfYWIuaW9fdXJpbmcuZW5hYmxlZCIsIGZhbHNlKTsKIH0KIAorYm9vbCBTbmFwc2hvdEhhbmRsZXI6OkNoZWNrUGFydGl0aW9uVmVyaWZpY2F0aW9uKCkgeworICAgIHJldHVybiB1cGRhdGVfdmVyaWZ5Xy0+Q2hlY2tQYXJ0aXRpb25WZXJpZmljYXRpb24oKTsKK30KKwordm9pZCBTbmFwc2hvdEhhbmRsZXI6OkZyZWVSZXNvdXJjZXMoKSB7CisgICAgd29ya2VyX3RocmVhZHNfLmNsZWFyKCk7CisgICAgcmVhZF9haGVhZF90aHJlYWRfID0gbnVsbHB0cjsKKyAgICBtZXJnZV90aHJlYWRfID0gbnVsbHB0cjsKK30KKwordWludDY0X3QgU25hcHNob3RIYW5kbGVyOjpHZXROdW1TZWN0b3JzKCkgY29uc3QgeworICAgIHVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihiYXNlX3BhdGhfbWVyZ2VfLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJDYW5ub3Qgb3BlbiBiYXNlIHBhdGg6ICIgPDwgYmFzZV9wYXRoX21lcmdlXzsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ2NF90IGRldl9zeiA9IGdldF9ibG9ja19kZXZpY2Vfc2l6ZShmZC5nZXQoKSk7CisgICAgaWYgKCFkZXZfc3opIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmluZCBibG9jayBkZXZpY2Ugc2l6ZTogIiA8PCBiYXNlX3BhdGhfbWVyZ2VfOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGRldl9zeiAvIFNFQ1RPUl9TSVpFOworfQorCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2NvcmUuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfY29yZS5oCmluZGV4IDc3N2FhMDcuLjliNzIzOGEgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfY29yZS5oCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfY29yZS5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPG9zdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHRocmVhZD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgpAQCAtNDIsMTAgKzQzLDEzIEBACiAjaW5jbHVkZSA8bGliZG0vZG0uaD4KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfcmVhZGVyLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3dyaXRlci5oPgotI2luY2x1ZGUgPGxpYnVyaW5nLmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL2Jsb2NrX3NlcnZlci5oPgogI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfYnVmZmVyLmg+CiAjaW5jbHVkZSA8c25hcHVzZXJkL3NuYXB1c2VyZF9rZXJuZWwuaD4KICNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vdGhyZWFkX2RlZnMuaD4KKyNpbmNsdWRlICJzbmFwdXNlcmRfcmVhZGFoZWFkLmgiCisjaW5jbHVkZSAic25hcHVzZXJkX3ZlcmlmeS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewpAQCAtNTksMjEgKzYzLDIxIEBACiAKIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1Xb3JrZXJUaHJlYWRzID0gNDsKIAotc3RhdGljIGNvbnN0ZXhwciBpbnQga05pY2VWYWx1ZUZvck1lcmdlVGhyZWFkcyA9IC01OwotCiAjZGVmaW5lIFNOQVBfTE9HKGxldmVsKSBMT0cobGV2ZWwpIDw8IG1pc2NfbmFtZV8gPDwgIjogIgogI2RlZmluZSBTTkFQX1BMT0cobGV2ZWwpIFBMT0cobGV2ZWwpIDw8IG1pc2NfbmFtZV8gPDwgIjogIgogCiBlbnVtIGNsYXNzIE1FUkdFX0lPX1RSQU5TSVRJT04geworICAgIElOVkFMSUQsCiAgICAgTUVSR0VfUkVBRFksCiAgICAgTUVSR0VfQkVHSU4sCiAgICAgTUVSR0VfRkFJTEVELAogICAgIE1FUkdFX0NPTVBMRVRFLAogICAgIElPX1RFUk1JTkFURUQsCi0gICAgUkVBRF9BSEVBRF9GQUlMVVJFLAorICAgIFJFQURfQUhFQURfRkFJTFVSRQogfTsKIAotY2xhc3MgU25hcHNob3RIYW5kbGVyOworY2xhc3MgTWVyZ2VXb3JrZXI7CitjbGFzcyBSZWFkV29ya2VyOwogCiBlbnVtIGNsYXNzIE1FUkdFX0dST1VQX1NUQVRFIHsKICAgICBHUk9VUF9NRVJHRV9QRU5ESU5HLApAQCAtOTYsMjE5ICsxMDAsMTcgQEAKICAgICAgICAgOiBtZXJnZV9zdGF0ZV8oc3RhdGUpLCBudW1faW9zX2luX3Byb2dyZXNzKG5faW9zKSB7fQogfTsKIAotY2xhc3MgUmVhZEFoZWFkIHsKLSAgcHVibGljOgotICAgIFJlYWRBaGVhZChjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpOwotICAgIGJvb2wgUnVuVGhyZWFkKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICB2b2lkIEluaXRpYWxpemVSQUl0ZXIoKTsKLSAgICBib29sIFJBSXRlckRvbmUoKTsKLSAgICB2b2lkIFJBSXRlck5leHQoKTsKLSAgICB2b2lkIFJBUmVzZXRJdGVyKHVpbnQ2NF90IG51bV9ibG9ja3MpOwotICAgIGNvbnN0IENvd09wZXJhdGlvbiogR2V0UkFPcEl0ZXIoKTsKLQotICAgIHZvaWQgSW5pdGlhbGl6ZUJ1ZmZlcigpOwotICAgIGJvb2wgSW5pdFJlYWRlcigpOwotICAgIGJvb2wgSW5pdGlhbGl6ZUZkcygpOwotCi0gICAgdm9pZCBDbG9zZUZkcygpIHsgYmFja2luZ19zdG9yZV9mZF8gPSB7fTsgfQotCi0gICAgYm9vbCBSZWFkQWhlYWRJT1N0YXJ0KCk7Ci0gICAgaW50IFByZXBhcmVOZXh0UmVhZEFoZWFkKHVpbnQ2NF90KiBzb3VyY2Vfb2Zmc2V0LCBpbnQqIHBlbmRpbmdfb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIGJsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ293T3BlcmF0aW9uKj4mIHhvcl9vcF92ZWMpOwotICAgIGJvb2wgUmVjb25zdHJ1Y3REYXRhRnJvbUNvdygpOwotICAgIHZvaWQgQ2hlY2tPdmVybGFwKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKTsKLQotICAgIGJvb2wgUmVhZEFoZWFkQXN5bmNJTygpOwotICAgIGJvb2wgUmVhcElvQ29tcGxldGlvbnMoaW50IHBlbmRpbmdfaW9zX3RvX2NvbXBsZXRlKTsKLSAgICBib29sIFJlYWRYb3JEYXRhKHNpemVfdCBibG9ja19pbmRleCwgc2l6ZV90IHhvcl9vcF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+JiB4b3Jfb3BfdmVjKTsKLSAgICB2b2lkIFByb2Nlc3NYb3JEYXRhKHNpemVfdCYgYmxvY2tfeG9yX2luZGV4LCBzaXplX3QmIHhvcl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+JiB4b3Jfb3BfdmVjLCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QmIGJ1ZmZlcl9vZmZzZXQpOwotICAgIHZvaWQgVXBkYXRlU2NyYXRjaE1ldGFkYXRhKCk7Ci0KLSAgICBib29sIFJlYWRBaGVhZFN5bmNJTygpOwotICAgIGJvb2wgSW5pdGlhbGl6ZUlvdXJpbmcoKTsKLSAgICB2b2lkIEZpbmFsaXplSW91cmluZygpOwotCi0gICAgdm9pZCogcmVhZF9haGVhZF9idWZmZXJfOwotICAgIHZvaWQqIG1ldGFkYXRhX2J1ZmZlcl87Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd09wSXRlcj4gY293b3BfaXRlcl87Ci0KLSAgICBzdGQ6OnN0cmluZyBjb3dfZGV2aWNlXzsKLSAgICBzdGQ6OnN0cmluZyBiYWNraW5nX3N0b3JlX2RldmljZV87Ci0gICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKLQotICAgIHVuaXF1ZV9mZCBjb3dfZmRfOwotICAgIHVuaXF1ZV9mZCBiYWNraW5nX3N0b3JlX2ZkXzsKLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZF87Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4gcmVhZGVyXzsKLQotICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50NjRfdD4gZGVzdF9ibG9ja3NfOwotICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50NjRfdD4gc291cmNlX2Jsb2Nrc187Ci0gICAgYm9vbCBvdmVybGFwXzsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gYmxvY2tzXzsKLSAgICBpbnQgdG90YWxfYmxvY2tzX21lcmdlZF8gPSAwOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHJhX3RlbXBfYnVmZmVyXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiByYV90ZW1wX21ldGFfYnVmZmVyXzsKLSAgICBCdWZmZXJTaW5rIGJ1ZnNpbmtfOwotCi0gICAgdWludDY0X3QgdG90YWxfcmFfYmxvY2tzX2NvbXBsZXRlZF8gPSAwOwotICAgIGJvb2wgcmVhZF9haGVhZF9hc3luY18gPSBmYWxzZTsKLSAgICAvLyBRdWV1ZSBkZXB0aCBvZiA4IHNlZW1zIG9wdGltYWwuIFdlIGRvbid0IHdhbnQKLSAgICAvLyB0byBoYXZlIGEgaHVnZSBkZXB0aCBhcyBpdCBtYXkgcHV0IG1vcmUgbWVtb3J5IHByZXNzdXJlCi0gICAgLy8gb24gdGhlIGtlcm5lbCB3b3JrZXIgdGhyZWFkcyBnaXZlbiB0aGF0IHdlIHVzZQotICAgIC8vIElPU1FFX0FTWU5DIGZsYWcgLSBBU1lOQyBmbGFncyBjYW4gcG90ZW50aWFsbHkKLSAgICAvLyByZXN1bHQgaW4gRUlOVFI7IFNpbmNlIHdlIGRvbid0IHJlc3RhcnQKLSAgICAvLyBzeXNjYWxscyBhbmQgZmFsbGJhY2sgdG8gc3luY2hyb25vdXMgSS9PLCB3ZQotICAgIC8vIGRvbid0IHdhbnQgaHVnZSBxdWV1ZSBkZXB0aAotICAgIGludCBxdWV1ZV9kZXB0aF8gPSA4OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgaW9fdXJpbmc+IHJpbmdfOwotfTsKLQotY2xhc3MgVXBkYXRlVmVyaWZ5IHsKLSAgcHVibGljOgotICAgIFVwZGF0ZVZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKTsKLSAgICB2b2lkIFZlcmlmeVVwZGF0ZVBhcnRpdGlvbigpOwotICAgIGJvb2wgQ2hlY2tQYXJ0aXRpb25WZXJpZmljYXRpb24oKTsKLQotICBwcml2YXRlOgotICAgIGVudW0gY2xhc3MgVXBkYXRlVmVyaWZ5U3RhdGUgewotICAgICAgICBWRVJJRllfVU5LTk9XTiwKLSAgICAgICAgVkVSSUZZX0ZBSUxFRCwKLSAgICAgICAgVkVSSUZZX1NVQ0NFU1MsCi0gICAgfTsKLQotICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87Ci0gICAgVXBkYXRlVmVyaWZ5U3RhdGUgc3RhdGVfOwotICAgIHN0ZDo6bXV0ZXggbV9sb2NrXzsKLSAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtX2N2XzsKLQotICAgIGludCBrTWluVGhyZWFkc1RvVmVyaWZ5ID0gMTsKLSAgICBpbnQga01heFRocmVhZHNUb1ZlcmlmeSA9IDQ7Ci0gICAgdWludDY0X3Qga1RocmVzaG9sZFNpemUgPSA1MTJfTWlCOwotICAgIHVpbnQ2NF90IGtCbG9ja1NpemVWZXJpZnkgPSAxX01pQjsKLQotICAgIGJvb2wgSXNCbG9ja0FsaWduZWQodWludDY0X3QgcmVhZF9zaXplKSB7IHJldHVybiAoKHJlYWRfc2l6ZSAmIChCTE9DS19TWiAtIDEpKSA9PSAwKTsgfQotICAgIHZvaWQgVXBkYXRlUGFydGl0aW9uVmVyaWZpY2F0aW9uU3RhdGUoVXBkYXRlVmVyaWZ5U3RhdGUgc3RhdGUpOwotICAgIGJvb2wgVmVyaWZ5UGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRtX2Jsb2NrX2RldmljZSk7Ci0gICAgYm9vbCBWZXJpZnlCbG9ja3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZG1fYmxvY2tfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgaW50IHNraXBfYmxvY2tzLCB1aW50NjRfdCBkZXZfc3opOwotfTsKLQotY2xhc3MgV29ya2VyIHsKLSAgcHVibGljOgotICAgIFdvcmtlcihjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udHJvbF9kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCk7Ci0gICAgYm9vbCBSdW5UaHJlYWQoKTsKLSAgICBib29sIFJ1bk1lcmdlVGhyZWFkKCk7Ci0gICAgYm9vbCBJbml0KCk7Ci0KLSAgcHJpdmF0ZToKLSAgICAvLyBJbml0aWFsaXphdGlvbgotICAgIHZvaWQgSW5pdGlhbGl6ZUJ1ZnNpbmsoKTsKLSAgICBib29sIEluaXRpYWxpemVGZHMoKTsKLSAgICBib29sIEluaXRSZWFkZXIoKTsKLSAgICB2b2lkIENsb3NlRmRzKCkgewotICAgICAgICBjdHJsX2ZkXyA9IHt9OwotICAgICAgICBiYWNraW5nX3N0b3JlX2ZkXyA9IHt9OwotICAgICAgICBiYXNlX3BhdGhfbWVyZ2VfZmRfID0ge307Ci0gICAgfQotCi0gICAgLy8gRnVuY3Rpb25zIGludGVyYWN0aW5nIHdpdGggZG0tdXNlcgotICAgIGJvb2wgUmVhZERtVXNlckhlYWRlcigpOwotICAgIGJvb2wgV3JpdGVEbVVzZXJQYXlsb2FkKHNpemVfdCBzaXplLCBib29sIGhlYWRlcl9yZXNwb25zZSk7Ci0gICAgYm9vbCBEbXVzZXJSZWFkUmVxdWVzdCgpOwotCi0gICAgLy8gSU8gUGF0aAotICAgIGJvb2wgUHJvY2Vzc0lPUmVxdWVzdCgpOwotICAgIGJvb2wgSXNCbG9ja0FsaWduZWQoc2l6ZV90IHNpemUpIHsgcmV0dXJuICgoc2l6ZSAmIChCTE9DS19TWiAtIDEpKSA9PSAwKTsgfQotCi0gICAgYm9vbCBSZWFkRGF0YUZyb21CYXNlRGV2aWNlKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHJlYWRfc2l6ZSk7Ci0gICAgYm9vbCBSZWFkRnJvbVNvdXJjZURldmljZShjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7Ci0KLSAgICBib29sIFJlYWRBbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHN6LCBib29sIGhlYWRlcl9yZXNwb25zZSk7Ci0gICAgYm9vbCBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUpOwotICAgIGludCBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj46Oml0ZXJhdG9yJiBpdCk7Ci0gICAgYm9vbCBSZXNwb25kSU9FcnJvcihib29sIGhlYWRlcl9yZXNwb25zZSk7Ci0KLSAgICAvLyBQcm9jZXNzaW5nIENPVyBvcGVyYXRpb25zCi0gICAgYm9vbCBQcm9jZXNzQ293T3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApOwotICAgIGJvb2wgUHJvY2Vzc1JlcGxhY2VPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7Ci0gICAgYm9vbCBQcm9jZXNzWmVyb09wKCk7Ci0KLSAgICAvLyBIYW5kbGVzIENvcHkgYW5kIFhvcgotICAgIGJvb2wgUHJvY2Vzc0NvcHlPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7Ci0gICAgYm9vbCBQcm9jZXNzWG9yT3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApOwotICAgIGJvb2wgUHJvY2Vzc09yZGVyZWRPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7Ci0KLSAgICAvLyBNZXJnZSByZWxhdGVkIG9wcwotICAgIGJvb2wgTWVyZ2UoKTsKLSAgICBib29sIEFzeW5jTWVyZ2UoKTsKLSAgICBib29sIFN5bmNNZXJnZSgpOwotICAgIGJvb2wgTWVyZ2VPcmRlcmVkT3BzKCk7Ci0gICAgYm9vbCBNZXJnZU9yZGVyZWRPcHNBc3luYygpOwotICAgIGJvb2wgTWVyZ2VSZXBsYWNlWmVyb09wcygpOwotICAgIGludCBQcmVwYXJlTWVyZ2UodWludDY0X3QqIHNvdXJjZV9vZmZzZXQsIGludCogcGVuZGluZ19vcHMsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiogcmVwbGFjZV96ZXJvX3ZlYyA9IG51bGxwdHIpOwotCi0gICAgc2VjdG9yX3QgQ2h1bmtUb1NlY3RvcihjaHVua190IGNodW5rKSB7IHJldHVybiBjaHVuayA8PCBDSFVOS19TSElGVDsgfQotICAgIGNodW5rX3QgU2VjdG9yVG9DaHVuayhzZWN0b3JfdCBzZWN0b3IpIHsgcmV0dXJuIHNlY3RvciA+PiBDSFVOS19TSElGVDsgfQotCi0gICAgYm9vbCBJbml0aWFsaXplSW91cmluZygpOwotICAgIHZvaWQgRmluYWxpemVJb3VyaW5nKCk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293UmVhZGVyPiByZWFkZXJfOwotICAgIEJ1ZmZlclNpbmsgYnVmc2lua187Ci0gICAgWG9yU2luayB4b3JzaW5rXzsKLQotICAgIHN0ZDo6c3RyaW5nIGNvd19kZXZpY2VfOwotICAgIHN0ZDo6c3RyaW5nIGJhY2tpbmdfc3RvcmVfZGV2aWNlXzsKLSAgICBzdGQ6OnN0cmluZyBjb250cm9sX2RldmljZV87Ci0gICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKLSAgICBzdGQ6OnN0cmluZyBiYXNlX3BhdGhfbWVyZ2VfOwotCi0gICAgdW5pcXVlX2ZkIGNvd19mZF87Ci0gICAgdW5pcXVlX2ZkIGJhY2tpbmdfc3RvcmVfZmRfOwotICAgIHVuaXF1ZV9mZCBiYXNlX3BhdGhfbWVyZ2VfZmRfOwotICAgIHVuaXF1ZV9mZCBjdHJsX2ZkXzsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBjb3dvcF9pdGVyXzsKLSAgICBzaXplX3QgcmFfYmxvY2tfaW5kZXhfID0gMDsKLSAgICB1aW50NjRfdCBibG9ja3NfbWVyZ2VkX2luX2dyb3VwXyA9IDA7Ci0gICAgYm9vbCBtZXJnZV9hc3luY18gPSBmYWxzZTsKLSAgICAvLyBRdWV1ZSBkZXB0aCBvZiA4IHNlZW1zIG9wdGltYWwuIFdlIGRvbid0IHdhbnQKLSAgICAvLyB0byBoYXZlIGEgaHVnZSBkZXB0aCBhcyBpdCBtYXkgcHV0IG1vcmUgbWVtb3J5IHByZXNzdXJlCi0gICAgLy8gb24gdGhlIGtlcm5lbCB3b3JrZXIgdGhyZWFkcyBnaXZlbiB0aGF0IHdlIHVzZQotICAgIC8vIElPU1FFX0FTWU5DIGZsYWcgLSBBU1lOQyBmbGFncyBjYW4gcG90ZW50aWFsbHkKLSAgICAvLyByZXN1bHQgaW4gRUlOVFI7IFNpbmNlIHdlIGRvbid0IHJlc3RhcnQKLSAgICAvLyBzeXNjYWxscyBhbmQgZmFsbGJhY2sgdG8gc3luY2hyb25vdXMgSS9PLCB3ZQotICAgIC8vIGRvbid0IHdhbnQgaHVnZSBxdWV1ZSBkZXB0aAotICAgIGludCBxdWV1ZV9kZXB0aF8gPSA4OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgaW9fdXJpbmc+IHJpbmdfOwotCi0gICAgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkXzsKLX07Ci0KIGNsYXNzIFNuYXBzaG90SGFuZGxlciA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFNuYXBzaG90SGFuZGxlcj4gewogICBwdWJsaWM6CiAgICAgU25hcHNob3RIYW5kbGVyKHN0ZDo6c3RyaW5nIG1pc2NfbmFtZSwgc3RkOjpzdHJpbmcgY293X2RldmljZSwgc3RkOjpzdHJpbmcgYmFja2luZ19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJhc2VfcGF0aF9tZXJnZSwgaW50IG51bV93b3JrZXJzLCBib29sIHVzZV9pb3VyaW5nLAotICAgICAgICAgICAgICAgICAgICBib29sIHBlcmZvcm1fdmVyaWZpY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgYmFzZV9wYXRoX21lcmdlLCBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBvcGVuZXIsCisgICAgICAgICAgICAgICAgICAgIGludCBudW1fd29ya2VycywgYm9vbCB1c2VfaW91cmluZywgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbiwgYm9vbCBvX2RpcmVjdCk7CiAgICAgYm9vbCBJbml0Q293RGV2aWNlKCk7CiAgICAgYm9vbCBTdGFydCgpOwogCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldENvbnRyb2xEZXZpY2VQYXRoKCkgeyByZXR1cm4gY29udHJvbF9kZXZpY2VfOyB9CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldE1pc2NOYW1lKCkgeyByZXR1cm4gbWlzY19uYW1lXzsgfQotICAgIGNvbnN0IHVpbnQ2NF90JiBHZXROdW1TZWN0b3JzKCkgeyByZXR1cm4gbnVtX3NlY3RvcnNfOyB9CisgICAgdWludDY0X3QgR2V0TnVtU2VjdG9ycygpIGNvbnN0OwogICAgIGNvbnN0IGJvb2wmIElzQXR0YWNoZWQoKSBjb25zdCB7IHJldHVybiBhdHRhY2hlZF87IH0KICAgICB2b2lkIEF0dGFjaENvbnRyb2xEZXZpY2UoKSB7IGF0dGFjaGVkXyA9IHRydWU7IH0KIApAQCAtMzE2LDExICsxMTgsNyBAQAogICAgIGJvb2wgQ29tbWl0TWVyZ2UoaW50IG51bV9tZXJnZV9vcHMpOwogCiAgICAgdm9pZCBDbG9zZUZkcygpIHsgY293X2ZkXyA9IHt9OyB9Ci0gICAgdm9pZCBGcmVlUmVzb3VyY2VzKCkgewotICAgICAgICB3b3JrZXJfdGhyZWFkc18uY2xlYXIoKTsKLSAgICAgICAgcmVhZF9haGVhZF90aHJlYWRfID0gbnVsbHB0cjsKLSAgICAgICAgbWVyZ2VfdGhyZWFkXyA9IG51bGxwdHI7Ci0gICAgfQorICAgIHZvaWQgRnJlZVJlc291cmNlcygpOwogCiAgICAgYm9vbCBJbml0aWFsaXplV29ya2VycygpOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IENsb25lUmVhZGVyRm9yV29ya2VyKCk7CkBAIC0zNDcsNiArMTQ1LDggQEAKICAgICB2b2lkIFdha2V1cE1vbml0b3JNZXJnZVRocmVhZCgpOwogICAgIHZvaWQgV2FpdEZvck1lcmdlQ29tcGxldGUoKTsKICAgICBib29sIFdhaXRGb3JNZXJnZUJlZ2luKCk7CisgICAgdm9pZCBSYVRocmVhZFN0YXJ0ZWQoKTsKKyAgICB2b2lkIFdhaXRGb3JSYVRocmVhZFRvU3RhcnQoKTsKICAgICB2b2lkIE5vdGlmeVJBRm9yTWVyZ2VSZWFkeSgpOwogICAgIGJvb2wgV2FpdEZvck1lcmdlUmVhZHkoKTsKICAgICB2b2lkIE1lcmdlRmFpbGVkKCk7CkBAIC0zNTgsNiArMTU4LDcgQEAKIAogICAgIGJvb2wgU2hvdWxkUmVjb25zdHJ1Y3REYXRhRnJvbUNvdygpIHsgcmV0dXJuIHBvcHVsYXRlX2RhdGFfZnJvbV9jb3dfOyB9CiAgICAgdm9pZCBGaW5pc2hSZWNvbnN0cnVjdERhdGFGcm9tQ293KCkgeyBwb3B1bGF0ZV9kYXRhX2Zyb21fY293XyA9IGZhbHNlOyB9CisgICAgdm9pZCBNYXJrTWVyZ2VDb21wbGV0ZSgpOwogICAgIC8vIFJldHVybiB0aGUgc25hcHNob3Qgc3RhdHVzCiAgICAgc3RkOjpzdHJpbmcgR2V0TWVyZ2VTdGF0dXMoKTsKIApAQCAtMzgzLDcgKzE4NCw3IEBACiAgICAgTUVSR0VfR1JPVVBfU1RBVEUgUHJvY2Vzc01lcmdpbmdCbG9jayh1aW50NjRfdCBuZXdfYmxvY2ssIHZvaWQqIGJ1ZmZlcik7CiAKICAgICBib29sIElzSW91cmluZ1N1cHBvcnRlZCgpOwotICAgIGJvb2wgQ2hlY2tQYXJ0aXRpb25WZXJpZmljYXRpb24oKSB7IHJldHVybiB1cGRhdGVfdmVyaWZ5Xy0+Q2hlY2tQYXJ0aXRpb25WZXJpZmljYXRpb24oKTsgfQorICAgIGJvb2wgQ2hlY2tQYXJ0aXRpb25WZXJpZmljYXRpb24oKTsKIAogICBwcml2YXRlOgogICAgIGJvb2wgUmVhZE1ldGFkYXRhKCk7CkBAIC00MDUsOCArMjA2LDYgQEAKIAogICAgIHVuaXF1ZV9mZCBjb3dfZmRfOwogCi0gICAgdWludDY0X3QgbnVtX3NlY3RvcnNfOwotCiAgICAgc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4gcmVhZGVyXzsKIAogICAgIC8vIGNodW5rX3ZlYyBzdG9yZXMgdGhlIHBzZXVkbyBtYXBwaW5nIG9mIHNlY3RvcgpAQCAtNDE5LDEyICsyMTgsMTMgQEAKICAgICB2b2lkKiBtYXBwZWRfYWRkcl87CiAgICAgc2l6ZV90IHRvdGFsX21hcHBlZF9hZGRyX2xlbmd0aF87CiAKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8V29ya2VyPj4gd29ya2VyX3RocmVhZHNfOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxSZWFkV29ya2VyPj4gd29ya2VyX3RocmVhZHNfOwogICAgIC8vIFJlYWQtYWhlYWQgcmVsYXRlZAogICAgIGJvb2wgcG9wdWxhdGVfZGF0YV9mcm9tX2Nvd18gPSBmYWxzZTsKICAgICBib29sIHJhX3RocmVhZF8gPSBmYWxzZTsKKyAgICBib29sIHJhX3RocmVhZF9zdGFydGVkXyA9IGZhbHNlOwogICAgIGludCB0b3RhbF9yYV9ibG9ja3NfbWVyZ2VkXyA9IDA7Ci0gICAgTUVSR0VfSU9fVFJBTlNJVElPTiBpb19zdGF0ZV87CisgICAgTUVSR0VfSU9fVFJBTlNJVElPTiBpb19zdGF0ZV8gPSBNRVJHRV9JT19UUkFOU0lUSU9OOjpJTlZBTElEOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWFkQWhlYWQ+IHJlYWRfYWhlYWRfdGhyZWFkXzsKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHZvaWQqPiByZWFkX2FoZWFkX2J1ZmZlcl9tYXBfOwogCkBAIC00MzQsNyArMjM0LDcgQEAKICAgICAvLyBNZXJnZSBCbG9jayBzdGF0ZQogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNZXJnZUdyb3VwU3RhdGU+PiBtZXJnZV9ibGtfc3RhdGVfOwogCi0gICAgc3RkOjp1bmlxdWVfcHRyPFdvcmtlcj4gbWVyZ2VfdGhyZWFkXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVyZ2VXb3JrZXI+IG1lcmdlX3RocmVhZF87CiAgICAgZG91YmxlIG1lcmdlX2NvbXBsZXRpb25fcGVyY2VudGFnZV87CiAKICAgICBib29sIG1lcmdlX2luaXRpYXRlZF8gPSBmYWxzZTsKQEAgLTQ0NCwxMCArMjQ0LDE2IEBACiAgICAgYm9vbCBzY3JhdGNoX3NwYWNlXyA9IGZhbHNlOwogICAgIGludCBudW1fd29ya2VyX3RocmVhZHNfID0ga051bVdvcmtlclRocmVhZHM7CiAgICAgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbl8gPSB0cnVlOworICAgIGJvb2wgcmVzdW1lX21lcmdlXyA9IGZhbHNlOworICAgIGJvb2wgbWVyZ2VfY29tcGxldGVfID0gZmFsc2U7CisgICAgYm9vbCBvX2RpcmVjdF8gPSBmYWxzZTsKIAotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgaW9fdXJpbmc+IHJpbmdfOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxVcGRhdGVWZXJpZnk+IHVwZGF0ZV92ZXJpZnlfOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJQmxvY2tTZXJ2ZXJPcGVuZXI+IGJsb2NrX3NlcnZlcl9vcGVuZXJfOwogfTsKIAorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIE1FUkdFX0lPX1RSQU5TSVRJT04gdmFsdWUpOworc3RhdGljX2Fzc2VydChzaXplb2Yob2ZmX3QpID09IHNpemVvZih1aW50NjRfdCkpOworCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2RtX3VzZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9kbV91c2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwZjcxMS4uMDAwMDAwMAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2RtX3VzZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic25hcHVzZXJkX2NvcmUuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHNuYXBzaG90IHsKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZG07Ci11c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7Ci0KLVdvcmtlcjo6V29ya2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ19kZXZpY2UsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udHJvbF9kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9wYXRoX21lcmdlLCBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpIHsKLSAgICBjb3dfZGV2aWNlXyA9IGNvd19kZXZpY2U7Ci0gICAgYmFja2luZ19zdG9yZV9kZXZpY2VfID0gYmFja2luZ19kZXZpY2U7Ci0gICAgY29udHJvbF9kZXZpY2VfID0gY29udHJvbF9kZXZpY2U7Ci0gICAgbWlzY19uYW1lXyA9IG1pc2NfbmFtZTsKLSAgICBiYXNlX3BhdGhfbWVyZ2VfID0gYmFzZV9wYXRoX21lcmdlOwotICAgIHNuYXB1c2VyZF8gPSBzbmFwdXNlcmQ7Ci19Ci0KLWJvb2wgV29ya2VyOjpJbml0aWFsaXplRmRzKCkgewotICAgIGJhY2tpbmdfc3RvcmVfZmRfLnJlc2V0KG9wZW4oYmFja2luZ19zdG9yZV9kZXZpY2VfLmNfc3RyKCksIE9fUkRPTkxZKSk7Ci0gICAgaWYgKGJhY2tpbmdfc3RvcmVfZmRfIDwgMCkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcGVuIEZhaWxlZDogIiA8PCBiYWNraW5nX3N0b3JlX2RldmljZV87Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb3dfZmRfLnJlc2V0KG9wZW4oY293X2RldmljZV8uY19zdHIoKSwgT19SRFdSKSk7Ci0gICAgaWYgKGNvd19mZF8gPCAwKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIk9wZW4gRmFpbGVkOiAiIDw8IGNvd19kZXZpY2VfOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY3RybF9mZF8ucmVzZXQob3Blbihjb250cm9sX2RldmljZV8uY19zdHIoKSwgT19SRFdSKSk7Ci0gICAgaWYgKGN0cmxfZmRfIDwgMCkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gb3BlbiAiIDw8IGNvbnRyb2xfZGV2aWNlXzsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIEJhc2UgZGV2aWNlIHVzZWQgYnkgbWVyZ2UgdGhyZWFkCi0gICAgYmFzZV9wYXRoX21lcmdlX2ZkXy5yZXNldChvcGVuKGJhc2VfcGF0aF9tZXJnZV8uY19zdHIoKSwgT19SRFdSKSk7Ci0gICAgaWYgKGJhc2VfcGF0aF9tZXJnZV9mZF8gPCAwKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIk9wZW4gRmFpbGVkOiAiIDw8IGJhc2VfcGF0aF9tZXJnZV87Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXI6OkluaXRSZWFkZXIoKSB7Ci0gICAgcmVhZGVyXyA9IHNuYXB1c2VyZF8tPkNsb25lUmVhZGVyRm9yV29ya2VyKCk7Ci0KLSAgICBpZiAoIXJlYWRlcl8tPkluaXRGb3JNZXJnZShzdGQ6Om1vdmUoY293X2ZkXykpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFN0YXJ0IHRoZSByZXBsYWNlIG9wZXJhdGlvbi4gVGhpcyB3aWxsIHJlYWQgdGhlCi0vLyBpbnRlcm5hbCBDT1cgZm9ybWF0IGFuZCBpZiB0aGUgYmxvY2sgaXMgY29tcHJlc3NlZCwKLS8vIGl0IHdpbGwgYmUgZGUtY29tcHJlc3NlZC4KLWJvb2wgV29ya2VyOjpQcm9jZXNzUmVwbGFjZU9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKSB7Ci0gICAgaWYgKCFyZWFkZXJfLT5SZWFkRGF0YSgqY293X29wLCAmYnVmc2lua18pKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc1JlcGxhY2VPcCBmYWlsZWQgZm9yIGJsb2NrICIgPDwgY293X29wLT5uZXdfYmxvY2s7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXI6OlJlYWRGcm9tU291cmNlRGV2aWNlKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKSB7Ci0gICAgdm9pZCogYnVmZmVyID0gYnVmc2lua18uR2V0UGF5bG9hZEJ1ZmZlcihCTE9DS19TWik7Ci0gICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZEZyb21CYXNlRGV2aWNlOiBGYWlsZWQgdG8gZ2V0IHBheWxvYWQgYnVmZmVyIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIiBSZWFkRnJvbUJhc2VEZXZpY2UuLi46IG5ldy1ibG9jazogIiA8PCBjb3dfb3AtPm5ld19ibG9jawotICAgICAgICAgICAgICAgICAgICA8PCAiIFNvdXJjZTogIiA8PCBjb3dfb3AtPnNvdXJjZTsKLSAgICB1aW50NjRfdCBvZmZzZXQgPSBjb3dfb3AtPnNvdXJjZTsKLSAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKLSAgICAgICAgb2Zmc2V0ICo9IEJMT0NLX1NaOwotICAgIH0KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhY2tpbmdfc3RvcmVfZmRfLCBidWZmZXIsIEJMT0NLX1NaLCBvZmZzZXQpKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG9wOwotICAgICAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApCi0gICAgICAgICAgICBvcCA9ICJDb3B5LW9wIjsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBvcCA9ICJYb3Itb3AiOwotICAgICAgICB9Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgb3AgPDwgIiBmYWlsZWQuIFJlYWQgZnJvbSBiYWNraW5nIHN0b3JlOiAiIDw8IGJhY2tpbmdfc3RvcmVfZGV2aWNlXwotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJhdCBibG9jayA6IiA8PCBvZmZzZXQgLyBCTE9DS19TWiA8PCAiIG9mZnNldDoiIDw8IG9mZnNldCAlIEJMT0NLX1NaOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFN0YXJ0IHRoZSBjb3B5IG9wZXJhdGlvbi4gVGhpcyB3aWxsIHJlYWQgdGhlIGJhY2tpbmcKLS8vIGJsb2NrIGRldmljZSB3aGljaCBpcyByZXByZXNlbnRlZCBieSBjb3dfb3AtPnNvdXJjZS4KLWJvb2wgV29ya2VyOjpQcm9jZXNzQ29weU9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKSB7Ci0gICAgaWYgKCFSZWFkRnJvbVNvdXJjZURldmljZShjb3dfb3ApKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXI6OlByb2Nlc3NYb3JPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIGlmICghUmVhZEZyb21Tb3VyY2VEZXZpY2UoY293X29wKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHhvcnNpbmtfLlJlc2V0KCk7Ci0gICAgaWYgKCFyZWFkZXJfLT5SZWFkRGF0YSgqY293X29wLCAmeG9yc2lua18pKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc1hvck9wIGZhaWxlZCBmb3IgYmxvY2sgIiA8PCBjb3dfb3AtPm5ld19ibG9jazsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlcjo6UHJvY2Vzc1plcm9PcCgpIHsKLSAgICAvLyBaZXJvIG91dCB0aGUgZW50aXJlIGJsb2NrCi0gICAgdm9pZCogYnVmZmVyID0gYnVmc2lua18uR2V0UGF5bG9hZEJ1ZmZlcihCTE9DS19TWik7Ci0gICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc1plcm9PcDogRmFpbGVkIHRvIGdldCBwYXlsb2FkIGJ1ZmZlciI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBtZW1zZXQoYnVmZmVyLCAwLCBCTE9DS19TWik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyOjpQcm9jZXNzT3JkZXJlZE9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKSB7Ci0gICAgdm9pZCogYnVmZmVyID0gYnVmc2lua18uR2V0UGF5bG9hZEJ1ZmZlcihCTE9DS19TWik7Ci0gICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc09yZGVyZWRPcDogRmFpbGVkIHRvIGdldCBwYXlsb2FkIGJ1ZmZlciI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBNRVJHRV9HUk9VUF9TVEFURSBzdGF0ZSA9IHNuYXB1c2VyZF8tPlByb2Nlc3NNZXJnaW5nQmxvY2soY293X29wLT5uZXdfYmxvY2ssIGJ1ZmZlcik7Ci0KLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgTUVSR0VfR1JPVVBfU1RBVEU6OkdST1VQX01FUkdFX0NPTVBMRVRFRDogewotICAgICAgICAgICAgLy8gTWVyZ2UgaXMgY29tcGxldGVkIGZvciB0aGlzIENPVyBvcDsganVzdCByZWFkIGRpcmVjdGx5IGZyb20KLSAgICAgICAgICAgIC8vIHRoZSBiYXNlIGRldmljZQotICAgICAgICAgICAgU05BUF9MT0coREVCVUcpIDw8ICJNZXJnZS1jb21wbGV0ZWQ6IFJlYWRpbmcgZnJvbSBiYXNlIGRldmljZSBzZWN0b3I6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoY293X29wLT5uZXdfYmxvY2sgPj4gU0VDVE9SX1NISUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQmxvY2stbnVtYmVyOiAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrOwotICAgICAgICAgICAgaWYgKCFSZWFkRGF0YUZyb21CYXNlRGV2aWNlKENodW5rVG9TZWN0b3IoY293X29wLT5uZXdfYmxvY2spLCBCTE9DS19TWikpIHsKLSAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWREYXRhRnJvbUJhc2VEZXZpY2UgYXQgc2VjdG9yOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChjb3dfb3AtPm5ld19ibG9jayA+PiBTRUNUT1JfU0hJRlQpIDw8ICIgYWZ0ZXIgbWVyZ2UtY29tcGxldGUuIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9QRU5ESU5HOiB7Ci0gICAgICAgICAgICBib29sIHJldDsKLSAgICAgICAgICAgIGlmIChjb3dfb3AtPnR5cGUgPT0ga0Nvd0NvcHlPcCkgewotICAgICAgICAgICAgICAgIHJldCA9IFByb2Nlc3NDb3B5T3AoY293X29wKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gUHJvY2Vzc1hvck9wKGNvd19vcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEkvTyBpcyBjb21wbGV0ZSAtIGRlY3JlbWVudCB0aGUgcmVmY291bnQgaXJyZXNwZWN0aXZlIG9mIHRoZSByZXR1cm4KLSAgICAgICAgICAgIC8vIHN0YXR1cwotICAgICAgICAgICAgc25hcHVzZXJkXy0+Tm90aWZ5SU9Db21wbGV0aW9uKGNvd19vcC0+bmV3X2Jsb2NrKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIHRoZSBkYXRhIGluIHRoZSBidWZmZXIgcmV0cmlldmVkIGZyb20gUkEgdGhyZWFkLgotICAgICAgICAvLyBOb3RoaW5nIHRvIHByb2Nlc3MgZnVydGhlci4KLSAgICAgICAgY2FzZSBNRVJHRV9HUk9VUF9TVEFURTo6R1JPVVBfTUVSR0VfUkFfUkVBRFk6IHsKLSAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9JTl9QUk9HUkVTUzogewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgLy8gQWxsIG90aGVyIHN0YXRlcywgZmFpbCB0aGUgSS9PIHZpeiAoR1JPVVBfTUVSR0VfRkFJTEVEIGFuZCBHUk9VUF9JTlZBTElEKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFdvcmtlcjo6UHJvY2Vzc0Nvd09wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKSB7Ci0gICAgaWYgKGNvd19vcCA9PSBudWxscHRyKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc0Nvd09wOiBJbnZhbGlkIGNvd19vcCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGNvd19vcC0+dHlwZSkgewotICAgICAgICBjYXNlIGtDb3dSZXBsYWNlT3A6IHsKLSAgICAgICAgICAgIHJldHVybiBQcm9jZXNzUmVwbGFjZU9wKGNvd19vcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtDb3daZXJvT3A6IHsKLSAgICAgICAgICAgIHJldHVybiBQcm9jZXNzWmVyb09wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtDb3dDb3B5T3A6Ci0gICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICAgIGNhc2Uga0Nvd1hvck9wOiB7Ci0gICAgICAgICAgICByZXR1cm4gUHJvY2Vzc09yZGVyZWRPcChjb3dfb3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJVbmtub3duIG9wZXJhdGlvbi10eXBlIGZvdW5kOiAiIDw8IGNvd19vcC0+dHlwZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgV29ya2VyOjpJbml0aWFsaXplQnVmc2luaygpIHsKLSAgICAvLyBBbGxvY2F0ZSB0aGUgYnVmZmVyIHdoaWNoIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbgotICAgIC8vIGRhZW1vbiBhbmQgZG0tdXNlci4gVGhlIGJ1ZmZlciBjb21wcmlzZXMgb2YgaGVhZGVyIGFuZCBhIGZpeGVkIHBheWxvYWQuCi0gICAgLy8gSWYgdGhlIGRtLXVzZXIgcmVxdWVzdHMgYSBiaWcgSU8sIHRoZSBJTyB3aWxsIGJlIGJyb2tlbiBpbnRvIGNodW5rcwotICAgIC8vIG9mIFBBWUxPQURfQlVGRkVSX1NaLgotICAgIHNpemVfdCBidWZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIpICsgUEFZTE9BRF9CVUZGRVJfU1o7Ci0gICAgYnVmc2lua18uSW5pdGlhbGl6ZShidWZfc2l6ZSk7Ci19Ci0KLWJvb2wgV29ya2VyOjpJbml0KCkgewotICAgIEluaXRpYWxpemVCdWZzaW5rKCk7Ci0gICAgeG9yc2lua18uSW5pdGlhbGl6ZSgmYnVmc2lua18sIEJMT0NLX1NaKTsKLQotICAgIGlmICghSW5pdGlhbGl6ZUZkcygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIUluaXRSZWFkZXIoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyOjpSdW5UaHJlYWQoKSB7Ci0gICAgU05BUF9MT0coSU5GTykgPDwgIlByb2Nlc3Npbmcgc25hcHNob3QgSS9PIHJlcXVlc3RzLi4uLiI7Ci0KLSAgICBpZiAoc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBnZXR0aWQoKSwga05pY2VWYWx1ZUZvck1lcmdlVGhyZWFkcykpIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCBwcmlvcml0eSBmb3IgVElEOiAiIDw8IGdldHRpZCgpOwotICAgIH0KLQotICAgIC8vIFN0YXJ0IHNlcnZpbmcgSU8KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpZiAoIVByb2Nlc3NJT1JlcXVlc3QoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDbG9zZUZkcygpOwotICAgIHJlYWRlcl8tPkNsb3NlQ293RmQoKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWFkIEhlYWRlciBmcm9tIGRtLXVzZXIgbWlzYyBkZXZpY2UuIFRoaXMgZ2l2ZXMKLS8vIHVzIHRoZSBzZWN0b3IgbnVtYmVyIGZvciB3aGljaCBJTyBpcyBpc3N1ZWQgYnkgZG0tc25hcHNob3QgZGV2aWNlCi1ib29sIFdvcmtlcjo6UmVhZERtVXNlckhlYWRlcigpIHsKLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShjdHJsX2ZkXywgYnVmc2lua18uR2V0QnVmUHRyKCksIHNpemVvZihzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIpKSkgewotICAgICAgICBpZiAoZXJybm8gIT0gRU5PVEJMSykgewotICAgICAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiQ29udHJvbC1yZWFkIGZhaWxlZCI7Ci0gICAgICAgIH0KLQotICAgICAgICBTTkFQX1BMT0coREVCVUcpIDw8ICJSZWFkRG1Vc2VySGVhZGVyIGZhaWxlZC4uLi4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNlbmQgdGhlIHBheWxvYWQvZGF0YSBiYWNrIHRvIGRtLXVzZXIgbWlzYyBkZXZpY2UuCi1ib29sIFdvcmtlcjo6V3JpdGVEbVVzZXJQYXlsb2FkKHNpemVfdCBzaXplLCBib29sIGhlYWRlcl9yZXNwb25zZSkgewotICAgIHNpemVfdCBwYXlsb2FkX3NpemUgPSBzaXplOwotICAgIHZvaWQqIGJ1ZiA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZQdHIoKTsKLSAgICBpZiAoaGVhZGVyX3Jlc3BvbnNlKSB7Ci0gICAgICAgIHBheWxvYWRfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGRtX3VzZXJfaGVhZGVyKTsKLSAgICAgICAgYnVmID0gYnVmc2lua18uR2V0QnVmUHRyKCk7Ci0gICAgfQotCi0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGN0cmxfZmRfLCBidWYsIHBheWxvYWRfc2l6ZSkpIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiV3JpdGUgdG8gZG0tdXNlciBmYWlsZWQgc2l6ZTogIiA8PCBwYXlsb2FkX3NpemU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXI6OlJlYWREYXRhRnJvbUJhc2VEZXZpY2Uoc2VjdG9yX3Qgc2VjdG9yLCBzaXplX3QgcmVhZF9zaXplKSB7Ci0gICAgQ0hFQ0socmVhZF9zaXplIDw9IEJMT0NLX1NaKTsKLQotICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZmZXIoQkxPQ0tfU1opOwotICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRGcm9tQmFzZURldmljZTogRmFpbGVkIHRvIGdldCBwYXlsb2FkIGJ1ZmZlciI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsb2ZmX3Qgb2Zmc2V0ID0gc2VjdG9yIDw8IFNFQ1RPUl9TSElGVDsKLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfcGF0aF9tZXJnZV9mZF8sIGJ1ZmZlciwgcmVhZF9zaXplLCBvZmZzZXQpKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIlJlYWREYXRhRnJvbUJhc2VEZXZpY2UgZmFpbGVkLiBmZDogIiA8PCBiYXNlX3BhdGhfbWVyZ2VfZmRfCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgImF0IHNlY3RvciA6IiA8PCBzZWN0b3IgPDwgIiBzaXplOiAiIDw8IHJlYWRfc2l6ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlcjo6UmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yX3Qgc2VjdG9yLCBzaXplX3Qgc3osIGJvb2wgaGVhZGVyX3Jlc3BvbnNlKSB7Ci0gICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIgPSBidWZzaW5rXy5HZXRIZWFkZXJQdHIoKTsKLSAgICBzaXplX3QgcmVtYWluaW5nX3NpemUgPSBzejsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+PiYgY2h1bmtfdmVjID0gc25hcHVzZXJkXy0+R2V0Q2h1bmtWZWMoKTsKLSAgICBib29sIGlvX2Vycm9yID0gZmFsc2U7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBkbyB7Ci0gICAgICAgIC8vIFByb2Nlc3MgMU1CIHBheWxvYWQgYXQgYSB0aW1lCi0gICAgICAgIHNpemVfdCByZWFkX3NpemUgPSBzdGQ6Om1pbihQQVlMT0FEX0JVRkZFUl9TWiwgcmVtYWluaW5nX3NpemUpOwotCi0gICAgICAgIGhlYWRlci0+dHlwZSA9IERNX1VTRVJfUkVTUF9TVUNDRVNTOwotICAgICAgICBzaXplX3QgdG90YWxfYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGlvX2Vycm9yID0gZmFsc2U7Ci0gICAgICAgIGJ1ZnNpbmtfLlJlc2V0QnVmZmVyT2Zmc2V0KCk7Ci0KLSAgICAgICAgd2hpbGUgKHJlYWRfc2l6ZSkgewotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBldmVyeSA0ayBibG9jayB0byB2ZXJpZnkgaWYgaXQgaXMKLSAgICAgICAgICAgIC8vIHByZXNlbnQgaW4gdGhlIG1hcHBpbmcuCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0ZDo6bWluKEJMT0NLX1NaLCByZWFkX3NpemUpOwotCi0gICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjpsb3dlcl9ib3VuZChjaHVua192ZWMuYmVnaW4oKSwgY2h1bmtfdmVjLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoc2VjdG9yLCBudWxscHRyKSwgU25hcHNob3RIYW5kbGVyOjpjb21wYXJlKTsKLSAgICAgICAgICAgIGJvb2wgbm90X2ZvdW5kID0gKGl0ID09IGNodW5rX3ZlYy5lbmQoKSB8fCBpdC0+Zmlyc3QgIT0gc2VjdG9yKTsKLQotICAgICAgICAgICAgaWYgKG5vdF9mb3VuZCkgewotICAgICAgICAgICAgICAgIC8vIEJsb2NrIG5vdCBmb3VuZCBpbiBtYXAgLSB3aGljaCBtZWFucyB0aGlzIGJsb2NrIHdhcyBub3QKLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIGFzIHBlciB0aGUgT1RBLiBKdXN0IHJvdXRlIHRoZSBJL08gdG8gdGhlIGJhc2UKLSAgICAgICAgICAgICAgICAvLyBkZXZpY2UuCi0gICAgICAgICAgICAgICAgaWYgKCFSZWFkRGF0YUZyb21CYXNlRGV2aWNlKHNlY3Rvciwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkRGF0YUZyb21CYXNlRGV2aWNlIGZhaWxlZCI7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlci0+dHlwZSA9IERNX1VTRVJfUkVTUF9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXQgPSBzaXplOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgc2VjdG9yIGluIG1hcHBpbmcuIENoZWNrIHRoZSB0eXBlIG9mIENPVyBPUCBhbmQKLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGl0LgotICAgICAgICAgICAgICAgIGlmICghUHJvY2Vzc0Nvd09wKGl0LT5zZWNvbmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc0Nvd09wIGZhaWxlZCI7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlci0+dHlwZSA9IERNX1VTRVJfUkVTUF9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXQgPSBCTE9DS19TWjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIGhlYWRlciBpZiBpdCBpcyBhbiBlcnJvcgotICAgICAgICAgICAgaWYgKGhlYWRlci0+dHlwZSA9PSBETV9VU0VSX1JFU1BfRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbmRJT0Vycm9yKGhlYWRlcl9yZXNwb25zZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlvX2Vycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVhZF9zaXplIC09IHJldDsKLSAgICAgICAgICAgIHRvdGFsX2J5dGVzX3JlYWQgKz0gcmV0OwotICAgICAgICAgICAgc2VjdG9yICs9IChyZXQgPj4gU0VDVE9SX1NISUZUKTsKLSAgICAgICAgICAgIGJ1ZnNpbmtfLlVwZGF0ZUJ1ZmZlck9mZnNldChyZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpb19lcnJvcikgewotICAgICAgICAgICAgaWYgKCFXcml0ZURtVXNlclBheWxvYWQodG90YWxfYnl0ZXNfcmVhZCwgaGVhZGVyX3Jlc3BvbnNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU05BUF9MT0coREVCVUcpIDw8ICJXcml0ZURtVXNlclBheWxvYWQgc3VjY2VzcyB0b3RhbF9ieXRlc19yZWFkOiAiIDw8IHRvdGFsX2J5dGVzX3JlYWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGhlYWRlci1yZXNwb25zZTogIiA8PCBoZWFkZXJfcmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHJlbWFpbmluZ19zaXplOiAiIDw8IHJlbWFpbmluZ19zaXplOwotICAgICAgICAgICAgaGVhZGVyX3Jlc3BvbnNlID0gZmFsc2U7Ci0gICAgICAgICAgICByZW1haW5pbmdfc2l6ZSAtPSB0b3RhbF9ieXRlc19yZWFkOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAocmVtYWluaW5nX3NpemUgPiAwICYmICFpb19lcnJvcik7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IFdvcmtlcjo6UmVhZFVuYWxpZ25lZFNlY3RvcigKLSAgICAgICAgc2VjdG9yX3Qgc2VjdG9yLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj46Oml0ZXJhdG9yJiBpdCkgewotICAgIHNpemVfdCBza2lwX3NlY3Rvcl9zaXplID0gMDsKLQotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiUmVhZFVuYWxpZ25lZFNlY3Rvcjogc2VjdG9yICIgPDwgc2VjdG9yIDw8ICIgc2l6ZTogIiA8PCBzaXplCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgQWxpZ25lZCBzZWN0b3I6ICIgPDwgaXQtPmZpcnN0OwotCi0gICAgaWYgKCFQcm9jZXNzQ293T3AoaXQtPnNlY29uZCkpIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkVW5hbGlnbmVkU2VjdG9yOiAiIDw8IHNlY3RvciA8PCAiIGZhaWxlZCBvZiBzaXplOiAiIDw8IHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQWxpZ25lZCBzZWN0b3I6ICIgPDwgaXQtPmZpcnN0OwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW50IG51bV9zZWN0b3JzX3NraXAgPSBzZWN0b3IgLSBpdC0+Zmlyc3Q7Ci0KLSAgICBpZiAobnVtX3NlY3RvcnNfc2tpcCA+IDApIHsKLSAgICAgICAgc2tpcF9zZWN0b3Jfc2l6ZSA9IG51bV9zZWN0b3JzX3NraXAgPDwgU0VDVE9SX1NISUZUOwotICAgICAgICBjaGFyKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZzaW5rXy5HZXRCdWZQdHIoKSk7Ci0gICAgICAgIHN0cnVjdCBkbV91c2VyX21lc3NhZ2UqIG1zZyA9IChzdHJ1Y3QgZG1fdXNlcl9tZXNzYWdlKikoJihidWZmZXJbMF0pKTsKLQotICAgICAgICBpZiAoc2tpcF9zZWN0b3Jfc2l6ZSA9PSBCTE9DS19TWikgewotICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJJbnZhbGlkIHVuLWFsaWduZWQgSU8gcmVxdWVzdCBhdCBzZWN0b3I6ICIgPDwgc2VjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBCYXNlLXNlY3RvcjogIiA8PCBpdC0+Zmlyc3Q7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1tb3ZlKG1zZy0+cGF5bG9hZC5idWYsIChjaGFyKiltc2ctPnBheWxvYWQuYnVmICsgc2tpcF9zZWN0b3Jfc2l6ZSwKLSAgICAgICAgICAgICAgICAoQkxPQ0tfU1ogLSBza2lwX3NlY3Rvcl9zaXplKSk7Ci0gICAgfQotCi0gICAgYnVmc2lua18uUmVzZXRCdWZmZXJPZmZzZXQoKTsKLSAgICByZXR1cm4gc3RkOjptaW4oc2l6ZSwgKEJMT0NLX1NaIC0gc2tpcF9zZWN0b3Jfc2l6ZSkpOwotfQotCi1ib29sIFdvcmtlcjo6UmVhZFVuYWxpZ25lZFNlY3RvcihzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzaXplKSB7Ci0gICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIgPSBidWZzaW5rXy5HZXRIZWFkZXJQdHIoKTsKLSAgICBoZWFkZXItPnR5cGUgPSBETV9VU0VSX1JFU1BfU1VDQ0VTUzsKLSAgICBidWZzaW5rXy5SZXNldEJ1ZmZlck9mZnNldCgpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzZWN0b3JfdCwgY29uc3QgQ293T3BlcmF0aW9uKj4+JiBjaHVua192ZWMgPSBzbmFwdXNlcmRfLT5HZXRDaHVua1ZlYygpOwotCi0gICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoY2h1bmtfdmVjLmJlZ2luKCksIGNodW5rX3ZlYy5lbmQoKSwgc3RkOjptYWtlX3BhaXIoc2VjdG9yLCBudWxscHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbmFwc2hvdEhhbmRsZXI6OmNvbXBhcmUpOwotCi0gICAgLy8gfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfAotICAgIC8vIDAgICAgICAgMSAgICAgICAyICAgICAgIDMKLSAgICAvLwotICAgIC8vIEJsb2NrIDAgLSBvcCAxCi0gICAgLy8gQmxvY2sgMSAtIG9wIDIKLSAgICAvLyBCbG9jayAyIC0gb3AgMwotICAgIC8vCi0gICAgLy8gY2h1bmtfdmVjIHdpbGwgaGF2ZSBibG9jayAwLCAxLCAyIHdoaWNoIG1hcHMgdG8gcmVsYXZhbnQgQ09XIG9wcy4KLSAgICAvLwotICAgIC8vIEVhY2ggYmxvY2sgaXMgNGsgYnl0ZXMuIFRodXMsIHRoZSBsYXN0IGJsb2NrIHdpbGwgc3BhbiA4IHNlY3RvcnMKLSAgICAvLyByYW5naW5nIHRpbGwgYmxvY2sgMyAoSG93ZXZlciwgYmxvY2sgMyB3b24ndCBiZSBpbiBjaHVua192ZWMgYXMKLSAgICAvLyBpdCBkb2Vzbid0IGhhdmUgYW55IG1hcHBpbmcgdG8gQ09XIG9wcy4gTm93LCBpZiB3ZSBnZXQgYW4gSS9PIHJlcXVlc3QgZm9yIGEgc2VjdG9yCi0gICAgLy8gc3Bhbm5pbmcgYmV0d2VlbiBibG9jayAyIGFuZCBibG9jayAzLCB3ZSBuZWVkIHRvIHN0ZXAgYmFjawotICAgIC8vIGFuZCBnZXQgaG9sZCBvZiB0aGUgbGFzdCBlbGVtZW50LgotICAgIC8vCi0gICAgLy8gQWRkaXRpb25hbGx5LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQgc2VjdG9yIGlzCi0gICAgLy8gaW5kZWVkIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIGZpbmFsIHNlY3Rvci4gSXQgaXMgcGVyZmVjdGx5IHZhbGlkCi0gICAgLy8gdG8gZ2V0IGFuIEkvTyByZXF1ZXN0IGZvciBibG9jayAzIGFuZCBiZXlvbmQgd2hpY2ggYXJlIG5vdCBtYXBwZWQKLSAgICAvLyB0byBhbnkgQ09XIG9wcy4gSW4gdGhhdCBjYXNlLCB3ZSBqdXN0IG5lZWQgdG8gcmVhZCBmcm9tIHRoZSBiYXNlCi0gICAgLy8gZGV2aWNlLgotICAgIGJvb2wgbWVyZ2VfY29tcGxldGUgPSBmYWxzZTsKLSAgICBib29sIGhlYWRlcl9yZXNwb25zZSA9IHRydWU7Ci0gICAgaWYgKGl0ID09IGNodW5rX3ZlYy5lbmQoKSkgewotICAgICAgICBpZiAoY2h1bmtfdmVjLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIEkvTyByZXF1ZXN0IGJleW9uZCB0aGUgbGFzdCBtYXBwZWQgc2VjdG9yCi0gICAgICAgICAgICBpdCA9IHN0ZDo6cHJldihjaHVua192ZWMuZW5kKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBwYXJ0aXRpb24gbWVyZ2UgaXMgY29tcGxldGUgYnV0IHNuYXBzaG90Ci0gICAgICAgICAgICAvLyBzdGF0ZSBpbiAvbWV0YWRhdGEgaXMgbm90IHlldCBkZWxldGVkOyBkdXJpbmcgdGhpcyB3aW5kb3cgaWYgdGhlCi0gICAgICAgICAgICAvLyBkZXZpY2UgaXMgcmVib290ZWQsIHN1YnNlcXVlbnQgYXR0ZW1wdCB3aWxsIG1vdW50IHRoZSBzbmFwc2hvdC4KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoZSBtZXJnZSB3YXMgY29tcGxldGVkIHdlIHdvdWxkbid0IGhhdmUgYW55Ci0gICAgICAgICAgICAvLyBtYXBwaW5nIHRvIENPVyBvcHMgdGh1cyBjaHVua192ZWMgd2lsbCBiZSBlbXB0eS4gSW4gdGhhdCBjYXNlLAotICAgICAgICAgICAgLy8gbWFyayB0aGlzIGFzIG1lcmdlX2NvbXBsZXRlIGFuZCByb3V0ZSB0aGUgSS9PIHRvIHRoZSBiYXNlIGRldmljZS4KLSAgICAgICAgICAgIG1lcmdlX2NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaXQtPmZpcnN0ICE9IHNlY3RvcikgewotICAgICAgICBpZiAoaXQgIT0gY2h1bmtfdmVjLmJlZ2luKCkpIHsKLSAgICAgICAgICAgIC0taXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gUmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yLCBzaXplLCBoZWFkZXJfcmVzcG9uc2UpOwotICAgIH0KLQotICAgIGxvZmZfdCByZXF1ZXN0ZWRfb2Zmc2V0ID0gc2VjdG9yIDw8IFNFQ1RPUl9TSElGVDsKLQotICAgIGxvZmZfdCBmaW5hbF9vZmZzZXQgPSAwOwotICAgIGlmICghbWVyZ2VfY29tcGxldGUpIHsKLSAgICAgICAgZmluYWxfb2Zmc2V0ID0gaXQtPmZpcnN0IDw8IFNFQ1RPUl9TSElGVDsKLSAgICB9Ci0KLSAgICAvLyBTaW5jZSBhIENPVyBvcCBzcGFuIDRrIGJsb2NrIHNpemUsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3RlZAotICAgIC8vIG9mZnNldCBpcyB3aXRoaW4gdGhlIDRrIHJlZ2lvbi4gQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlOgotICAgIC8vCi0gICAgLy8gfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfAotICAgIC8vIDAgICAgICAgMSAgICAgICAyICAgICAgIDMKLSAgICAvLwotICAgIC8vIEJsb2NrIDAgLSBvcCAxCi0gICAgLy8gQmxvY2sgMSAtIG9wIDIKLSAgICAvLwotICAgIC8vIFdlIGhhdmUgYW4gSS9PIHJlcXVlc3QgZm9yIGEgc2VjdG9yIGJldHdlZW4gYmxvY2sgMiBhbmQgYmxvY2sgMy4gSG93ZXZlciwKLSAgICAvLyB3ZSBoYXZlIG1hcHBpbmcgdG8gQ09XIG9wcyBvbmx5IGZvciBibG9jayAwIGFuZCBibG9jayAxLiBUaHVzLCB0aGUKLSAgICAvLyByZXF1ZXN0ZWQgb2Zmc2V0IGluIHRoaXMgY2FzZSBpcyBiZXlvbmQgdGhlIGxhc3QgbWFwcGVkIENPVyBvcCBzaXplICh3aGljaAotICAgIC8vIGlzIGJsb2NrIDEgaW4gdGhpcyBjYXNlKS4KLQotICAgIHNpemVfdCB0b3RhbF9ieXRlc19yZWFkID0gMDsKLSAgICBzaXplX3QgcmVtYWluaW5nX3NpemUgPSBzaXplOwotICAgIGludCByZXQgPSAwOwotICAgIGlmICghbWVyZ2VfY29tcGxldGUgJiYgKHJlcXVlc3RlZF9vZmZzZXQgPj0gZmluYWxfb2Zmc2V0KSAmJgotICAgICAgICAocmVxdWVzdGVkX29mZnNldCAtIGZpbmFsX29mZnNldCkgPCBCTE9DS19TWikgewotICAgICAgICAvLyBSZWFkIHRoZSBwYXJ0aWFsIHVuLWFsaWduZWQgZGF0YQotICAgICAgICByZXQgPSBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3RvciwgcmVtYWluaW5nX3NpemUsIGl0KTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZFVuYWxpZ25lZFNlY3RvciBmYWlsZWQgZm9yIHNlY3RvcjogIiA8PCBzZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNpemU6ICIgPDwgc2l6ZSA8PCAiIGl0LT5zZWN0b3I6ICIgPDwgaXQtPmZpcnN0OwotICAgICAgICAgICAgcmV0dXJuIFJlc3BvbmRJT0Vycm9yKGhlYWRlcl9yZXNwb25zZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZW1haW5pbmdfc2l6ZSAtPSByZXQ7Ci0gICAgICAgIHRvdGFsX2J5dGVzX3JlYWQgKz0gcmV0OwotICAgICAgICBzZWN0b3IgKz0gKHJldCA+PiBTRUNUT1JfU0hJRlQpOwotCi0gICAgICAgIC8vIFNlbmQgdGhlIGRhdGEgYmFjawotICAgICAgICBpZiAoIVdyaXRlRG1Vc2VyUGF5bG9hZCh0b3RhbF9ieXRlc19yZWFkLCBoZWFkZXJfcmVzcG9uc2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBoZWFkZXJfcmVzcG9uc2UgPSBmYWxzZTsKLSAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBwZW5kaW5nIGRhdGEgdG8gYmUgcHJvY2Vzc2VkLCB0aGlzIHdpbGwgYmUgYWxpZ25lZCBJL08KLSAgICAgICAgaWYgKHJlbWFpbmluZ19zaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gUmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yLCByZW1haW5pbmdfc2l6ZSwgaGVhZGVyX3Jlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYWxsIGFib3V0IGhhbmRsaW5nIEkvTyByZXF1ZXN0IHRvIGJlIHJvdXRlZCB0byBiYXNlIGRldmljZQotICAgICAgICAvLyBhcyB0aGUgSS9PIGlzIG5vdCBtYXBwZWQgdG8gYW55IG9mIHRoZSBDT1cgb3BzLgotICAgICAgICBsb2ZmX3QgYWxpZ25lZF9vZmZzZXQgPSByZXF1ZXN0ZWRfb2Zmc2V0OwotICAgICAgICAvLyBBbGlnbiB0byBuZWFyZXN0IDRrCi0gICAgICAgIGFsaWduZWRfb2Zmc2V0ICs9IEJMT0NLX1NaIC0gMTsKLSAgICAgICAgYWxpZ25lZF9vZmZzZXQgJj0gfihCTE9DS19TWiAtIDEpOwotICAgICAgICAvLyBGaW5kIHRoZSBkaWZmIG9mIHRoZSBhbGlnbmVkIG9mZnNldAotICAgICAgICBzaXplX3QgZGlmZl9zaXplID0gYWxpZ25lZF9vZmZzZXQgLSByZXF1ZXN0ZWRfb2Zmc2V0OwotICAgICAgICBDSEVDSyhkaWZmX3NpemUgPD0gQkxPQ0tfU1opOwotICAgICAgICBpZiAocmVtYWluaW5nX3NpemUgPCBkaWZmX3NpemUpIHsKLSAgICAgICAgICAgIGlmICghUmVhZERhdGFGcm9tQmFzZURldmljZShzZWN0b3IsIHJlbWFpbmluZ19zaXplKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25kSU9FcnJvcihoZWFkZXJfcmVzcG9uc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG90YWxfYnl0ZXNfcmVhZCArPSByZW1haW5pbmdfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKCFXcml0ZURtVXNlclBheWxvYWQodG90YWxfYnl0ZXNfcmVhZCwgaGVhZGVyX3Jlc3BvbnNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghUmVhZERhdGFGcm9tQmFzZURldmljZShzZWN0b3IsIGRpZmZfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uZElPRXJyb3IoaGVhZGVyX3Jlc3BvbnNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG90YWxfYnl0ZXNfcmVhZCArPSBkaWZmX3NpemU7Ci0KLSAgICAgICAgICAgIGlmICghV3JpdGVEbVVzZXJQYXlsb2FkKHRvdGFsX2J5dGVzX3JlYWQsIGhlYWRlcl9yZXNwb25zZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbWFpbmluZ19zaXplIC09IGRpZmZfc2l6ZTsKLSAgICAgICAgICAgIHNpemVfdCBudW1fc2VjdG9yc19yZWFkID0gKGRpZmZfc2l6ZSA+PiBTRUNUT1JfU0hJRlQpOwotICAgICAgICAgICAgc2VjdG9yICs9IG51bV9zZWN0b3JzX3JlYWQ7Ci0gICAgICAgICAgICBDSEVDSyhJc0Jsb2NrQWxpZ25lZChzZWN0b3IgPDwgU0VDVE9SX1NISUZUKSk7Ci0gICAgICAgICAgICBoZWFkZXJfcmVzcG9uc2UgPSBmYWxzZTsKLQotICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBwZW5kaW5nIGRhdGEgdG8gYmUgcHJvY2Vzc2VkLCB0aGlzIHdpbGwgYmUgYWxpZ25lZCBJL08KLSAgICAgICAgICAgIHJldHVybiBSZWFkQWxpZ25lZFNlY3RvcihzZWN0b3IsIHJlbWFpbmluZ19zaXplLCBoZWFkZXJfcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyOjpSZXNwb25kSU9FcnJvcihib29sIGhlYWRlcl9yZXNwb25zZSkgewotICAgIHN0cnVjdCBkbV91c2VyX2hlYWRlciogaGVhZGVyID0gYnVmc2lua18uR2V0SGVhZGVyUHRyKCk7Ci0gICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX0VSUk9SOwotICAgIC8vIFRoaXMgaXMgYW4gaXNzdWUgd2l0aCB0aGUgZG0tdXNlciBpbnRlcmZhY2UuIFRoZXJlCi0gICAgLy8gaXMgbm8gd2F5IHRvIHByb3BhZ2F0ZSB0aGUgSS9PIGVycm9yIGJhY2sgdG8gZG0tdXNlcgotICAgIC8vIGlmIHdlIGhhdmUgYWxyZWFkeSBjb21tdW5pY2F0ZWQgdGhlIGhlYWRlciBiYWNrLiBIZWFkZXIKLSAgICAvLyBpcyByZXNwb25kZWQgb25jZSBhdCB0aGUgYmVnaW5uaW5nOyBob3dldmVyIEkvTyBjYW4KLSAgICAvLyBiZSBwcm9jZXNzZWQgaW4gY2h1bmtzLiBJZiB3ZSBlbmNvdW50ZXIgYW4gSS9PIGVycm9yCi0gICAgLy8gc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHByb2Nlc3NpbmcsIHdlIGNhbid0IGNvbW11bmljYXRlCi0gICAgLy8gdGhpcyBiYWNrIHRvIGRtLXVzZXIuCi0gICAgLy8KLSAgICAvLyBUT0RPOiBGaXggdGhlIGludGVyZmFjZQotICAgIENIRUNLKGhlYWRlcl9yZXNwb25zZSk7Ci0KLSAgICBpZiAoIVdyaXRlRG1Vc2VyUGF5bG9hZCgwLCBoZWFkZXJfcmVzcG9uc2UpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgZnVydGhlciBhcyB3ZSBoYXZlIGFscmVhZHkgc2VlbgotICAgIC8vIGFuIEkvTyBlcnJvcgotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlcjo6RG11c2VyUmVhZFJlcXVlc3QoKSB7Ci0gICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIgPSBidWZzaW5rXy5HZXRIZWFkZXJQdHIoKTsKLQotICAgIC8vIFVuYWxpZ25lZCBJL08gcmVxdWVzdAotICAgIGlmICghSXNCbG9ja0FsaWduZWQoaGVhZGVyLT5zZWN0b3IgPDwgU0VDVE9SX1NISUZUKSkgewotICAgICAgICByZXR1cm4gUmVhZFVuYWxpZ25lZFNlY3RvcihoZWFkZXItPnNlY3RvciwgaGVhZGVyLT5sZW4pOwotICAgIH0KLQotICAgIHJldHVybiBSZWFkQWxpZ25lZFNlY3RvcihoZWFkZXItPnNlY3RvciwgaGVhZGVyLT5sZW4sIHRydWUpOwotfQotCi1ib29sIFdvcmtlcjo6UHJvY2Vzc0lPUmVxdWVzdCgpIHsKLSAgICBzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIqIGhlYWRlciA9IGJ1ZnNpbmtfLkdldEhlYWRlclB0cigpOwotCi0gICAgaWYgKCFSZWFkRG1Vc2VySGVhZGVyKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPnNlcTogIiA8PCBzdGQ6OmRlYyA8PCBoZWFkZXItPnNlcTsKLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT5sZW46ICIgPDwgc3RkOjpkZWMgPDwgaGVhZGVyLT5sZW47Ci0gICAgU05BUF9MT0coREVCVUcpIDw8ICJEYWVtb246IG1zZy0+c2VjdG9yOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+c2VjdG9yOwotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPnR5cGU6ICIgPDwgc3RkOjpkZWMgPDwgaGVhZGVyLT50eXBlOwotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPmZsYWdzOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+ZmxhZ3M7Ci0KLSAgICBzd2l0Y2ggKGhlYWRlci0+dHlwZSkgewotICAgICAgICBjYXNlIERNX1VTRVJfUkVRX01BUF9SRUFEOiB7Ci0gICAgICAgICAgICBpZiAoIURtdXNlclJlYWRSZXF1ZXN0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRE1fVVNFUl9SRVFfTUFQX1dSSVRFOiB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBXZSBzaG91bGQgbm90IGdldCBhbnkgd3JpdGUgcmVxdWVzdAotICAgICAgICAgICAgLy8gdG8gZG0tdXNlciBhcyB3ZSBtb3VudCBhbGwgcGFydGl0aW9ucwotICAgICAgICAgICAgLy8gYXMgcmVhZC1vbmx5LiBOZWVkIHRvIHZlcmlmeSBob3cgYXJlIFRSSU0gY29tbWFuZHMKLSAgICAgICAgICAgIC8vIGhhbmRsZWQgZHVyaW5nIG1vdW50LgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfcmVhZGFoZWFkLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfcmVhZGFoZWFkLmNwcAppbmRleCBmYmU1N2QyLi4yYmFmMjBkIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuY3BwCkBAIC0xNCw3ICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgInNuYXB1c2VyZF9yZWFkYWhlYWQuaCIKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKwogI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCisjaW5jbHVkZSAidXRpbGl0eS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewpAQCAtMzIsMTQgKzM3LDE3IEBACiB9CiAKIHZvaWQgUmVhZEFoZWFkOjpDaGVja092ZXJsYXAoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApIHsKLSAgICB1aW50NjRfdCBzb3VyY2VfYmxvY2sgPSBjb3dfb3AtPnNvdXJjZTsKLSAgICB1aW50NjRfdCBzb3VyY2Vfb2Zmc2V0ID0gMDsKLSAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dYb3JPcCkgewotICAgICAgICBzb3VyY2VfYmxvY2sgLz0gQkxPQ0tfU1o7Ci0gICAgICAgIHNvdXJjZV9vZmZzZXQgPSBjb3dfb3AtPnNvdXJjZSAlIEJMT0NLX1NaOworICAgIHVpbnQ2NF90IHNvdXJjZV9vZmZzZXQ7CisgICAgaWYgKCFyZWFkZXJfLT5HZXRTb3VyY2VPZmZzZXQoY293X29wLCAmc291cmNlX29mZnNldCkpIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkQWhlYWQgb3BlcmF0aW9uIGhhcyBubyBzb3VyY2Ugb2Zmc2V0OiAiIDw8ICpjb3dfb3A7CisgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICB1aW50NjRfdCBzb3VyY2VfYmxvY2sgPSBHZXRCbG9ja0Zyb21PZmZzZXQoaGVhZGVyXywgc291cmNlX29mZnNldCk7CisgICAgYm9vbCBtaXNhbGlnbmVkID0gKEdldEJsb2NrUmVsYXRpdmVPZmZzZXQoaGVhZGVyXywgc291cmNlX29mZnNldCkgIT0gMCk7CisKICAgICBpZiAoZGVzdF9ibG9ja3NfLmNvdW50KGNvd19vcC0+bmV3X2Jsb2NrKSB8fCBzb3VyY2VfYmxvY2tzXy5jb3VudChzb3VyY2VfYmxvY2spIHx8Ci0gICAgICAgIChzb3VyY2Vfb2Zmc2V0ID4gMCAmJiBzb3VyY2VfYmxvY2tzXy5jb3VudChzb3VyY2VfYmxvY2sgKyAxKSkpIHsKKyAgICAgICAgKG1pc2FsaWduZWQgJiYgc291cmNlX2Jsb2Nrc18uY291bnQoc291cmNlX2Jsb2NrICsgMSkpKSB7CiAgICAgICAgIG92ZXJsYXBfID0gdHJ1ZTsKICAgICB9CiAKQEAgLTY0LDExICs3MiwxMiBAQAogCiAgICAgLy8gR2V0IHRoZSBmaXJzdCBibG9jayB3aXRoIG9mZnNldAogICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gR2V0UkFPcEl0ZXIoKTsKLSAgICAqc291cmNlX29mZnNldCA9IGNvd19vcC0+c291cmNlOwogCi0gICAgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293Q29weU9wKSB7Ci0gICAgICAgICpzb3VyY2Vfb2Zmc2V0ICo9IEJMT0NLX1NaOwotICAgIH0gZWxzZSBpZiAoY293X29wLT50eXBlID09IGtDb3dYb3JPcCkgeworICAgIGlmICghcmVhZGVyXy0+R2V0U291cmNlT2Zmc2V0KGNvd19vcCwgc291cmNlX29mZnNldCkpIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJQcmVwYXJlTmV4dFJlYWRBaGVhZCBvcGVyYXRpb24gaGFzIG5vIHNvdXJjZSBvZmZzZXQ6ICIgPDwgKmNvd19vcDsKKyAgICAgICAgcmV0dXJuIG5yX2NvbnNlY3V0aXZlOworICAgIH0KKyAgICBpZiAoY293X29wLT50eXBlKCkgPT0ga0Nvd1hvck9wKSB7CiAgICAgICAgIHhvcl9vcF92ZWMucHVzaF9iYWNrKGNvd19vcCk7CiAgICAgfQogCkBAIC04NiwxMCArOTUsMTAgQEAKICAgICAgKi8KICAgICB3aGlsZSAoIVJBSXRlckRvbmUoKSAmJiBudW1fb3BzKSB7CiAgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSBHZXRSQU9wSXRlcigpOwotICAgICAgICB1aW50NjRfdCBuZXh0X29mZnNldCA9IG9wLT5zb3VyY2U7Ci0KLSAgICAgICAgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293Q29weU9wKSB7Ci0gICAgICAgICAgICBuZXh0X29mZnNldCAqPSBCTE9DS19TWjsKKyAgICAgICAgdWludDY0X3QgbmV4dF9vZmZzZXQ7CisgICAgICAgIGlmICghcmVhZGVyXy0+R2V0U291cmNlT2Zmc2V0KG9wLCAmbmV4dF9vZmZzZXQpKSB7CisgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByZXBhcmVOZXh0UmVhZEFoZWFkIG9wZXJhdGlvbiBoYXMgbm8gc291cmNlIG9mZnNldDogIiA8PCAqY293X29wOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDaGVjayBmb3IgY29uc2VjdXRpdmUgYmxvY2tzCkBAIC05Nyw3ICsxMDYsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAob3AtPnR5cGUgPT0ga0Nvd1hvck9wKSB7CisgICAgICAgIGlmIChvcC0+dHlwZSgpID09IGtDb3dYb3JPcCkgewogICAgICAgICAgICAgeG9yX29wX3ZlYy5wdXNoX2JhY2sob3ApOwogICAgICAgICB9CiAKQEAgLTExNCw2ICsxMjMsMjQgQEAKICAgICByZXR1cm4gbnJfY29uc2VjdXRpdmU7CiB9CiAKK2NsYXNzIFtbbm9kaXNjYXJkXV0gQXV0b05vdGlmeVJlYWRBaGVhZEZhaWxlZCB7CisgIHB1YmxpYzoKKyAgICBBdXRvTm90aWZ5UmVhZEFoZWFkRmFpbGVkKHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCkgOiBzbmFwdXNlcmRfKHNuYXB1c2VyZCkge30KKworICAgIH5BdXRvTm90aWZ5UmVhZEFoZWFkRmFpbGVkKCkgeworICAgICAgICBpZiAoY2FuY2VsbGVkXykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNuYXB1c2VyZF8tPlJlYWRBaGVhZElPRmFpbGVkKCk7CisgICAgfQorCisgICAgdm9pZCBDYW5jZWwoKSB7IGNhbmNlbGxlZF8gPSB0cnVlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmRfOworICAgIGJvb2wgY2FuY2VsbGVkXyA9IGZhbHNlOworfTsKKwogYm9vbCBSZWFkQWhlYWQ6OlJlY29uc3RydWN0RGF0YUZyb21Db3coKSB7CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB2b2lkKj4mIHJlYWRfYWhlYWRfYnVmZmVyX21hcCA9IHNuYXB1c2VyZF8tPkdldFJlYWRBaGVhZE1hcCgpOwogICAgIGxvZmZfdCBtZXRhZGF0YV9vZmZzZXQgPSAwOwpAQCAtMTQ1LDYgKzE3Miw4IEBACiAgICAgICAgIG1ldGFkYXRhX29mZnNldCArPSBzaXplb2Yoc3RydWN0IFNjcmF0Y2hNZXRhZGF0YSk7CiAgICAgfQogCisgICAgQXV0b05vdGlmeVJlYWRBaGVhZEZhaWxlZCBub3RpZnlfcmVhZF9haGVhZF9mYWlsZWQoc25hcHVzZXJkXyk7CisKICAgICAvLyBXZSBhcmUgZG9uZSByZS1jb25zdHJ1Y3RpbmcgdGhlIG1hcHBpbmc7IGhvd2V2ZXIsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCiAgICAgLy8gYWxsIHRoZSBDT1cgb3BlcmF0aW9ucyB0by1iZSBtZXJnZWQgYXJlIHByZXNlbnQgaW4gdGhlIHJlLWNvbnN0cnVjdGVkCiAgICAgLy8gbWFwcGluZy4KQEAgLTE2Miw3ICsxOTEsNiBAQAogICAgICAgICBpZiAoIShudW1fb3BzID09IDApKSB7CiAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlY29uc3RydWN0RGF0YUZyb21Db3cgZmFpbGVkLiBOb3QgYWxsIG9wcyByZWNvdmVyZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBQZW5kaW5nIG9wczogIiA8PCBudW1fb3BzOwotICAgICAgICAgICAgc25hcHVzZXJkXy0+UmVhZEFoZWFkSU9GYWlsZWQoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC0xNzUsMTEgKzIwMywxMiBAQAogCiAgICAgaWYgKCFzbmFwdXNlcmRfLT5SZWFkQWhlYWRJT0NvbXBsZXRlZCh0cnVlKSkgewogICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRBaGVhZElPQ29tcGxldGVkIGZhaWxlZC4uLiI7Ci0gICAgICAgIHNuYXB1c2VyZF8tPlJlYWRBaGVhZElPRmFpbGVkKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBzbmFwdXNlcmRfLT5SYVRocmVhZFN0YXJ0ZWQoKTsKICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiUmVjb25zdHJ1Y3REYXRhRnJvbUNvdyBzdWNjZXNzIjsKKyAgICBub3RpZnlfcmVhZF9haGVhZF9mYWlsZWQuQ2FuY2VsKCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTQwMiw3ICs0MzEsNyBAQAogICAgICAgICAvLyB3aWxsIGZhbGxiYWNrIHRvIHN5bmNocm9ub3VzIEkvTy4KICAgICAgICAgaW50IHJldCA9IGlvX3VyaW5nX3dhaXRfY3FlKHJpbmdfLmdldCgpLCAmY3FlKTsKICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkLWFoZWFkIC0gaW9fdXJpbmdfd2FpdF9jcWUgZmFpbGVkOiAiIDw8IHJldDsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZC1haGVhZCAtIGlvX3VyaW5nX3dhaXRfY3FlIGZhaWxlZDogIiA8PCBzdHJlcnJvcigtcmV0KTsKICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQ2NywxNCArNDk2LDIwIEBACiAgICAgICAgIGlmICh4b3Jfb3BfaW5kZXggPCB4b3Jfb3BfdmVjLnNpemUoKSkgewogICAgICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiB4b3Jfb3AgPSB4b3Jfb3BfdmVjW3hvcl9vcF9pbmRleF07CiAgICAgICAgICAgICBpZiAoeG9yX29wLT5uZXdfYmxvY2sgPT0gbmV3X2Jsb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZWFkZXJfLT5SZWFkRGF0YSgqeG9yX29wLCAmYnVmc2lua18pKSB7CisgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyID0gYnVmc2lua18uQWNxdWlyZUJ1ZmZlcihCTE9DS19TWik7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkQWhlYWQgLSBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBibG9jazogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgeG9yX29wLT5uZXdfYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNzaXplX3QgcnYgPSByZWFkZXJfLT5SZWFkRGF0YSh4b3Jfb3AsIGJ1ZmZlciwgQkxPQ0tfU1opOyBydiAhPSBCTE9DS19TWikgewogICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFJlYWRBaGVhZCAtIFhvck9wIFJlYWQgZmFpbGVkIGZvciBibG9jazogIiA8PCB4b3Jfb3AtPm5ld19ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFJlYWRBaGVhZCAtIFhvck9wIFJlYWQgZmFpbGVkIGZvciBibG9jazogIiA8PCB4b3Jfb3AtPm5ld19ibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHJldHVybiB2YWx1ZTogIiA8PCBydjsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHhvcl9vcF9pbmRleCArPSAxOwotICAgICAgICAgICAgICAgIGJ1ZnNpbmtfLlVwZGF0ZUJ1ZmZlck9mZnNldChCTE9DS19TWik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYmxvY2tfaW5kZXggKz0gMTsKQEAgLTQ5Miw2ICs1MjcsOCBAQAogICAgIGJsb2Nrc18uY2xlYXIoKTsKICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiB4b3Jfb3BfdmVjOwogCisgICAgQXV0b05vdGlmeVJlYWRBaGVhZEZhaWxlZCBub3RpZnlfcmVhZF9haGVhZF9mYWlsZWQoc25hcHVzZXJkXyk7CisKICAgICBidWZzaW5rXy5SZXNldEJ1ZmZlck9mZnNldCgpOwogCiAgICAgLy8gTnVtYmVyIG9mIG9wcyB0byBiZSBtZXJnZWQgaW4gdGhpcyB3aW5kb3cuIFRoaXMgaXMgYSBmaXhlZCBzaXplCkBAIC01MTgsOCArNTU1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBvZmZzZXQgOiIgPDwgc291cmNlX29mZnNldCAlIEJMT0NLX1NaCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnVmZmVyX29mZnNldCA6ICIgPDwgYnVmZmVyX29mZnNldCA8PCAiIGlvX3NpemUgOiAiIDw8IGlvX3NpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBidWYtYWRkciA6ICIgPDwgcmVhZF9haGVhZF9idWZmZXJfOwotCi0gICAgICAgICAgICBzbmFwdXNlcmRfLT5SZWFkQWhlYWRJT0ZhaWxlZCgpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTUzMCw2ICs1NjUsNyBAQAogCiAgICAgLy8gRG9uZSB3aXRoIG1lcmdpbmcgb3JkZXJlZCBvcHMKICAgICBpZiAoUkFJdGVyRG9uZSgpICYmIHRvdGFsX2Jsb2Nrc19tZXJnZWRfID09IDApIHsKKyAgICAgICAgbm90aWZ5X3JlYWRfYWhlYWRfZmFpbGVkLkNhbmNlbCgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTU2MCwyMCArNTk2LDI1IEBACiAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGJsb2NrIGlzIGFuIFhPUiBvcAogICAgICAgICAgICAgaWYgKHhvcl9vcC0+bmV3X2Jsb2NrID09IG5ld19ibG9jaykgewogICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHhvcidlZCBkYXRhIGZyb20gQ09XCi0gICAgICAgICAgICAgICAgaWYgKCFyZWFkZXJfLT5SZWFkRGF0YSgqeG9yX29wLCAmYnVmc2luaykpIHsKKyAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rLkdldFBheWxvYWRCdWZmZXIoQkxPQ0tfU1opOworICAgICAgICAgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZEFoZWFkIC0gZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNzaXplX3QgcnYgPSByZWFkZXJfLT5SZWFkRGF0YSh4b3Jfb3AsIGJ1ZmZlciwgQkxPQ0tfU1opOyBydiAhPSBCTE9DS19TWikgewogICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFJlYWRBaGVhZCAtIFhvck9wIFJlYWQgZmFpbGVkIGZvciBibG9jazogIiA8PCB4b3Jfb3AtPm5ld19ibG9jazsKLSAgICAgICAgICAgICAgICAgICAgc25hcHVzZXJkXy0+UmVhZEFoZWFkSU9GYWlsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFJlYWRBaGVhZCAtIFhvck9wIFJlYWQgZmFpbGVkIGZvciBibG9jazogIiA8PCB4b3Jfb3AtPm5ld19ibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHJldHVybiB2YWx1ZTogIiA8PCBydjsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBkYXRhIHJlYWQgZnJvbSBiYXNlIGRldmljZQotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZnB0cik7CisgICAgICAgICAgICAgICAgdWludDhfdCogcmVhZF9idWZmZXIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihidWZwdHIpOwogICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgeG9yJ2VkIGRhdGEgcmVhZCBmcm9tIENPVyBkZXZpY2UKICAgICAgICAgICAgICAgICB1aW50OF90KiB4b3JfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZnNpbmsuR2V0UGF5bG9hZEJ1ZlB0cigpKTsKIAogICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBvcmlnaW5hbCBkYXRhCiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgYnl0ZV9vZmZzZXQgPSAwOyBieXRlX29mZnNldCA8IEJMT0NLX1NaOyBieXRlX29mZnNldCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltieXRlX29mZnNldF0gXj0geG9yX2RhdGFbYnl0ZV9vZmZzZXRdOworICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlcltieXRlX29mZnNldF0gXj0geG9yX2RhdGFbYnl0ZV9vZmZzZXRdOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gbmV4dCBYT1Igb3AKQEAgLTYwNCw2ICs2NDUsNyBAQAogICAgIGJtLT5uZXdfYmxvY2sgPSAwOwogICAgIGJtLT5maWxlX29mZnNldCA9IDA7CiAKKyAgICBub3RpZnlfcmVhZF9haGVhZF9mYWlsZWQuQ2FuY2VsKCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTY1Miw2ICs2OTQsNyBAQAogICAgIC8vIHdpbmRvdy4gSWYgdGhlcmUgaXMgYSBjcmFzaCBkdXJpbmcgdGhpcyB0aW1lIGZyYW1lLCBtZXJnZSBzaG91bGQgcmVzdW1lCiAgICAgLy8gYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBzY3JhdGNoIHNwYWNlLgogICAgIGlmICghc25hcHVzZXJkXy0+V2FpdEZvck1lcmdlUmVhZHkoKSkgeworICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRBaGVhZCBmYWlsZWQgdG8gd2FpdCBmb3IgbWVyZ2UgcmVhZHkiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC02NzQsOSArNzE3LDEzIEBACiAgICAgdG90YWxfcmFfYmxvY2tzX2NvbXBsZXRlZF8gKz0gdG90YWxfYmxvY2tzX21lcmdlZF87CiAgICAgc25hcHVzZXJkXy0+U2V0TWVyZ2VkQmxvY2tDb3VudEZvck5leHRDb21taXQodG90YWxfYmxvY2tzX21lcmdlZF8pOwogCi0gICAgLy8gRmx1c2ggdGhlIGRhdGEgb25seSBpZiB3ZSBoYXZlIGEgb3ZlcmxhcHBpbmcgYmxvY2tzIGluIHRoZSByZWdpb24KKyAgICAvLyBGbHVzaCB0aGUgc2NyYXRjaCBkYXRhIC0gVGVjaG5pY2FsbHksIHdlIHNob3VsZCBmbHVzaCBvbmx5IGZvciBvdmVybGFwcGluZworICAgIC8vIGJsb2NrczsgSG93ZXZlciwgc2luY2UgdGhpcyByZWdpb24gaXMgbW1hcCdlZCwgdGhlIGRpcnR5IHBhZ2VzIGNhbiBzdGlsbAorICAgIC8vIGdldCBmbHVzaGVkIHRvIGRpc2sgYXQgYW55IHJhbmRvbSBwb2ludCBpbiB0aW1lLiBJbnN0ZWFkLCBtYWtlIHN1cmUKKyAgICAvLyB0aGUgZGF0YSBpbiBzY3JhdGNoIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlIGJlZm9yZSBtZXJnZSB0aHJlYWQgcmVzdW1lcy4KKyAgICAvLwogICAgIC8vIE5vdGlmeSB0aGUgTWVyZ2UgdGhyZWFkIHRvIHJlc3VtZSBtZXJnaW5nIHRoaXMgd2luZG93Ci0gICAgaWYgKCFzbmFwdXNlcmRfLT5SZWFkQWhlYWRJT0NvbXBsZXRlZChvdmVybGFwXykpIHsKKyAgICBpZiAoIXNuYXB1c2VyZF8tPlJlYWRBaGVhZElPQ29tcGxldGVkKHRydWUpKSB7CiAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZEFoZWFkSU9Db21wbGV0ZWQgZmFpbGVkLi4uIjsKICAgICAgICAgc25hcHVzZXJkXy0+UmVhZEFoZWFkSU9GYWlsZWQoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzEzLDYgKzc2MCwxMCBAQAogfQogCiBib29sIFJlYWRBaGVhZDo6UnVuVGhyZWFkKCkgeworICAgIFNOQVBfTE9HKElORk8pIDw8ICJSZWFkQWhlYWQgdGhyZWFkIHN0YXJ0ZWQuIjsKKworICAgIHB0aHJlYWRfc2V0bmFtZV9ucChwdGhyZWFkX3NlbGYoKSwgIlJlYWRBaGVhZCIpOworCiAgICAgaWYgKCFJbml0aWFsaXplRmRzKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTcyNywxMCArNzc4LDE1IEBACiAKICAgICBJbml0aWFsaXplSW91cmluZygpOwogCi0gICAgaWYgKHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgZ2V0dGlkKCksIGtOaWNlVmFsdWVGb3JNZXJnZVRocmVhZHMpKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgcHJpb3JpdHkgZm9yIFRJRDogIiA8PCBnZXR0aWQoKTsKKyAgICBpZiAoIVNldFRocmVhZFByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCkpIHsKKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCB0aHJlYWQgcHJpb3JpdHkiOwogICAgIH0KIAorICAgIGlmICghU2V0UHJvZmlsZXMoeyJDUFVTRVRfU1BfQkFDS0dST1VORCJ9KSkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYXNzaWduIHRhc2sgcHJvZmlsZSB0byByZWFkYWhlYWQgdGhyZWFkIjsKKyAgICB9CisKKyAgICBTTkFQX0xPRyhJTkZPKSA8PCAiUmVhZEFoZWFkIHByb2Nlc3NpbmcuIjsKICAgICB3aGlsZSAoIVJBSXRlckRvbmUoKSkgewogICAgICAgICBpZiAoIVJlYWRBaGVhZElPU3RhcnQoKSkgewogICAgICAgICAgICAgYnJlYWs7CkBAIC03NDEsNyArNzk3LDcgQEAKICAgICBDbG9zZUZkcygpOwogICAgIHJlYWRlcl8tPkNsb3NlQ293RmQoKTsKIAotICAgIFNOQVBfTE9HKElORk8pIDw8ICIgUmVhZEFoZWFkIHRocmVhZCB0ZXJtaW5hdGluZy4uLi4iOworICAgIFNOQVBfTE9HKElORk8pIDw8ICIgUmVhZEFoZWFkIHRocmVhZCB0ZXJtaW5hdGluZy4iOwogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC03NjgsNiArODI0LDcgQEAKICAgICBpZiAoIXJlYWRlcl8tPkluaXRGb3JNZXJnZShzdGQ6Om1vdmUoY293X2ZkXykpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgaGVhZGVyXyA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC03NzYsNyArODMzLDcgQEAKIH0KIAogYm9vbCBSZWFkQWhlYWQ6OlJBSXRlckRvbmUoKSB7Ci0gICAgaWYgKGNvd29wX2l0ZXJfLT5Eb25lKCkpIHsKKyAgICBpZiAoY293b3BfaXRlcl8tPkF0RW5kKCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC03OTQsMTUgKzg1MSwxNCBAQAogfQogCiB2b2lkIFJlYWRBaGVhZDo6UkFSZXNldEl0ZXIodWludDY0X3QgbnVtX2Jsb2NrcykgewotICAgIHdoaWxlIChudW1fYmxvY2tzICYmICFjb3dvcF9pdGVyXy0+UkRvbmUoKSkgeworICAgIHdoaWxlIChudW1fYmxvY2tzICYmICFjb3dvcF9pdGVyXy0+QXRCZWdpbigpKSB7CiAgICAgICAgIGNvd29wX2l0ZXJfLT5QcmV2KCk7CiAgICAgICAgIG51bV9ibG9ja3MgLT0gMTsKICAgICB9CiB9CiAKIGNvbnN0IENvd09wZXJhdGlvbiogUmVhZEFoZWFkOjpHZXRSQU9wSXRlcigpIHsKLSAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9ICZjb3dvcF9pdGVyXy0+R2V0KCk7Ci0gICAgcmV0dXJuIGNvd19vcDsKKyAgICByZXR1cm4gY293b3BfaXRlcl8tPkdldCgpOwogfQogCiB2b2lkIFJlYWRBaGVhZDo6SW5pdGlhbGl6ZUJ1ZmZlcigpIHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfcmVhZGFoZWFkLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYmExMjYKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5oCkBAIC0wLDAgKzEsMTEzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3JlYWRlci5oPgorI2luY2x1ZGUgPGxpYnVyaW5nLmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgU25hcHNob3RIYW5kbGVyOworCitjbGFzcyBSZWFkQWhlYWQgeworICBwdWJsaWM6CisgICAgUmVhZEFoZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ19kZXZpY2UsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCk7CisgICAgYm9vbCBSdW5UaHJlYWQoKTsKKworICBwcml2YXRlOgorICAgIHZvaWQgSW5pdGlhbGl6ZVJBSXRlcigpOworICAgIGJvb2wgUkFJdGVyRG9uZSgpOworICAgIHZvaWQgUkFJdGVyTmV4dCgpOworICAgIHZvaWQgUkFSZXNldEl0ZXIodWludDY0X3QgbnVtX2Jsb2Nrcyk7CisgICAgY29uc3QgQ293T3BlcmF0aW9uKiBHZXRSQU9wSXRlcigpOworCisgICAgdm9pZCBJbml0aWFsaXplQnVmZmVyKCk7CisgICAgYm9vbCBJbml0UmVhZGVyKCk7CisgICAgYm9vbCBJbml0aWFsaXplRmRzKCk7CisKKyAgICB2b2lkIENsb3NlRmRzKCkgeyBiYWNraW5nX3N0b3JlX2ZkXyA9IHt9OyB9CisKKyAgICBib29sIFJlYWRBaGVhZElPU3RhcnQoKTsKKyAgICBpbnQgUHJlcGFyZU5leHRSZWFkQWhlYWQodWludDY0X3QqIHNvdXJjZV9vZmZzZXQsIGludCogcGVuZGluZ19vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiYgYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiYgeG9yX29wX3ZlYyk7CisgICAgYm9vbCBSZWNvbnN0cnVjdERhdGFGcm9tQ293KCk7CisgICAgdm9pZCBDaGVja092ZXJsYXAoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApOworCisgICAgYm9vbCBSZWFkQWhlYWRBc3luY0lPKCk7CisgICAgYm9vbCBSZWFwSW9Db21wbGV0aW9ucyhpbnQgcGVuZGluZ19pb3NfdG9fY29tcGxldGUpOworICAgIGJvb2wgUmVhZFhvckRhdGEoc2l6ZV90IGJsb2NrX2luZGV4LCBzaXplX3QgeG9yX29wX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ293T3BlcmF0aW9uKj4mIHhvcl9vcF92ZWMpOworICAgIHZvaWQgUHJvY2Vzc1hvckRhdGEoc2l6ZV90JiBibG9ja194b3JfaW5kZXgsIHNpemVfdCYgeG9yX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ293T3BlcmF0aW9uKj4mIHhvcl9vcF92ZWMsIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCYgYnVmZmVyX29mZnNldCk7CisgICAgdm9pZCBVcGRhdGVTY3JhdGNoTWV0YWRhdGEoKTsKKworICAgIGJvb2wgUmVhZEFoZWFkU3luY0lPKCk7CisgICAgYm9vbCBJbml0aWFsaXplSW91cmluZygpOworICAgIHZvaWQgRmluYWxpemVJb3VyaW5nKCk7CisKKyAgICB2b2lkKiByZWFkX2FoZWFkX2J1ZmZlcl87CisgICAgdm9pZCogbWV0YWRhdGFfYnVmZmVyXzsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBjb3dvcF9pdGVyXzsKKworICAgIHN0ZDo6c3RyaW5nIGNvd19kZXZpY2VfOworICAgIHN0ZDo6c3RyaW5nIGJhY2tpbmdfc3RvcmVfZGV2aWNlXzsKKyAgICBzdGQ6OnN0cmluZyBtaXNjX25hbWVfOworCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGNvd19mZF87CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGJhY2tpbmdfc3RvcmVfZmRfOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293UmVhZGVyPiByZWFkZXJfOworICAgIENvd0hlYWRlciBoZWFkZXJfOworCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQ2NF90PiBkZXN0X2Jsb2Nrc187CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQ2NF90PiBzb3VyY2VfYmxvY2tzXzsKKyAgICBib29sIG92ZXJsYXBfOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBibG9ja3NfOworICAgIGludCB0b3RhbF9ibG9ja3NfbWVyZ2VkXyA9IDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcmFfdGVtcF9idWZmZXJfOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHJhX3RlbXBfbWV0YV9idWZmZXJfOworICAgIEJ1ZmZlclNpbmsgYnVmc2lua187CisKKyAgICB1aW50NjRfdCB0b3RhbF9yYV9ibG9ja3NfY29tcGxldGVkXyA9IDA7CisgICAgYm9vbCByZWFkX2FoZWFkX2FzeW5jXyA9IGZhbHNlOworICAgIC8vIFF1ZXVlIGRlcHRoIG9mIDggc2VlbXMgb3B0aW1hbC4gV2UgZG9uJ3Qgd2FudAorICAgIC8vIHRvIGhhdmUgYSBodWdlIGRlcHRoIGFzIGl0IG1heSBwdXQgbW9yZSBtZW1vcnkgcHJlc3N1cmUKKyAgICAvLyBvbiB0aGUga2VybmVsIHdvcmtlciB0aHJlYWRzIGdpdmVuIHRoYXQgd2UgdXNlCisgICAgLy8gSU9TUUVfQVNZTkMgZmxhZyAtIEFTWU5DIGZsYWdzIGNhbiBwb3RlbnRpYWxseQorICAgIC8vIHJlc3VsdCBpbiBFSU5UUjsgU2luY2Ugd2UgZG9uJ3QgcmVzdGFydAorICAgIC8vIHN5c2NhbGxzIGFuZCBmYWxsYmFjayB0byBzeW5jaHJvbm91cyBJL08sIHdlCisgICAgLy8gZG9uJ3Qgd2FudCBodWdlIHF1ZXVlIGRlcHRoCisgICAgaW50IHF1ZXVlX2RlcHRoXyA9IDg7CisgICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBpb191cmluZz4gcmluZ187Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5jcHAKaW5kZXggYjdjZTIxMC4uMGI4ODFiNiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9zZXJ2ZXIuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfc2VydmVyLmNwcApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxmc19tZ3IvZmlsZV93YWl0Lmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL2RtX3VzZXJfYmxvY2tfc2VydmVyLmg+CiAjaW5jbHVkZSA8c25hcHVzZXJkL3NuYXB1c2VyZF9jbGllbnQuaD4KICNpbmNsdWRlICJzbmFwdXNlcmRfc2VydmVyLmgiCiAKQEAgLTQ1LDI4ICs0NiwxMCBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKLURhZW1vbk9wcyBVc2VyU25hcHNob3RTZXJ2ZXI6OlJlc29sdmVvcChzdGQ6OnN0cmluZyYgaW5wdXQpIHsKLSAgICBpZiAoaW5wdXQgPT0gImluaXQiKSByZXR1cm4gRGFlbW9uT3BzOjpJTklUOwotICAgIGlmIChpbnB1dCA9PSAic3RhcnQiKSByZXR1cm4gRGFlbW9uT3BzOjpTVEFSVDsKLSAgICBpZiAoaW5wdXQgPT0gInN0b3AiKSByZXR1cm4gRGFlbW9uT3BzOjpTVE9QOwotICAgIGlmIChpbnB1dCA9PSAicXVlcnkiKSByZXR1cm4gRGFlbW9uT3BzOjpRVUVSWTsKLSAgICBpZiAoaW5wdXQgPT0gImRlbGV0ZSIpIHJldHVybiBEYWVtb25PcHM6OkRFTEVURTsKLSAgICBpZiAoaW5wdXQgPT0gImRldGFjaCIpIHJldHVybiBEYWVtb25PcHM6OkRFVEFDSDsKLSAgICBpZiAoaW5wdXQgPT0gInN1cHBvcnRzIikgcmV0dXJuIERhZW1vbk9wczo6U1VQUE9SVFM7Ci0gICAgaWYgKGlucHV0ID09ICJpbml0aWF0ZV9tZXJnZSIpIHJldHVybiBEYWVtb25PcHM6OklOSVRJQVRFOwotICAgIGlmIChpbnB1dCA9PSAibWVyZ2VfcGVyY2VudCIpIHJldHVybiBEYWVtb25PcHM6OlBFUkNFTlRBR0U7Ci0gICAgaWYgKGlucHV0ID09ICJnZXRzdGF0dXMiKSByZXR1cm4gRGFlbW9uT3BzOjpHRVRTVEFUVVM7Ci0gICAgaWYgKGlucHV0ID09ICJ1cGRhdGUtdmVyaWZ5IikgcmV0dXJuIERhZW1vbk9wczo6VVBEQVRFX1ZFUklGWTsKLQotICAgIHJldHVybiBEYWVtb25PcHM6OklOVkFMSUQ7Ci19Ci0KIFVzZXJTbmFwc2hvdFNlcnZlcjo6VXNlclNuYXBzaG90U2VydmVyKCkgewotICAgIG1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfLnJlc2V0KGV2ZW50ZmQoMCwgRUZEX0NMT0VYRUMpKTsKLSAgICBpZiAobW9uaXRvcl9tZXJnZV9ldmVudF9mZF8gPT0gLTEpIHsKLSAgICAgICAgUExPRyhGQVRBTCkgPDwgIm1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfOiBmYWlsZWQgdG8gY3JlYXRlIGV2ZW50ZmQiOwotICAgIH0KICAgICB0ZXJtaW5hdGluZ18gPSBmYWxzZTsKKyAgICBoYW5kbGVyc18gPSBzdGQ6Om1ha2VfdW5pcXVlPFNuYXBzaG90SGFuZGxlck1hbmFnZXI+KCk7CisgICAgYmxvY2tfc2VydmVyX2ZhY3RvcnlfID0gc3RkOjptYWtlX3VuaXF1ZTxEbVVzZXJCbG9ja1NlcnZlckZhY3Rvcnk+KCk7CiB9CiAKIFVzZXJTbmFwc2hvdFNlcnZlcjo6flVzZXJTbmFwc2hvdFNlcnZlcigpIHsKQEAgLTk5LDEyICs4Miw5IEBACiAKIHZvaWQgVXNlclNuYXBzaG90U2VydmVyOjpTaHV0ZG93blRocmVhZHMoKSB7CiAgICAgdGVybWluYXRpbmdfID0gdHJ1ZTsKLSAgICBKb2luQWxsVGhyZWFkcygpOworICAgIGhhbmRsZXJzXy0+Sm9pbkFsbFRocmVhZHMoKTsKIH0KIAotSGFuZGxlclRocmVhZDo6SGFuZGxlclRocmVhZChzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpCi0gICAgOiBzbmFwdXNlcmRfKHNuYXB1c2VyZCksIG1pc2NfbmFtZV8oc25hcHVzZXJkXy0+R2V0TWlzY05hbWUoKSkge30KLQogYm9vbCBVc2VyU25hcHNob3RTZXJ2ZXI6OlNlbmRtc2coYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKICAgICBzc2l6ZV90IHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShzZW5kKGZkLmdldCgpLCBtc2cuZGF0YSgpLCBtc2cuc2l6ZSgpLCBNU0dfTk9TSUdOQUwpKTsKICAgICBpZiAocmV0IDwgMCkgewpAQCAtMTM1LDIyNiArMTE1LDEyMyBAQAogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dDsKICAgICBQYXJzZW1zZyhzdHIsIGRlbGltLCBvdXQpOwotICAgIERhZW1vbk9wcyBvcCA9IFJlc29sdmVvcChvdXRbMF0pOwogCi0gICAgc3dpdGNoIChvcCkgewotICAgICAgICBjYXNlIERhZW1vbk9wczo6SU5JVDogewotICAgICAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXQ6Ci0gICAgICAgICAgICAvLyBpbml0LDxtaXNjX25hbWU+LDxjb3dfZGV2aWNlX3BhdGg+LDxiYWNraW5nX2RldmljZT4sPGJhc2VfcGF0aF9tZXJnZT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBSZWFkcyB0aGUgbWV0YWRhdGEgYW5kIHNlbmQgdGhlIG51bWJlciBvZiBzZWN0b3JzCi0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSA1KSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGluaXQgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOwotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdXRvIGhhbmRsZXIgPSBBZGRIYW5kbGVyKG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSk7Ci0gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXV0byByZXR2YWwgPSAic3VjY2VzcywiICsgc3RkOjp0b19zdHJpbmcoaGFuZGxlci0+c25hcHVzZXJkKCktPkdldE51bVNlY3RvcnMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgcmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wczo6U1RBUlQ6IHsKLSAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OgotICAgICAgICAgICAgLy8gc3RhcnQsPG1pc2NfbmFtZT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV3IHRocmVhZCB3aGljaCBiaW5kcyB0byBkbS11c2VyIG1pc2MgZGV2aWNlCi0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIHN0YXJ0IG1lc3NhZ2UsICIgPDwgb3V0LnNpemUoKSA8PCAiIHBhcnRzIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICAgICAgYXV0byBpdGVyID0gRmluZEhhbmRsZXIoJmxvY2ssIG91dFsxXSk7Ci0gICAgICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZmluZCBoYW5kbGVyOiAiIDw8IG91dFsxXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghKCppdGVyKS0+c25hcHVzZXJkKCkgfHwgKCppdGVyKS0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRyaWVkIHRvIHJlLWF0dGFjaCBjb250cm9sIGRldmljZTogIiA8PCBvdXRbMV07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIVN0YXJ0SGFuZGxlcigqaXRlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGFlbW9uT3BzOjpTVE9QOiB7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDogc3RvcAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFN0b3AgYWxsIHRoZSB0aHJlYWRzIGdyYWNlZnVsbHkgYW5kIHRoZW4gc2h1dGRvd24gdGhlCi0gICAgICAgICAgICAvLyBtYWluIHRocmVhZAotICAgICAgICAgICAgU2V0VGVybWluYXRpbmcoKTsKLSAgICAgICAgICAgIFNodXRkb3duVGhyZWFkcygpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYWVtb25PcHM6OlFVRVJZOiB7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDogcXVlcnkKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBcyBwYXJ0IG9mIHRyYW5zaXRpb24sIFNlY29uZCBzdGFnZSBkYWVtb24gd2lsbCBiZQotICAgICAgICAgICAgLy8gY3JlYXRlZCBiZWZvcmUgdGVybWluYXRpbmcgdGhlIGZpcnN0IHN0YWdlIGRhZW1vbi4gSGVuY2UsCi0gICAgICAgICAgICAvLyBmb3IgYSBicmllZiBwZXJpb2QgY2xpZW50IG1heSBoYXZlIHRvIGRpc3RpZ3Vpc2ggYmV0d2VlbgotICAgICAgICAgICAgLy8gZmlyc3Qgc3RhZ2UgZGFlbW9uIGFuZCBzZWNvbmQgc3RhZ2UgZGFlbW9uLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFNlY29uZCBzdGFnZSBkYWVtb24gaXMgbWFya2VkIGFzIGFjdGl2ZSBhbmQgaGVuY2Ugd2lsbAotICAgICAgICAgICAgLy8gYmUgcmVhZHkgdG8gcmVjZWl2ZSBjb250cm9sIG1lc3NhZ2UuCi0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgR2V0RGFlbW9uU3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGFlbW9uT3BzOjpERUxFVEU6IHsKLSAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OgotICAgICAgICAgICAgLy8gZGVsZXRlLDxtaXNjX25hbWU+Ci0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGRlbGV0ZSBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBvdXRbMV0pOwotICAgICAgICAgICAgICAgIGlmIChpdGVyID09IGRtX3VzZXJzXy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciBtZXJnZSBpcyBjb21wbGV0ZWQsIHdlIHN3YXAgZG0tdXNlciB0YWJsZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIGRtLWxpbmVhciBiYXNlIGRldmljZS4gSGVuY2UsIHdvcmtlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWRzIHdvdWxkIGhhdmUgdGVybWludGVkIGFuZCB3YXMgcmVtb3ZlZCBmcm9tCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJDb3VsZCBub3QgZmluZCBoYW5kbGVyOiAiIDw8IG91dFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJzdWNjZXNzIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCEoKml0ZXIpLT5UaHJlYWRUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKCppdGVyKS0+c25hcHVzZXJkKCktPk5vdGlmeUlPVGVybWluYXRlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghUmVtb3ZlQW5kSm9pbkhhbmRsZXIob3V0WzFdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJzdWNjZXNzIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYWVtb25PcHM6OkRFVEFDSDogewotICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICAgICAgVGVybWluYXRlTWVyZ2VUaHJlYWRzKCZsb2NrKTsKLSAgICAgICAgICAgIHRlcm1pbmF0aW5nXyA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wczo6U1VQUE9SVFM6IHsKLSAgICAgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYWxmb3JtZWQgc3VwcG9ydHMgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOwotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dFsxXSA9PSAic2Vjb25kX3N0YWdlX3NvY2tldF9oYW5kb2ZmIikgewotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOwotICAgICAgICAgICAgfQorICAgIGNvbnN0IGF1dG8mIGNtZCA9IG91dFswXTsKKyAgICBpZiAoY21kID09ICJpbml0IikgeworICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDoKKyAgICAgICAgLy8gaW5pdCw8bWlzY19uYW1lPiw8Y293X2RldmljZV9wYXRoPiw8YmFja2luZ19kZXZpY2U+LDxiYXNlX3BhdGhfbWVyZ2U+CisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWRzIHRoZSBtZXRhZGF0YSBhbmQgc2VuZCB0aGUgbnVtYmVyIG9mIHNlY3RvcnMKKyAgICAgICAgaWYgKG91dC5zaXplKCkgIT0gNSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGluaXQgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOwogICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBEYWVtb25PcHM6OklOSVRJQVRFOiB7Ci0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGluaXRpYXRlLW1lcmdlIG1lc3NhZ2UsICIgPDwgb3V0LnNpemUoKSA8PCAiIHBhcnRzIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRbMF0gPT0gImluaXRpYXRlX21lcmdlIikgewotICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgICAgICAgICBhdXRvIGl0ZXIgPSBGaW5kSGFuZGxlcigmbG9jaywgb3V0WzFdKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGZpbmQgaGFuZGxlcjogIiA8PCBvdXRbMV07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghU3RhcnRNZXJnZSgmbG9jaywgKml0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOwotICAgICAgICAgICAgfQorICAgICAgICBhdXRvIGhhbmRsZXIgPSBBZGRIYW5kbGVyKG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSk7CisgICAgICAgIGlmICghaGFuZGxlcikgewogICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBEYWVtb25PcHM6OlBFUkNFTlRBR0U6IHsKLSAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJjZW50YWdlID0gR2V0TWVyZ2VQZXJjZW50YWdlKCZsb2NrKTsKIAotICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsIHN0ZDo6dG9fc3RyaW5nKHBlcmNlbnRhZ2UpKTsKKyAgICAgICAgYXV0byBudW1fc2VjdG9ycyA9IGhhbmRsZXItPnNuYXB1c2VyZCgpLT5HZXROdW1TZWN0b3JzKCk7CisgICAgICAgIGlmICghbnVtX3NlY3RvcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGFlbW9uT3BzOjpHRVRTVEFUVVM6IHsKLSAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OgotICAgICAgICAgICAgLy8gZ2V0c3RhdHVzLDxtaXNjX25hbWU+Ci0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGRlbGV0ZSBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJzbmFwc2hvdC1tZXJnZS1mYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gICAgICAgICAgICAgICAgYXV0byBpdGVyID0gRmluZEhhbmRsZXIoJmxvY2ssIG91dFsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBmaW5kIGhhbmRsZXI6ICIgPDwgb3V0WzFdOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInNuYXBzaG90LW1lcmdlLWZhaWxlZCIpOwotICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lcmdlX3N0YXR1cyA9IEdldE1lcmdlU3RhdHVzKCppdGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgbWVyZ2Vfc3RhdHVzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgYXV0byByZXR2YWwgPSAic3VjY2VzcywiICsgc3RkOjp0b19zdHJpbmcobnVtX3NlY3RvcnMpOworICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgcmV0dmFsKTsKKyAgICB9IGVsc2UgaWYgKGNtZCA9PSAic3RhcnQiKSB7CisgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OgorICAgICAgICAvLyBzdGFydCw8bWlzY19uYW1lPgorICAgICAgICAvLworICAgICAgICAvLyBTdGFydCB0aGUgbmV3IHRocmVhZCB3aGljaCBiaW5kcyB0byBkbS11c2VyIG1pc2MgZGV2aWNlCisgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBzdGFydCBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKICAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wczo6VVBEQVRFX1ZFUklGWTogewotICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICAgICAgaWYgKCFVcGRhdGVWZXJpZmljYXRpb24oJmxvY2spKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9CiAKKyAgICAgICAgaWYgKCFoYW5kbGVyc18tPlN0YXJ0SGFuZGxlcihvdXRbMV0pKSB7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInN1Y2Nlc3MiKTsKKyAgICB9IGVsc2UgaWYgKGNtZCA9PSAic3RvcCIpIHsKKyAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXQ6IHN0b3AKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU3RvcCBhbGwgdGhlIHRocmVhZHMgZ3JhY2VmdWxseSBhbmQgdGhlbiBzaHV0ZG93biB0aGUKKyAgICAgICAgLy8gbWFpbiB0aHJlYWQKKyAgICAgICAgU2V0VGVybWluYXRpbmcoKTsKKyAgICAgICAgU2h1dGRvd25UaHJlYWRzKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoY21kID09ICJxdWVyeSIpIHsKKyAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXQ6IHF1ZXJ5CisgICAgICAgIC8vCisgICAgICAgIC8vIEFzIHBhcnQgb2YgdHJhbnNpdGlvbiwgU2Vjb25kIHN0YWdlIGRhZW1vbiB3aWxsIGJlCisgICAgICAgIC8vIGNyZWF0ZWQgYmVmb3JlIHRlcm1pbmF0aW5nIHRoZSBmaXJzdCBzdGFnZSBkYWVtb24uIEhlbmNlLAorICAgICAgICAvLyBmb3IgYSBicmllZiBwZXJpb2QgY2xpZW50IG1heSBoYXZlIHRvIGRpc3RpZ3Vpc2ggYmV0d2VlbgorICAgICAgICAvLyBmaXJzdCBzdGFnZSBkYWVtb24gYW5kIHNlY29uZCBzdGFnZSBkYWVtb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIFNlY29uZCBzdGFnZSBkYWVtb24gaXMgbWFya2VkIGFzIGFjdGl2ZSBhbmQgaGVuY2Ugd2lsbAorICAgICAgICAvLyBiZSByZWFkeSB0byByZWNlaXZlIGNvbnRyb2wgbWVzc2FnZS4KKyAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsIEdldERhZW1vblN0YXR1cygpKTsKKyAgICB9IGVsc2UgaWYgKGNtZCA9PSAiZGVsZXRlIikgeworICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDoKKyAgICAgICAgLy8gZGVsZXRlLDxtaXNjX25hbWU+CisgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBkZWxldGUgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOworICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYW5kbGVyc18tPkRlbGV0ZUhhbmRsZXIob3V0WzFdKSkgeworICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJzdWNjZXNzIik7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gImRldGFjaCIpIHsKKyAgICAgICAgaGFuZGxlcnNfLT5UZXJtaW5hdGVNZXJnZVRocmVhZHMoKTsKKyAgICAgICAgdGVybWluYXRpbmdfID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gInN1cHBvcnRzIikgeworICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYWxmb3JtZWQgc3VwcG9ydHMgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOworICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dFsxXSA9PSAic2Vjb25kX3N0YWdlX3NvY2tldF9oYW5kb2ZmIikgewogICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJzdWNjZXNzIik7CiAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVjZWl2ZWQgdW5rbm93biBtZXNzYWdlIHR5cGUgZnJvbSBjbGllbnQiOwotICAgICAgICAgICAgU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gImluaXRpYXRlX21lcmdlIikgeworICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYWxmb3JtZWQgaW5pdGlhdGUtbWVyZ2UgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOworICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CiAgICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgVXNlclNuYXBzaG90U2VydmVyOjpSdW5UaHJlYWQoc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+IGhhbmRsZXIpIHsKLSAgICBMT0coSU5GTykgPDwgIkVudGVyaW5nIHRocmVhZCBmb3IgaGFuZGxlcjogIiA8PCBoYW5kbGVyLT5taXNjX25hbWUoKTsKLQotICAgIGlmICghaGFuZGxlci0+c25hcHVzZXJkKCktPlN0YXJ0KCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiIEZhaWxlZCB0byBsYXVuY2ggYWxsIHdvcmtlciB0aHJlYWRzIjsKLSAgICB9Ci0KLSAgICBoYW5kbGVyLT5zbmFwdXNlcmQoKS0+Q2xvc2VGZHMoKTsKLSAgICBib29sIG1lcmdlX2NvbXBsZXRlZCA9IGhhbmRsZXItPnNuYXB1c2VyZCgpLT5DaGVja01lcmdlQ29tcGxldGlvblN0YXR1cygpOwotICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Vbm1hcEJ1ZmZlclJlZ2lvbigpOwotCi0gICAgYXV0byBtaXNjX25hbWUgPSBoYW5kbGVyLT5taXNjX25hbWUoKTsKLSAgICBMT0coSU5GTykgPDwgIkhhbmRsZXIgdGhyZWFkIGFib3V0IHRvIGV4aXQ6ICIgPDwgbWlzY19uYW1lOwotCi0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gICAgICAgIGlmIChtZXJnZV9jb21wbGV0ZWQpIHsKLSAgICAgICAgICAgIG51bV9wYXJ0aXRpb25zX21lcmdlX2NvbXBsZXRlXyArPSAxOwotICAgICAgICAgICAgYWN0aXZlX21lcmdlX3RocmVhZHNfIC09IDE7Ci0gICAgICAgICAgICBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKKyAgICAgICAgaWYgKG91dFswXSA9PSAiaW5pdGlhdGVfbWVyZ2UiKSB7CisgICAgICAgICAgICBpZiAoIWhhbmRsZXJzXy0+SW5pdGlhdGVNZXJnZShvdXRbMV0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInN1Y2Nlc3MiKTsKICAgICAgICAgfQotICAgICAgICBoYW5kbGVyLT5TZXRUaHJlYWRUZXJtaW5hdGVkKCk7Ci0gICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBoYW5kbGVyLT5taXNjX25hbWUoKSk7Ci0gICAgICAgIGlmIChpdGVyID09IGRtX3VzZXJzXy5lbmQoKSkgewotICAgICAgICAgICAgLy8gUmVtb3ZlQW5kSm9pbkhhbmRsZXIoKSBhbHJlYWR5IHJlbW92ZWQgdXMgZnJvbSB0aGUgbGlzdCwgYW5kIGlzCi0gICAgICAgICAgICAvLyBub3cgd2FpdGluZyBvbiBhIGpvaW4oKSwgc28ganVzdCByZXR1cm4uIEFkZGl0aW9uYWxseSwgcmVsZWFzZQotICAgICAgICAgICAgLy8gYWxsIHRoZSByZXNvdXJjZXMgaGVsZCBieSBzbmFwdXNlcmQgb2JqZWN0IHdoaWNoIGFyZSBzaGFyZWQKLSAgICAgICAgICAgIC8vIGJ5IHdvcmtlciB0aHJlYWRzLiBUaGlzIHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlCi0gICAgICAgICAgICAvLyBvZiAiaGFuZGxlciIgaXMgcmVsZWFzZWQ7IGJ1dCB3ZSB3aWxsIGV4cGxpY2l0bHkgcmVsZWFzZSBoZXJlCi0gICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgc25hcHVzZXJkIG9iamVjdCBpcyBmcmVlZCBhcyBpdCBpcyB0aGUgYmlnZ2VzdAotICAgICAgICAgICAgLy8gY29uc3VtZXIgb2YgbWVtb3J5IGluIHRoZSBkYWVtb24uCi0gICAgICAgICAgICBoYW5kbGVyLT5GcmVlUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIkV4aXRpbmcgaGFuZGxlciB0aHJlYWQgdG8gYWxsb3cgZm9yIGpvaW46ICIgPDwgbWlzY19uYW1lOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICB9IGVsc2UgaWYgKGNtZCA9PSAibWVyZ2VfcGVyY2VudCIpIHsKKyAgICAgICAgZG91YmxlIHBlcmNlbnRhZ2UgPSBoYW5kbGVyc18tPkdldE1lcmdlUGVyY2VudGFnZSgpOworICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgc3RkOjp0b19zdHJpbmcocGVyY2VudGFnZSkpOworICAgIH0gZWxzZSBpZiAoY21kID09ICJnZXRzdGF0dXMiKSB7CisgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OgorICAgICAgICAvLyBnZXRzdGF0dXMsPG1pc2NfbmFtZT4KKyAgICAgICAgaWYgKG91dC5zaXplKCkgIT0gMikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGRlbGV0ZSBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInNuYXBzaG90LW1lcmdlLWZhaWxlZCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgTE9HKElORk8pIDw8ICJFeGl0aW5nIGhhbmRsZXIgdGhyZWFkIGFuZCBmcmVlaW5nIHJlc291cmNlczogIiA8PCBtaXNjX25hbWU7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZXItPnRocmVhZCgpLmRldGFjaCgpOworICAgICAgICBhdXRvIHN0YXR1cyA9IGhhbmRsZXJzXy0+R2V0TWVyZ2VTdGF0dXMob3V0WzFdKTsKKyAgICAgICAgaWYgKHN0YXR1cy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInNuYXBzaG90LW1lcmdlLWZhaWxlZCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW1wb3J0YW50OiBmcmVlIHJlc291cmNlcyB3aXRoaW4gdGhlIGxvY2suIFRoaXMgZW5zdXJlcyB0aGF0IGlmCi0gICAgICAgIC8vIFdhaXRGb3JEZWxldGUoKSBpcyBjYWxsZWQsIHRoZSBoYW5kbGVyIGlzIGVpdGhlciBpbiB0aGUgbGlzdCwgb3IKLSAgICAgICAgLy8gaXQncyBub3QgYW5kIGl0cyByZXNvdXJjZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZnJlZWQuCi0gICAgICAgIGhhbmRsZXItPkZyZWVSZXNvdXJjZXMoKTsKLSAgICAgICAgZG1fdXNlcnNfLmVyYXNlKGl0ZXIpOworICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgc3RhdHVzKTsKKyAgICB9IGVsc2UgaWYgKGNtZCA9PSAidXBkYXRlLXZlcmlmeSIpIHsKKyAgICAgICAgaWYgKCFoYW5kbGVyc18tPkdldFZlcmlmaWNhdGlvblN0YXR1cygpKSB7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInN1Y2Nlc3MiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJSZWNlaXZlZCB1bmtub3duIG1lc3NhZ2UgdHlwZSBmcm9tIGNsaWVudCI7CisgICAgICAgIFNlbmRtc2coZmQsICJmYWlsIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CiAKQEAgLTQyMywyOCArMzAwLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBKb2luQWxsVGhyZWFkcygpOworICAgIGhhbmRsZXJzXy0+Sm9pbkFsbFRocmVhZHMoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBVc2VyU25hcHNob3RTZXJ2ZXI6OkpvaW5BbGxUaHJlYWRzKCkgewotICAgIC8vIEFjcXVpcmUgdGhlIHRocmVhZCBsaXN0IHdpdGhpbiB0aGUgbG9jay4KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4+IGRtX3VzZXJzOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKGxvY2tfKTsKLSAgICAgICAgZG1fdXNlcnMgPSBzdGQ6Om1vdmUoZG1fdXNlcnNfKTsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8mIGNsaWVudCA6IGRtX3VzZXJzKSB7Ci0gICAgICAgIGF1dG8mIHRoID0gY2xpZW50LT50aHJlYWQoKTsKLQotICAgICAgICBpZiAodGguam9pbmFibGUoKSkgdGguam9pbigpOwotICAgIH0KLQotICAgIHN0b3BfbW9uaXRvcl9tZXJnZV90aHJlYWRfID0gdHJ1ZTsKLSAgICBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKLX0KLQogdm9pZCBVc2VyU25hcHNob3RTZXJ2ZXI6OkFkZFdhdGNoZWRGZChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgaW50IGV2ZW50cykgewogICAgIHN0cnVjdCBwb2xsZmQgcCA9IHt9OwogICAgIHAuZmQgPSBmZC5nZXQoKTsKQEAgLTQ4Nyw3ICszNDYsOCBAQAogc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+IFVzZXJTbmFwc2hvdFNlcnZlcjo6QWRkSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBvX2RpcmVjdCkgewogICAgIC8vIFdlIHdpbGwgbmVlZCBtdWx0aXBsZSB3b3JrZXIgdGhyZWFkcyBvbmx5IGR1cmluZwogICAgIC8vIGRldmljZSBib290IGFmdGVyIE9UQS4gRm9yIGFsbCBvdGhlciBwdXJwb3NlcywKICAgICAvLyBvbmUgdGhyZWFkIGlzIHN1ZmZpY2llbnQuIFdlIGRvbid0IHdhbnQgdG8gY29uc3VtZQpAQCAtNTAxLDE5MCArMzYxLDIwIEBACiAgICAgICAgIG51bV93b3JrZXJfdGhyZWFkcyA9IDE7CiAgICAgfQogCi0gICAgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbiA9IHRydWU7Ci0gICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkVuZHNXaXRoKG1pc2NfbmFtZSwgIi1pbml0IikgfHwgaXNfc29ja2V0X3ByZXNlbnRfKSB7Ci0gICAgICAgIHBlcmZvcm1fdmVyaWZpY2F0aW9uID0gZmFsc2U7CisgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkVuZHNXaXRoKG1pc2NfbmFtZSwgIi1pbml0IikgfHwgaXNfc29ja2V0X3ByZXNlbnRfIHx8CisgICAgICAgIChhY2Nlc3Moa0Jvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCwgRl9PSykgPT0gMCkpIHsKKyAgICAgICAgaGFuZGxlcnNfLT5EaXNhYmxlVmVyaWZpY2F0aW9uKCk7CiAgICAgfQogCi0gICAgYXV0byBzbmFwdXNlcmQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNuYXBzaG90SGFuZGxlcj4obWlzY19uYW1lLCBjb3dfZGV2aWNlX3BhdGgsIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfcGF0aF9tZXJnZSwgbnVtX3dvcmtlcl90aHJlYWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX3VyaW5nX2VuYWJsZWRfLCBwZXJmb3JtX3ZlcmlmaWNhdGlvbik7Ci0gICAgaWYgKCFzbmFwdXNlcmQtPkluaXRDb3dEZXZpY2UoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBTbmFwdXNlcmQiOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9CisgICAgYXV0byBvcGVuZXIgPSBibG9ja19zZXJ2ZXJfZmFjdG9yeV8tPkNyZWF0ZU9wZW5lcihtaXNjX25hbWUpOwogCi0gICAgaWYgKCFzbmFwdXNlcmQtPkluaXRpYWxpemVXb3JrZXJzKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2VycyI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGF1dG8gaGFuZGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8SGFuZGxlclRocmVhZD4oc25hcHVzZXJkKTsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgaWYgKEZpbmRIYW5kbGVyKCZsb2NrLCBtaXNjX25hbWUpICE9IGRtX3VzZXJzXy5lbmQoKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGFuZGxlciBhbHJlYWR5IGV4aXN0czogIiA8PCBtaXNjX25hbWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBkbV91c2Vyc18ucHVzaF9iYWNrKGhhbmRsZXIpOwotICAgIH0KLSAgICByZXR1cm4gaGFuZGxlcjsKLX0KLQotYm9vbCBVc2VyU25hcHNob3RTZXJ2ZXI6OlN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpIHsKLSAgICBpZiAoaGFuZGxlci0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJIYW5kbGVyIGFscmVhZHkgYXR0YWNoZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaGFuZGxlci0+c25hcHVzZXJkKCktPkF0dGFjaENvbnRyb2xEZXZpY2UoKTsKLQotICAgIGhhbmRsZXItPnRocmVhZCgpID0gc3RkOjp0aHJlYWQoc3RkOjpiaW5kKCZVc2VyU25hcHNob3RTZXJ2ZXI6OlJ1blRocmVhZCwgdGhpcywgaGFuZGxlcikpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFVzZXJTbmFwc2hvdFNlcnZlcjo6U3RhcnRNZXJnZShzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4qIHByb29mX29mX2xvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpIHsKLSAgICBDSEVDSyhwcm9vZl9vZl9sb2NrKTsKLQotICAgIGlmICghaGFuZGxlci0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJIYW5kbGVyIG5vdCBhdHRhY2hlZCB0byBkbS11c2VyIC0gTWVyZ2UgdGhyZWFkIGNhbm5vdCBiZSBzdGFydGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Nb25pdG9yTWVyZ2UoKTsKLQotICAgIGlmICghaXNfbWVyZ2VfbW9uaXRvcl9zdGFydGVkXy5oYXNfdmFsdWUoKSkgewotICAgICAgICBzdGQ6OnRocmVhZCgmVXNlclNuYXBzaG90U2VydmVyOjpNb25pdG9yTWVyZ2UsIHRoaXMpLmRldGFjaCgpOwotICAgICAgICBpc19tZXJnZV9tb25pdG9yX3N0YXJ0ZWRfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBtZXJnZV9oYW5kbGVyc18ucHVzaChoYW5kbGVyKTsKLSAgICBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYXV0byBVc2VyU25hcHNob3RTZXJ2ZXI6OkZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSAtPiBIYW5kbGVyTGlzdDo6aXRlcmF0b3IgewotICAgIENIRUNLKHByb29mX29mX2xvY2spOwotCi0gICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgewotICAgICAgICBpZiAoKCppdGVyKS0+bWlzY19uYW1lKCkgPT0gbWlzY19uYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZG1fdXNlcnNfLmVuZCgpOwotfQotCi12b2lkIFVzZXJTbmFwc2hvdFNlcnZlcjo6VGVybWluYXRlTWVyZ2VUaHJlYWRzKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaykgewotICAgIENIRUNLKHByb29mX29mX2xvY2spOwotCi0gICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgewotICAgICAgICBpZiAoISgqaXRlciktPlRocmVhZFRlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgKCppdGVyKS0+c25hcHVzZXJkKCktPk5vdGlmeUlPVGVybWluYXRlZCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGQ6OnN0cmluZyBVc2VyU25hcHNob3RTZXJ2ZXI6OkdldE1lcmdlU3RhdHVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiYgaGFuZGxlcikgewotICAgIHJldHVybiBoYW5kbGVyLT5zbmFwdXNlcmQoKS0+R2V0TWVyZ2VTdGF0dXMoKTsKLX0KLQotZG91YmxlIFVzZXJTbmFwc2hvdFNlcnZlcjo6R2V0TWVyZ2VQZXJjZW50YWdlKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaykgewotICAgIENIRUNLKHByb29mX29mX2xvY2spOwotICAgIGRvdWJsZSBwZXJjZW50YWdlID0gMC4wOwotICAgIGludCBuID0gMDsKLQotICAgIGZvciAoYXV0byBpdGVyID0gZG1fdXNlcnNfLmJlZ2luKCk7IGl0ZXIgIT0gZG1fdXNlcnNfLmVuZCgpOyBpdGVyKyspIHsKLSAgICAgICAgYXV0byYgdGggPSAoKml0ZXIpLT50aHJlYWQoKTsKLSAgICAgICAgaWYgKHRoLmpvaW5hYmxlKCkpIHsKLSAgICAgICAgICAgIC8vIE1lcmdlIHBlcmNlbnRhZ2UgYnkgaW5kaXZpZHVhbCBwYXJ0aXRpb25zIHdoZXJlaW4gbWVyZ2UgaXMgc3RpbGwKLSAgICAgICAgICAgIC8vIGluLXByb2dyZXNzCi0gICAgICAgICAgICBwZXJjZW50YWdlICs9ICgqaXRlciktPnNuYXB1c2VyZCgpLT5HZXRNZXJnZVBlcmNlbnRhZ2UoKTsKLSAgICAgICAgICAgIG4gKz0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENhbGN1bGF0ZSBmaW5hbCBtZXJnZSBpbmNsdWRpbmcgdGhvc2UgcGFydGl0aW9ucyB3aGVyZSBtZXJnZSB3YXMgYWxyZWFkeQotICAgIC8vIGNvbXBsZXRlZCAtIG51bV9wYXJ0aXRpb25zX21lcmdlX2NvbXBsZXRlXyB3aWxsIHRyYWNrIHRoZW0gd2hlbiBlYWNoCi0gICAgLy8gdGhyZWFkIGV4aXN0cyBpbiBSdW5UaHJlYWQuCi0gICAgaW50IHRvdGFsX3BhcnRpdGlvbnMgPSBuICsgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfOwotCi0gICAgaWYgKHRvdGFsX3BhcnRpdGlvbnMpIHsKLSAgICAgICAgcGVyY2VudGFnZSA9ICgobnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfICogMTAwLjApICsgcGVyY2VudGFnZSkgLyB0b3RhbF9wYXJ0aXRpb25zOwotICAgIH0KLQotICAgIExPRyhERUJVRykgPDwgIk1lcmdlICU6ICIgPDwgcGVyY2VudGFnZQotICAgICAgICAgICAgICAgPDwgIiBudW1fcGFydGl0aW9uc19tZXJnZV9jb21wbGV0ZV86ICIgPDwgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfCi0gICAgICAgICAgICAgICA8PCAiIHRvdGFsX3BhcnRpdGlvbnM6ICIgPDwgdG90YWxfcGFydGl0aW9ucyA8PCAiIG46ICIgPDwgbjsKLSAgICByZXR1cm4gcGVyY2VudGFnZTsKLX0KLQotYm9vbCBVc2VyU25hcHNob3RTZXJ2ZXI6OlJlbW92ZUFuZEpvaW5IYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gaGFuZGxlcjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLQotICAgICAgICBhdXRvIGl0ZXIgPSBGaW5kSGFuZGxlcigmbG9jaywgbWlzY19uYW1lKTsKLSAgICAgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBDbGllbnQgYWxyZWFkeSBkZWxldGVkLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlciA9IHN0ZDo6bW92ZSgqaXRlcik7Ci0gICAgICAgIGRtX3VzZXJzXy5lcmFzZShpdGVyKTsKLSAgICB9Ci0KLSAgICBhdXRvJiB0aCA9IGhhbmRsZXItPnRocmVhZCgpOwotICAgIGlmICh0aC5qb2luYWJsZSgpKSB7Ci0gICAgICAgIHRoLmpvaW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVXNlclNuYXBzaG90U2VydmVyOjpXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKSB7Ci0gICAgdWludDY0X3Qgbm90aWZ5ID0gMTsKLSAgICBzc2l6ZV90IHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKG1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfLmdldCgpLCAmbm90aWZ5LCBzaXplb2Yobm90aWZ5KSkpOwotICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgUExPRyhGQVRBTCkgPDwgImZhaWxlZCB0byBub3RpZnkgbW9uaXRvciBtZXJnZSB0aHJlYWQiOwotICAgIH0KLX0KLQotdm9pZCBVc2VyU25hcHNob3RTZXJ2ZXI6Ok1vbml0b3JNZXJnZSgpIHsKLSAgICB3aGlsZSAoIXN0b3BfbW9uaXRvcl9tZXJnZV90aHJlYWRfKSB7Ci0gICAgICAgIHVpbnQ2NF90IHRlc3RWYWw7Ci0gICAgICAgIHNzaXplX3QgcmV0ID0KLSAgICAgICAgICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChtb25pdG9yX21lcmdlX2V2ZW50X2ZkXy5nZXQoKSwgJnRlc3RWYWwsIHNpemVvZih0ZXN0VmFsKSkpOwotICAgICAgICBpZiAocmV0ID09IC0xKSB7Ci0gICAgICAgICAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIHJlYWQgZnJvbSBldmVudGZkIjsKLSAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewotICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiSGl0IEVPRiBvbiBldmVudGZkIjsKLSAgICAgICAgfQotCi0gICAgICAgIExPRyhJTkZPKSA8PCAiTW9uaXRvck1lcmdlOiBhY3RpdmUtbWVyZ2UtdGhyZWFkczogIiA8PCBhY3RpdmVfbWVyZ2VfdGhyZWFkc187Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgICAgIHdoaWxlIChhY3RpdmVfbWVyZ2VfdGhyZWFkc18gPCBrTWF4TWVyZ2VUaHJlYWRzICYmIG1lcmdlX2hhbmRsZXJzXy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBoYW5kbGVyID0gbWVyZ2VfaGFuZGxlcnNfLmZyb250KCk7Ci0gICAgICAgICAgICAgICAgbWVyZ2VfaGFuZGxlcnNfLnBvcCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVyLT5zbmFwdXNlcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIk1vbml0b3JNZXJnZTogc2tpcHBpbmcgZGVsZXRlZCBoYW5kbGVyOiAiIDw8IGhhbmRsZXItPm1pc2NfbmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlN0YXJ0aW5nIG1lcmdlIGZvciBwYXJ0aXRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaGFuZGxlci0+c25hcHVzZXJkKCktPkdldE1pc2NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci0+c25hcHVzZXJkKCktPkluaXRpYXRlTWVyZ2UoKTsKLSAgICAgICAgICAgICAgICBhY3RpdmVfbWVyZ2VfdGhyZWFkc18gKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCAiRXhpdGluZyBNb25pdG9yTWVyZ2U6IHNpemU6ICIgPDwgbWVyZ2VfaGFuZGxlcnNfLnNpemUoKTsKKyAgICByZXR1cm4gaGFuZGxlcnNfLT5BZGRIYW5kbGVyKG1pc2NfbmFtZSwgY293X2RldmljZV9wYXRoLCBiYWNraW5nX2RldmljZSwgYmFzZV9wYXRoX21lcmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVyLCBudW1fd29ya2VyX3RocmVhZHMsIGlvX3VyaW5nX2VuYWJsZWRfLCBvX2RpcmVjdCk7CiB9CiAKIGJvb2wgVXNlclNuYXBzaG90U2VydmVyOjpXYWl0Rm9yU29ja2V0KCkgewotICAgIGF1dG8gc2NvcGVfZ3VhcmQgPSBhbmRyb2lkOjpiYXNlOjptYWtlX3Njb3BlX2d1YXJkKFt0aGlzXSgpIC0+IHZvaWQgeyBKb2luQWxsVGhyZWFkcygpOyB9KTsKKyAgICBhdXRvIHNjb3BlX2d1YXJkID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6Om1ha2Vfc2NvcGVfZ3VhcmQoW3RoaXNdKCkgLT4gdm9pZCB7IGhhbmRsZXJzXy0+Sm9pbkFsbFRocmVhZHMoKTsgfSk7CiAKICAgICBhdXRvIHNvY2tldF9wYXRoID0gQU5EUk9JRF9TT0NLRVRfRElSICIvInMgKyBrU25hcHVzZXJkU29ja2V0UHJveHk7CiAKQEAgLTc4MSwyMSArNDcxLDggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBVc2VyU25hcHNob3RTZXJ2ZXI6OlVwZGF0ZVZlcmlmaWNhdGlvbihzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4qIHByb29mX29mX2xvY2spIHsKLSAgICBDSEVDSyhwcm9vZl9vZl9sb2NrKTsKLQotICAgIGJvb2wgc3RhdHVzID0gdHJ1ZTsKLSAgICBmb3IgKGF1dG8gaXRlciA9IGRtX3VzZXJzXy5iZWdpbigpOyBpdGVyICE9IGRtX3VzZXJzXy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgICAgIGF1dG8mIHRoID0gKCppdGVyKS0+dGhyZWFkKCk7Ci0gICAgICAgIGlmICh0aC5qb2luYWJsZSgpICYmIHN0YXR1cykgewotICAgICAgICAgICAgc3RhdHVzID0gKCppdGVyKS0+c25hcHVzZXJkKCktPkNoZWNrUGFydGl0aW9uVmVyaWZpY2F0aW9uKCkgJiYgc3RhdHVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGlzIGEgZmFpbHVyZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKK2Jvb2wgVXNlclNuYXBzaG90U2VydmVyOjpTdGFydEhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgeworICAgIHJldHVybiBoYW5kbGVyc18tPlN0YXJ0SGFuZGxlcihtaXNjX25hbWUpOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfc2VydmVyLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5oCmluZGV4IDEyYzM5MDMuLjMwMTNjNDcgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfc2VydmVyLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9zZXJ2ZXIuaApAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvYmxvY2tfc2VydmVyLmg+CisjaW5jbHVkZSAiaGFuZGxlcl9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAic25hcHVzZXJkX2NvcmUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzgsNDggKzQwLDggQEAKIAogc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4UGFja2V0U2l6ZSA9IDUxMjsKIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTWF4TWVyZ2VUaHJlYWRzID0gMjsKLQotZW51bSBjbGFzcyBEYWVtb25PcHMgewotICAgIElOSVQsCi0gICAgU1RBUlQsCi0gICAgUVVFUlksCi0gICAgU1RPUCwKLSAgICBERUxFVEUsCi0gICAgREVUQUNILAotICAgIFNVUFBPUlRTLAotICAgIElOSVRJQVRFLAotICAgIFBFUkNFTlRBR0UsCi0gICAgR0VUU1RBVFVTLAotICAgIFVQREFURV9WRVJJRlksCi0gICAgSU5WQUxJRCwKLX07Ci0KLWNsYXNzIEhhbmRsZXJUaHJlYWQgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSGFuZGxlclRocmVhZChzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpOwotCi0gICAgdm9pZCBGcmVlUmVzb3VyY2VzKCkgewotICAgICAgICAvLyBFYWNoIHdvcmtlciB0aHJlYWQgaG9sZHMgYSByZWZlcmVuY2UgdG8gc25hcHVzZXJkLgotICAgICAgICAvLyBDbGVhciB0aGVtIHNvIHRoYXQgYWxsIHRoZSByZXNvdXJjZXMKLSAgICAgICAgLy8gaGVsZCBieSBzbmFwdXNlcmQgaXMgcmVsZWFzZWQKLSAgICAgICAgaWYgKHNuYXB1c2VyZF8pIHsKLSAgICAgICAgICAgIHNuYXB1c2VyZF8tPkZyZWVSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIHNuYXB1c2VyZF8gPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+JiBzbmFwdXNlcmQoKSBjb25zdCB7IHJldHVybiBzbmFwdXNlcmRfOyB9Ci0gICAgc3RkOjp0aHJlYWQmIHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF87IH0KLQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUoKSBjb25zdCB7IHJldHVybiBtaXNjX25hbWVfOyB9Ci0gICAgYm9vbCBUaHJlYWRUZXJtaW5hdGVkKCkgeyByZXR1cm4gdGhyZWFkX3Rlcm1pbmF0ZWRfOyB9Ci0gICAgdm9pZCBTZXRUaHJlYWRUZXJtaW5hdGVkKCkgeyB0aHJlYWRfdGVybWluYXRlZF8gPSB0cnVlOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBzdGQ6OnRocmVhZCB0aHJlYWRfOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZF87Ci0gICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKLSAgICBib29sIHRocmVhZF90ZXJtaW5hdGVkXyA9IGZhbHNlOwotfTsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrQm9vdFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoW10gPQorICAgICAgICAiL21ldGFkYXRhL290YS9zbmFwc2hvdC1ib290LXdpdGhvdXQtc2xvdC1zd2l0Y2giOwogCiBjbGFzcyBVc2VyU25hcHNob3RTZXJ2ZXIgewogICBwcml2YXRlOgpAQCAtODgsMjEgKzUwLDEzIEBACiAgICAgdm9sYXRpbGUgYm9vbCByZWNlaXZlZF9zb2NrZXRfc2lnbmFsXyA9IGZhbHNlOwogICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCBwb2xsZmQ+IHdhdGNoZWRfZmRzXzsKICAgICBib29sIGlzX3NvY2tldF9wcmVzZW50XyA9IGZhbHNlOwotICAgIGludCBudW1fcGFydGl0aW9uc19tZXJnZV9jb21wbGV0ZV8gPSAwOwotICAgIGludCBhY3RpdmVfbWVyZ2VfdGhyZWFkc18gPSAwOwotICAgIGJvb2wgc3RvcF9tb25pdG9yX21lcmdlX3RocmVhZF8gPSBmYWxzZTsKICAgICBib29sIGlzX3NlcnZlcl9ydW5uaW5nXyA9IGZhbHNlOwogICAgIGJvb2wgaW9fdXJpbmdfZW5hYmxlZF8gPSBmYWxzZTsKLSAgICBzdGQ6Om9wdGlvbmFsPGJvb2w+IGlzX21lcmdlX21vbml0b3Jfc3RhcnRlZF87Ci0KLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgbW9uaXRvcl9tZXJnZV9ldmVudF9mZF87CisgICAgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyPiBoYW5kbGVyc187CisgICAgc3RkOjp1bmlxdWVfcHRyPElCbG9ja1NlcnZlckZhY3Rvcnk+IGJsb2NrX3NlcnZlcl9mYWN0b3J5XzsKIAogICAgIHN0ZDo6bXV0ZXggbG9ja187CiAKLSAgICB1c2luZyBIYW5kbGVyTGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPj47Ci0gICAgSGFuZGxlckxpc3QgZG1fdXNlcnNfOwotICAgIHN0ZDo6cXVldWU8c3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+PiBtZXJnZV9oYW5kbGVyc187Ci0KICAgICB2b2lkIEFkZFdhdGNoZWRGZChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgaW50IGV2ZW50cyk7CiAgICAgdm9pZCBBY2NlcHRDbGllbnQoKTsKICAgICBib29sIEhhbmRsZUNsaWVudChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgaW50IHJldmVudHMpOwpAQCAtMTExLDI4ICs2NSwxNCBAQAogICAgIGJvb2wgUmVjZWl2ZW1zZyhhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CiAKICAgICB2b2lkIFNodXRkb3duVGhyZWFkcygpOwotICAgIGJvb2wgUmVtb3ZlQW5kSm9pbkhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRyb2xfZGV2aWNlKTsKLSAgICBEYWVtb25PcHMgUmVzb2x2ZW9wKHN0ZDo6c3RyaW5nJiBpbnB1dCk7CiAgICAgc3RkOjpzdHJpbmcgR2V0RGFlbW9uU3RhdHVzKCk7CiAgICAgdm9pZCBQYXJzZW1zZyhzdGQ6OnN0cmluZyBjb25zdCYgbXNnLCBjb25zdCBjaGFyIGRlbGltLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG91dCk7CiAKICAgICBib29sIElzVGVybWluYXRpbmcoKSB7IHJldHVybiB0ZXJtaW5hdGluZ187IH0KIAotICAgIHZvaWQgUnVuVGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiBoYW5kbGVyKTsKLSAgICB2b2lkIE1vbml0b3JNZXJnZSgpOwotCiAgICAgdm9pZCBKb2luQWxsVGhyZWFkcygpOwogICAgIGJvb2wgU3RhcnRXaXRoU29ja2V0KGJvb2wgc3RhcnRfbGlzdGVuaW5nKTsKIAotICAgIC8vIEZpbmQgYSBIYW5kbGVyVGhyZWFkIHdpdGhpbiBhIGxvY2suCi0gICAgSGFuZGxlckxpc3Q6Oml0ZXJhdG9yIEZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7Ci0KLSAgICBkb3VibGUgR2V0TWVyZ2VQZXJjZW50YWdlKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jayk7Ci0gICAgdm9pZCBUZXJtaW5hdGVNZXJnZVRocmVhZHMoc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+KiBwcm9vZl9vZl9sb2NrKTsKLQotICAgIGJvb2wgVXBkYXRlVmVyaWZpY2F0aW9uKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jayk7Ci0KICAgcHVibGljOgogICAgIFVzZXJTbmFwc2hvdFNlcnZlcigpOwogICAgIH5Vc2VyU25hcHNob3RTZXJ2ZXIoKTsKQEAgLTE0NiwxMyArODYsMTAgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gQWRkSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UpOwotICAgIGJvb2wgU3RhcnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiYgaGFuZGxlcik7Ci0gICAgYm9vbCBTdGFydE1lcmdlKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+JiBoYW5kbGVyKTsKLSAgICBzdGQ6OnN0cmluZyBHZXRNZXJnZVN0YXR1cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvX2RpcmVjdCA9IGZhbHNlKTsKKyAgICBib29sIFN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKTsKIAotICAgIHZvaWQgV2FrZXVwTW9uaXRvck1lcmdlVGhyZWFkKCk7CiAgICAgdm9pZCBTZXRUZXJtaW5hdGluZygpIHsgdGVybWluYXRpbmdfID0gdHJ1ZTsgfQogICAgIHZvaWQgUmVjZWl2ZWRTb2NrZXRTaWduYWwoKSB7IHJlY2VpdmVkX3NvY2tldF9zaWduYWxfID0gdHJ1ZTsgfQogICAgIHZvaWQgU2V0U2VydmVyUnVubmluZygpIHsgaXNfc2VydmVyX3J1bm5pbmdfID0gdHJ1ZTsgfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF90ZXN0LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdGVzdC5jcHAKaW5kZXggMTQyMTQwMy4uOGRkYjBmNCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF90ZXN0LmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3Rlc3QuY3BwCkBAIC0xNyw3ICsxNyw2IEBACiAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtZmQuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CkBAIC0zNywxMiArMzYsMTYgQEAKICNpbmNsdWRlIDxsaWJkbS9kbS5oPgogI2luY2x1ZGUgPGxpYmRtL2xvb3BfY29udHJvbC5oPgogI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KLSNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5oPgorI2luY2x1ZGUgPHNuYXB1c2VyZC9kbV91c2VyX2Jsb2NrX3NlcnZlci5oPgogI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgotCisjaW5jbHVkZSAiaGFuZGxlcl9tYW5hZ2VyLmgiCisjaW5jbHVkZSAibWVyZ2Vfd29ya2VyLmgiCisjaW5jbHVkZSAicmVhZF93b3JrZXIuaCIKICNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgotCi1ERUZJTkVfc3RyaW5nKGZvcmNlX2NvbmZpZywgIiIsICJGb3JjZSB0ZXN0aW5nIG1vZGUgd2l0aCBpb3VyaW5nIGRpc2FibGVkIik7CisjaW5jbHVkZSAidGVzdGluZy9kbV91c2VyX2hhcm5lc3MuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2hvc3RfaGFybmVzcy5oIgorI2luY2x1ZGUgInRlc3RpbmcvdGVtcF9kZXZpY2UuaCIKKyNpbmNsdWRlICJ1dGlsaXR5LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CkBAIC01MywyMDQgKzU2LDYwIEBACiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZG07CiB1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZTsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3M7Cit1c2luZyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW07CiAKLXN0YXRpYyBjb25zdGV4cHIgY2hhciBrU25hcHVzZXJkU29ja2V0VGVzdFtdID0gInNuYXB1c2VyZFRlc3QiOwotCi1jbGFzcyBUZW1wZGV2aWNlIHsKLSAgcHVibGljOgotICAgIFRlbXBkZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IERtVGFibGUmIHRhYmxlKQotICAgICAgICA6IGRtXyhEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCkpLCBuYW1lXyhuYW1lKSwgdmFsaWRfKGZhbHNlKSB7Ci0gICAgICAgIHZhbGlkXyA9IGRtXy5DcmVhdGVEZXZpY2UobmFtZSwgdGFibGUsICZwYXRoXywgc3RkOjpjaHJvbm86OnNlY29uZHMoNSkpOwotICAgIH0KLSAgICBUZW1wZGV2aWNlKFRlbXBkZXZpY2UmJiBvdGhlcikgbm9leGNlcHQKLSAgICAgICAgOiBkbV8ob3RoZXIuZG1fKSwgbmFtZV8ob3RoZXIubmFtZV8pLCBwYXRoXyhvdGhlci5wYXRoXyksIHZhbGlkXyhvdGhlci52YWxpZF8pIHsKLSAgICAgICAgb3RoZXIudmFsaWRfID0gZmFsc2U7Ci0gICAgfQotICAgIH5UZW1wZGV2aWNlKCkgewotICAgICAgICBpZiAodmFsaWRfKSB7Ci0gICAgICAgICAgICBkbV8uRGVsZXRlRGV2aWNlKG5hbWVfKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBib29sIERlc3Ryb3koKSB7Ci0gICAgICAgIGlmICghdmFsaWRfKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsaWRfID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkbV8uRGVsZXRlRGV2aWNlKG5hbWVfKTsKLSAgICB9Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLSAgICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gdmFsaWRfOyB9Ci0KLSAgICBUZW1wZGV2aWNlKGNvbnN0IFRlbXBkZXZpY2UmKSA9IGRlbGV0ZTsKLSAgICBUZW1wZGV2aWNlJiBvcGVyYXRvcj0oY29uc3QgVGVtcGRldmljZSYpID0gZGVsZXRlOwotCi0gICAgVGVtcGRldmljZSYgb3BlcmF0b3I9KFRlbXBkZXZpY2UmJiBvdGhlcikgbm9leGNlcHQgewotICAgICAgICBuYW1lXyA9IG90aGVyLm5hbWVfOwotICAgICAgICB2YWxpZF8gPSBvdGhlci52YWxpZF87Ci0gICAgICAgIG90aGVyLnZhbGlkXyA9IGZhbHNlOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgRGV2aWNlTWFwcGVyJiBkbV87Ci0gICAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gICAgc3RkOjpzdHJpbmcgcGF0aF87Ci0gICAgYm9vbCB2YWxpZF87CitzdHJ1Y3QgVGVzdFBhcmFtIHsKKyAgICBib29sIGlvX3VyaW5nOworICAgIGJvb2wgb19kaXJlY3Q7CiB9OwogCi1jbGFzcyBTbmFwdXNlcmRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gIHB1YmxpYzoKLSAgICBib29sIFNldHVwRGVmYXVsdCgpOwotICAgIGJvb2wgU2V0dXBPcmRlcmVkT3BzKCk7Ci0gICAgYm9vbCBTZXR1cE9yZGVyZWRPcHNJbnZlcnRlZCgpOwotICAgIGJvb2wgU2V0dXBDb3B5T3ZlcmxhcF8xKCk7Ci0gICAgYm9vbCBTZXR1cENvcHlPdmVybGFwXzIoKTsKLSAgICBib29sIE1lcmdlKCk7Ci0gICAgdm9pZCBWYWxpZGF0ZU1lcmdlKCk7Ci0gICAgdm9pZCBSZWFkU25hcHNob3REZXZpY2VBbmRWYWxpZGF0ZSgpOwotICAgIHZvaWQgU2h1dGRvd24oKTsKLSAgICB2b2lkIE1lcmdlSW50ZXJydXB0KCk7Ci0gICAgdm9pZCBNZXJnZUludGVycnVwdEZpeGVkKGludCBkdXJhdGlvbik7Ci0gICAgdm9pZCBNZXJnZUludGVycnVwdFJhbmRvbWx5KGludCBtYXhfZHVyYXRpb24pOwotICAgIHZvaWQgU3RhcnRNZXJnZSgpOwotICAgIHZvaWQgQ2hlY2tNZXJnZUNvbXBsZXRpb24oKTsKLQotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrU2VjdG9yU2l6ZSA9IDUxMjsKLQorY2xhc3MgU25hcHVzZXJkVGVzdEJhc2UgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFRlc3RQYXJhbT4gewogICBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHt9Ci0gICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgU2h1dGRvd24oKTsgfQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBTZXR1cEltcGwoKTsKLQotICAgIHZvaWQgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7Ci0KLSAgICB2b2lkIENyZWF0ZUNvd0RldmljZSgpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wcygpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wc0ludmVydGVkKCk7Ci0gICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VXaXRoQ29weU92ZXJsYXBfMSgpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzIoKTsKLSAgICBib29sIFNldHVwRGFlbW9uKCk7CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOwogICAgIHZvaWQgQ3JlYXRlQmFzZURldmljZSgpOwotICAgIHZvaWQgSW5pdENvd0RldmljZSgpOworICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlKCk7CiAgICAgdm9pZCBTZXREZXZpY2VDb250cm9sTmFtZSgpOwotICAgIHZvaWQgSW5pdERhZW1vbigpOwotICAgIHZvaWQgQ3JlYXRlRG1Vc2VyRGV2aWNlKCk7Ci0gICAgdm9pZCBTdGFydFNuYXB1c2VyZERhZW1vbigpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOwogCi0gICAgdW5pcXVlX3B0cjxMb29wRGV2aWNlPiBiYXNlX2xvb3BfOwotICAgIHVuaXF1ZV9wdHI8VGVtcGRldmljZT4gZG11c2VyX2Rldl87Ci0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SVRlc3RIYXJuZXNzPiBoYXJuZXNzXzsKKyAgICBzaXplX3Qgc2l6ZV8gPSAxMF9NaUI7CisgICAgaW50IHRvdGFsX2Jhc2Vfc2l6ZV8gPSAwOwogICAgIHN0ZDo6c3RyaW5nIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXzsKICAgICBzdGQ6OnN0cmluZyBzeXN0ZW1fZGV2aWNlX25hbWVfOwogCisgICAgdW5pcXVlX3B0cjxJQmFja2luZ0RldmljZT4gYmFzZV9kZXZfOwogICAgIHVuaXF1ZV9mZCBiYXNlX2ZkXzsKKwogICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW1wb3JhcnlGaWxlPiBjb3dfc3lzdGVtXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHVzZXJkQ2xpZW50PiBjbGllbnRfOworCiAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gb3JpZ19idWZmZXJfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG1lcmdlZF9idWZmZXJfOwotICAgIGJvb2wgc2V0dXBfb2tfID0gZmFsc2U7Ci0gICAgYm9vbCBtZXJnZV9va18gPSBmYWxzZTsKLSAgICBzaXplX3Qgc2l6ZV8gPSAxMDBfTWlCOwotICAgIGludCBjb3dfbnVtX3NlY3RvcnNfOwotICAgIGludCB0b3RhbF9iYXNlX3NpemVfOwogfTsKIAotc3RhdGljIHVuaXF1ZV9mZCBDcmVhdGVUZW1wRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc2l6ZV90IHNpemUpIHsKLSAgICB1bmlxdWVfZmQgZmQoc3lzY2FsbChfX05SX21lbWZkX2NyZWF0ZSwgbmFtZS5jX3N0cigpLCBNRkRfQUxMT1dfU0VBTElORykpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIHt9OwotICAgIH0KLSAgICBpZiAoc2l6ZSkgewotICAgICAgICBpZiAoZnRydW5jYXRlKGZkLCBzaXplKSA8IDApIHsKLSAgICAgICAgICAgIHBlcnJvcigiZnRydW5jYXRlIik7Ci0gICAgICAgICAgICByZXR1cm4ge307Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZjbnRsKGZkLCBGX0FERF9TRUFMUywgRl9TRUFMX0dST1cgfCBGX1NFQUxfU0hSSU5LKSA8IDApIHsKLSAgICAgICAgICAgIHBlcnJvcigiZmNudGwiKTsKLSAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmQ7Cit2b2lkIFNuYXB1c2VyZFRlc3RCYXNlOjpTZXRVcCgpIHsKKyNpZiBfX0FORFJPSURfXworICAgIGhhcm5lc3NfID0gc3RkOjptYWtlX3VuaXF1ZTxEbVVzZXJUZXN0SGFybmVzcz4oKTsKKyNlbHNlCisgICAgaGFybmVzc18gPSBzdGQ6Om1ha2VfdW5pcXVlPEhvc3RUZXN0SGFybmVzcz4oKTsKKyNlbmRpZgogfQogCi12b2lkIFNuYXB1c2VyZFRlc3Q6OlNodXRkb3duKCkgewotICAgIEFTU0VSVF9UUlVFKGRtdXNlcl9kZXZfLT5EZXN0cm95KCkpOwordm9pZCBTbmFwdXNlcmRUZXN0QmFzZTo6VGVhckRvd24oKSB7fQogCi0gICAgYXV0byBtaXNjX2RldmljZSA9ICIvZGV2L2RtLXVzZXIvIiArIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXzsKLSAgICBBU1NFUlRfVFJVRShjbGllbnRfLT5XYWl0Rm9yRGV2aWNlRGVsZXRlKHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXykpOwotICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmZzX21ncjo6V2FpdEZvckZpbGVEZWxldGVkKG1pc2NfZGV2aWNlLCAxMHMpKTsKLSAgICBBU1NFUlRfVFJVRShjbGllbnRfLT5EZXRhY2hTbmFwdXNlcmQoKSk7Ci19Ci0KLWJvb2wgU25hcHVzZXJkVGVzdDo6U2V0dXBEZWZhdWx0KCkgewotICAgIFNldHVwSW1wbCgpOwotICAgIHJldHVybiBzZXR1cF9va187Ci19Ci0KLWJvb2wgU25hcHVzZXJkVGVzdDo6U2V0dXBPcmRlcmVkT3BzKCkgewotICAgIENyZWF0ZUJhc2VEZXZpY2UoKTsKLSAgICBDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzKCk7Ci0gICAgcmV0dXJuIFNldHVwRGFlbW9uKCk7Ci19Ci0KLWJvb2wgU25hcHVzZXJkVGVzdDo6U2V0dXBPcmRlcmVkT3BzSW52ZXJ0ZWQoKSB7Ci0gICAgQ3JlYXRlQmFzZURldmljZSgpOwotICAgIENyZWF0ZUNvd0RldmljZU9yZGVyZWRPcHNJbnZlcnRlZCgpOwotICAgIHJldHVybiBTZXR1cERhZW1vbigpOwotfQotCi1ib29sIFNuYXB1c2VyZFRlc3Q6OlNldHVwQ29weU92ZXJsYXBfMSgpIHsKLSAgICBDcmVhdGVCYXNlRGV2aWNlKCk7Ci0gICAgQ3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzEoKTsKLSAgICByZXR1cm4gU2V0dXBEYWVtb24oKTsKLX0KLQotYm9vbCBTbmFwdXNlcmRUZXN0OjpTZXR1cENvcHlPdmVybGFwXzIoKSB7Ci0gICAgQ3JlYXRlQmFzZURldmljZSgpOwotICAgIENyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8yKCk7Ci0gICAgcmV0dXJuIFNldHVwRGFlbW9uKCk7Ci19Ci0KLWJvb2wgU25hcHVzZXJkVGVzdDo6U2V0dXBEYWVtb24oKSB7Ci0gICAgU2V0RGV2aWNlQ29udHJvbE5hbWUoKTsKLQotICAgIFN0YXJ0U25hcHVzZXJkRGFlbW9uKCk7Ci0KLSAgICBDcmVhdGVEbVVzZXJEZXZpY2UoKTsKLSAgICBJbml0Q293RGV2aWNlKCk7Ci0gICAgSW5pdERhZW1vbigpOwotCi0gICAgc2V0dXBfb2tfID0gdHJ1ZTsKLQotICAgIHJldHVybiBzZXR1cF9va187Ci19Ci0KLXZvaWQgU25hcHVzZXJkVGVzdDo6U3RhcnRTbmFwdXNlcmREYWVtb24oKSB7Ci0gICAgcGlkX3QgcGlkID0gZm9yaygpOwotICAgIEFTU0VSVF9HRShwaWQsIDApOwotICAgIGlmIChwaWQgPT0gMCkgewotICAgICAgICBzdGQ6OnN0cmluZyBhcmcwID0gIi9zeXN0ZW0vYmluL3NuYXB1c2VyZCI7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGFyZzEgPSAiLXNvY2tldD0icyArIGtTbmFwdXNlcmRTb2NrZXRUZXN0OwotICAgICAgICBjaGFyKiBjb25zdCBhcmd2W10gPSB7YXJnMC5kYXRhKCksIGFyZzEuZGF0YSgpLCBudWxscHRyfTsKLSAgICAgICAgQVNTRVJUX0dFKGV4ZWN2KGFyZzAuY19zdHIoKSwgYXJndiksIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNsaWVudF8gPSBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3Qoa1NuYXB1c2VyZFNvY2tldFRlc3QsIDEwcyk7Ci0gICAgICAgIEFTU0VSVF9ORShjbGllbnRfLCBudWxscHRyKTsKLSAgICB9Ci19Ci0KLXZvaWQgU25hcHVzZXJkVGVzdDo6Q3JlYXRlQmFzZURldmljZSgpIHsKLSAgICB1bmlxdWVfZmQgcm5kX2ZkOwotCit2b2lkIFNuYXB1c2VyZFRlc3RCYXNlOjpDcmVhdGVCYXNlRGV2aWNlKCkgewogICAgIHRvdGFsX2Jhc2Vfc2l6ZV8gPSAoc2l6ZV8gKiA1KTsKLSAgICBiYXNlX2ZkXyA9IENyZWF0ZVRlbXBGaWxlKCJiYXNlX2RldmljZSIsIHRvdGFsX2Jhc2Vfc2l6ZV8pOworCisgICAgYmFzZV9kZXZfID0gaGFybmVzc18tPkNyZWF0ZUJhY2tpbmdEZXZpY2UodG90YWxfYmFzZV9zaXplXyk7CisgICAgQVNTRVJUX05FKGJhc2VfZGV2XywgbnVsbHB0cik7CisKKyAgICBiYXNlX2ZkXy5yZXNldChvcGVuKGJhc2VfZGV2Xy0+R2V0UGF0aCgpLmNfc3RyKCksIE9fUkRXUiB8IE9fQ0xPRVhFQykpOwogICAgIEFTU0VSVF9HRShiYXNlX2ZkXywgMCk7CiAKLSAgICBybmRfZmQucmVzZXQob3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSkpOwotICAgIEFTU0VSVF9UUlVFKHJuZF9mZCA+IDApOworICAgIHVuaXF1ZV9mZCBybmRfZmQob3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSkpOworICAgIEFTU0VSVF9HRShybmRfZmQsIDApOwogCiAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcmFuZG9tX2J1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPigxX01pQik7CiAKQEAgLTI2MCwxMyArMTE5LDIyMiBAQAogICAgIH0KIAogICAgIEFTU0VSVF9FUShsc2VlayhiYXNlX2ZkXywgMCwgU0VFS19TRVQpLCAwKTsKK30KIAotICAgIGJhc2VfbG9vcF8gPSBzdGQ6Om1ha2VfdW5pcXVlPExvb3BEZXZpY2U+KGJhc2VfZmRfLCAxMHMpOwotICAgIEFTU0VSVF9UUlVFKGJhc2VfbG9vcF8tPnZhbGlkKCkpOworc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IFNuYXB1c2VyZFRlc3RCYXNlOjpDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpIHsKKyAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4oKTsKKworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKKworICAgIHVuaXF1ZV9mZCBmZChjb3dfc3lzdGVtXy0+ZmQpOworICAgIGNvd19zeXN0ZW1fLT5mZCA9IC0xOworCisgICAgcmV0dXJuIENyZWF0ZUNvd1dyaXRlcihrRGVmYXVsdENvd1ZlcnNpb24sIG9wdGlvbnMsIHN0ZDo6bW92ZShmZCkpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3RCYXNlOjpDcmVhdGVDb3dEZXZpY2UoKSB7CisgICAgdW5pcXVlX2ZkIHJuZF9mZDsKKyAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKKworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKKworICAgIHJuZF9mZC5yZXNldChvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKSk7CisgICAgQVNTRVJUX1RSVUUocm5kX2ZkID4gMCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiByYW5kb21fYnVmZmVyXzFfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHNpemVfKTsKKworICAgIC8vIEZpbGwgcmFuZG9tIGRhdGEKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IChzaXplXyAvIDFfTWlCKTsgaisrKSB7CisgICAgICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChybmRfZmQsIChjaGFyKilyYW5kb21fYnVmZmVyXzFfLmdldCgpICsgb2Zmc2V0LCAxX01pQiwgMCksCisgICAgICAgICAgICAgICAgICB0cnVlKTsKKworICAgICAgICBvZmZzZXQgKz0gMV9NaUI7CisgICAgfQorCisgICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIHdyaXRlci0+R2V0QmxvY2tTaXplKCk7CisgICAgc2l6ZV90IGJsa19lbmRfY29weSA9IG51bV9ibG9ja3MgKiAyOworICAgIHNpemVfdCBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrcyAtIDE7CisgICAgc2l6ZV90IGJsa19zcmNfY29weSA9IGJsa19lbmRfY29weSAtIDE7CisKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtudW1fYmxvY2tzICogMl07CisgICAgLy8gU2VxdWVuY2UgZm9yIENvcHkgb3BzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKyAgICAgICAgc2VxdWVuY2VbaV0gPSBudW1fYmxvY2tzIC0gMSAtIGk7CisgICAgfQorICAgIC8vIFNlcXVlbmNlIGZvciBYb3Igb3BzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKyAgICAgICAgc2VxdWVuY2VbbnVtX2Jsb2NrcyArIGldID0gNSAqIG51bV9ibG9ja3MgLSAxIC0gaTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRTZXF1ZW5jZURhdGEoMiAqIG51bV9ibG9ja3MsIHNlcXVlbmNlKSk7CisKKyAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KHNvdXJjZV9ibGssIGJsa19zcmNfY29weSkpOworICAgICAgICB4IC09IDE7CisgICAgICAgIGlmICh4ID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNvdXJjZV9ibGsgLT0gMTsKKyAgICAgICAgYmxrX3NyY19jb3B5IC09IDE7CisgICAgfQorCisgICAgc291cmNlX2JsayA9IG51bV9ibG9ja3M7CisgICAgYmxrX3NyY19jb3B5ID0gYmxrX2VuZF9jb3B5OworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3Moc291cmNlX2JsaywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pKTsKKworICAgIHNpemVfdCBibGtfemVyb19jb3B5X3N0YXJ0ID0gc291cmNlX2JsayArIG51bV9ibG9ja3M7CisgICAgc2l6ZV90IGJsa196ZXJvX2NvcHlfZW5kID0gYmxrX3plcm9fY29weV9zdGFydCArIG51bV9ibG9ja3M7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoYmxrX3plcm9fY29weV9zdGFydCwgbnVtX2Jsb2NrcykpOworCisgICAgc2l6ZV90IGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQgPSBibGtfemVyb19jb3B5X2VuZDsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKSk7CisKKyAgICBzaXplX3QgYmxrX3hvcl9zdGFydCA9IGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQgKyBudW1fYmxvY2tzOworICAgIHNpemVfdCB4b3Jfb2Zmc2V0ID0gQkxPQ0tfU1ogLyAyOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKGJsa194b3Jfc3RhcnQsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfLCBudW1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvcl9vZmZzZXQpKTsKKworICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCisgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOworICAgIHN0ZDo6c3RyaW5nIHplcm9fYnVmZmVyKHNpemVfLCAwKTsKKyAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFzZV9mZF8sIG9yaWdfYnVmZmVyXy5nZXQoKSwgc2l6ZV8sIHNpemVfKSwgdHJ1ZSk7CisgICAgbWVtY3B5KChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBzaXplXywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pOworICAgIG1lbWNweSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgKHNpemVfICogMiksICh2b2lkKil6ZXJvX2J1ZmZlci5jX3N0cigpLCBzaXplXyk7CisgICAgbWVtY3B5KChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyAoc2l6ZV8gKiAzKSwgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pOworICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgJm9yaWdfYnVmZmVyXy5nZXQoKVtzaXplXyAqIDRdLCBzaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8gKyB4b3Jfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplXzsgaSsrKSB7CisgICAgICAgIG9yaWdfYnVmZmVyXy5nZXQoKVsoc2l6ZV8gKiA0KSArIGldID0KKyAgICAgICAgICAgICAgICAodWludDhfdCkob3JpZ19idWZmZXJfLmdldCgpWyhzaXplXyAqIDQpICsgaV0gXiByYW5kb21fYnVmZmVyXzFfLmdldCgpW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdEJhc2U6OlNldERldmljZUNvbnRyb2xOYW1lKCkgeworICAgIHN5c3RlbV9kZXZpY2VfbmFtZV8uY2xlYXIoKTsKKyAgICBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8uY2xlYXIoKTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cihjb3dfc3lzdGVtXy0+cGF0aCk7CisgICAgc3RkOjpzaXplX3QgZm91bmQgPSBzdHIuZmluZF9sYXN0X29mKCIvXFwiKTsKKyAgICBBU1NFUlRfTkUoZm91bmQsIHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgICBzeXN0ZW1fZGV2aWNlX25hbWVfID0gc3RyLnN1YnN0cihmb3VuZCArIDEpOworCisgICAgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfID0gc3lzdGVtX2RldmljZV9uYW1lXyArICItY3RybCI7Cit9CisKK2NsYXNzIFNuYXB1c2VyZFRlc3QgOiBwdWJsaWMgU25hcHVzZXJkVGVzdEJhc2UgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXR1cERlZmF1bHQoKTsKKyAgICB2b2lkIFNldHVwT3JkZXJlZE9wcygpOworICAgIHZvaWQgU2V0dXBPcmRlcmVkT3BzSW52ZXJ0ZWQoKTsKKyAgICB2b2lkIFNldHVwQ29weU92ZXJsYXBfMSgpOworICAgIHZvaWQgU2V0dXBDb3B5T3ZlcmxhcF8yKCk7CisgICAgYm9vbCBNZXJnZSgpOworICAgIHZvaWQgVmFsaWRhdGVNZXJnZSgpOworICAgIHZvaWQgUmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUoKTsKKyAgICB2b2lkIFJlYWRTbmFwc2hvdEFuZFZhbGlkYXRlT3ZlcmxhcHBpbmdCbG9ja3MoKTsKKyAgICB2b2lkIFNodXRkb3duKCk7CisgICAgdm9pZCBNZXJnZUludGVycnVwdCgpOworICAgIHZvaWQgTWVyZ2VJbnRlcnJ1cHRGaXhlZChpbnQgZHVyYXRpb24pOworICAgIHZvaWQgTWVyZ2VJbnRlcnJ1cHRBbmRWYWxpZGF0ZShpbnQgZHVyYXRpb24pOworICAgIHZvaWQgTWVyZ2VJbnRlcnJ1cHRSYW5kb21seShpbnQgbWF4X2R1cmF0aW9uKTsKKyAgICBib29sIFN0YXJ0TWVyZ2UoKTsKKyAgICB2b2lkIENoZWNrTWVyZ2VDb21wbGV0aW9uKCk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1NlY3RvclNpemUgPSA1MTI7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIFNldHVwSW1wbCgpOworCisgICAgdm9pZCBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKKworICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wcygpOworICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wc0ludmVydGVkKCk7CisgICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VXaXRoQ29weU92ZXJsYXBfMSgpOworICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzIoKTsKKyAgICB2b2lkIFNldHVwRGFlbW9uKCk7CisgICAgdm9pZCBJbml0Q293RGV2aWNlKCk7CisgICAgdm9pZCBJbml0RGFlbW9uKCk7CisgICAgdm9pZCBDcmVhdGVVc2VyRGV2aWNlKCk7CisKKyAgICB1bmlxdWVfcHRyPElVc2VyRGV2aWNlPiBkbXVzZXJfZGV2XzsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG1lcmdlZF9idWZmZXJfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyPiBoYW5kbGVyc187CisgICAgaW50IGNvd19udW1fc2VjdG9yc187Cit9OworCit2b2lkIFNuYXB1c2VyZFRlc3Q6OlNldFVwKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNuYXB1c2VyZFRlc3RCYXNlOjpTZXRVcCgpKTsKKyAgICBoYW5kbGVyc18gPSBzdGQ6Om1ha2VfdW5pcXVlPFNuYXBzaG90SGFuZGxlck1hbmFnZXI+KCk7Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdDo6VGVhckRvd24oKSB7CisgICAgU25hcHVzZXJkVGVzdEJhc2U6OlRlYXJEb3duKCk7CisgICAgU2h1dGRvd24oKTsKK30KKwordm9pZCBTbmFwdXNlcmRUZXN0OjpTaHV0ZG93bigpIHsKKyAgICBpZiAoZG11c2VyX2Rldl8pIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZG11c2VyX2Rldl8tPkRlc3Ryb3koKSk7CisgICAgfQorCisgICAgYXV0byBtaXNjX2RldmljZSA9ICIvZGV2L2RtLXVzZXIvIiArIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXzsKKyAgICBBU1NFUlRfVFJVRShoYW5kbGVyc18tPkRlbGV0ZUhhbmRsZXIoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfKSk7CisgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6ZnNfbWdyOjpXYWl0Rm9yRmlsZURlbGV0ZWQobWlzY19kZXZpY2UsIDEwcykpOworICAgIGhhbmRsZXJzXy0+VGVybWluYXRlTWVyZ2VUaHJlYWRzKCk7CisgICAgaGFuZGxlcnNfLT5Kb2luQWxsVGhyZWFkcygpOworICAgIGhhbmRsZXJzXyA9IHN0ZDo6bWFrZV91bmlxdWU8U25hcHNob3RIYW5kbGVyTWFuYWdlcj4oKTsKK30KKwordm9pZCBTbmFwdXNlcmRUZXN0OjpTZXR1cERlZmF1bHQoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBJbXBsKCkpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3Q6OlNldHVwT3JkZXJlZE9wcygpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVCYXNlRGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUNvd0RldmljZU9yZGVyZWRPcHMoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBEYWVtb24oKSk7Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdDo6U2V0dXBPcmRlcmVkT3BzSW52ZXJ0ZWQoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlQmFzZURldmljZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzSW52ZXJ0ZWQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBEYWVtb24oKSk7Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdDo6U2V0dXBDb3B5T3ZlcmxhcF8xKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUJhc2VEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzEoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBEYWVtb24oKSk7Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdDo6U2V0dXBDb3B5T3ZlcmxhcF8yKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUJhc2VEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzIoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBEYWVtb24oKSk7Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdDo6U2V0dXBEYWVtb24oKSB7CisgICAgU2V0RGV2aWNlQ29udHJvbE5hbWUoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZVVzZXJEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdENvd0RldmljZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RGFlbW9uKCkpOwogfQogCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OlJlYWRTbmFwc2hvdERldmljZUFuZFZhbGlkYXRlKCkgewotICAgIHVuaXF1ZV9mZCBmZChvcGVuKGRtdXNlcl9kZXZfLT5wYXRoKCkuY19zdHIoKSwgT19SRE9OTFkpKTsKKyAgICB1bmlxdWVfZmQgZmQob3BlbihkbXVzZXJfZGV2Xy0+R2V0UGF0aCgpLmNfc3RyKCksIE9fUkRPTkxZKSk7CiAgICAgQVNTRVJUX0dFKGZkLCAwKTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBzbmFwdXNlcmRfYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHNpemVfKTsKIApAQCAtMjk2LDIzICszNjQsODcgQEAKICAgICBBU1NFUlRfRVEobWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyAoc2l6ZV8gKiA0KSwgc2l6ZV8pLCAwKTsKIH0KIAordm9pZCBTbmFwdXNlcmRUZXN0OjpSZWFkU25hcHNob3RBbmRWYWxpZGF0ZU92ZXJsYXBwaW5nQmxvY2tzKCkgeworICAgIC8vIE9wZW4gQ09XIGRldmljZQorICAgIHVuaXF1ZV9mZCBmZChvcGVuKGNvd19zeXN0ZW1fLT5wYXRoLCBPX1JET05MWSkpOworICAgIEFTU0VSVF9HRShmZCwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShmZCkpOworCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLkdldEhlYWRlcigpOworICAgIHNpemVfdCB0b3RhbF9tYXBwZWRfYWRkcl9sZW5ndGggPSBoZWFkZXIucHJlZml4LmhlYWRlcl9zaXplICsgQlVGRkVSX1JFR0lPTl9ERUZBVUxUX1NJWkU7CisKKyAgICBBU1NFUlRfR0UoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCAyKTsKKworICAgIHZvaWQqIG1hcHBlZF9hZGRyID0gbW1hcChOVUxMLCB0b3RhbF9tYXBwZWRfYWRkcl9sZW5ndGgsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQuZ2V0KCksIDApOworICAgIEFTU0VSVF9ORShtYXBwZWRfYWRkciwgTUFQX0ZBSUxFRCk7CisKKyAgICBib29sIHBvcHVsYXRlX2RhdGFfZnJvbV9zY3JhdGNoID0gZmFsc2U7CisgICAgc3RydWN0IEJ1ZmZlclN0YXRlKiByYV9zdGF0ZSA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBCdWZmZXJTdGF0ZSo+KChjaGFyKiltYXBwZWRfYWRkciArIGhlYWRlci5wcmVmaXguaGVhZGVyX3NpemUpOworICAgIGlmIChyYV9zdGF0ZS0+cmVhZF9haGVhZF9zdGF0ZSA9PSBrQ293UmVhZEFoZWFkRG9uZSkgeworICAgICAgICBwb3B1bGF0ZV9kYXRhX2Zyb21fc2NyYXRjaCA9IHRydWU7CisgICAgfQorCisgICAgc2l6ZV90IG51bV9tZXJnZV9vcHMgPSBoZWFkZXIubnVtX21lcmdlX29wczsKKyAgICAvLyBXZSBoYXZlIHNvbWUgcGFydGlhbCBtZXJnZSBvcGVyYXRpb25zIGNvbXBsZXRlZC4KKyAgICAvLyBUbyB0ZXN0IHRoZSBtZXJnZS1yZXN1bWUgcGF0aCwgZm9yY2VmdWxseSBjb3JydXB0IHRoZSBkYXRhIG9mIHRoZSBiYXNlCisgICAgLy8gZGV2aWNlIGZvciB0aGUgb2Zmc2V0cyB3aGVyZSB0aGUgbWVyZ2UgaXMgc3RpbGwgcGVuZGluZy4KKyAgICBpZiAobnVtX21lcmdlX29wcyAmJiBwb3B1bGF0ZV9kYXRhX2Zyb21fc2NyYXRjaCkgeworICAgICAgICBzdGQ6OnN0cmluZyBjb3JydXB0X2J1ZmZlcig0MDk2LCAwKTsKKyAgICAgICAgLy8gQ29ycnVwdCB0d28gYmxvY2tzIGZyb20gdGhlIHBvaW50IHdoZXJlIHRoZSBtZXJnZSBoYXMgdG8gYmUgcmVzdW1lZCBieQorICAgICAgICAvLyB3cml0aW5nIGRvd24gemVyb2Uncy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm93LCBzaW5jZSB0aGlzIGlzIGEgbWVyZ2UtcmVzdW1lIHBhdGgsIHRoZSAiY29ycmVjdCIgZGF0YSBzaG91bGQgYmUKKyAgICAgICAgLy8gaW4gdGhlIHNjcmF0Y2ggc3BhY2Ugb2YgdGhlIENPVyBkZXZpY2UuIFdoZW4gdGhlcmUgaXMgYW4gSS9PIHJlcXVlc3QKKyAgICAgICAgLy8gZnJvbSB0aGUgc25hcHNob3QgZGV2aWNlLCB0aGUgZGF0YSBoYXMgdG8gYmUgcmV0cmlldmVkIGZyb20gdGhlCisgICAgICAgIC8vIHNjcmF0Y2ggc3BhY2UuIElmIG5vdCBhbmQgSS9PIGlzIHJvdXRlZCB0byB0aGUgYmFzZSBkZXZpY2UsIHdlCisgICAgICAgIC8vIG1heSBlbmQgdXAgd2l0aCBjb3JydXB0aW9uLgorICAgICAgICBvZmZfdCBjb3JydXB0X29mZnNldCA9IChudW1fbWVyZ2Vfb3BzICsgMikgKiA0MDk2OworCisgICAgICAgIGlmIChjb3JydXB0X29mZnNldCA8IHNpemVfKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCAodm9pZCopY29ycnVwdF9idWZmZXIuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgY29ycnVwdF9vZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgY29ycnVwdF9vZmZzZXQgLT0gNDA5NjsKKyAgICAgICAgICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5QXRPZmZzZXQoYmFzZV9mZF8sICh2b2lkKiljb3JydXB0X2J1ZmZlci5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCBjb3JydXB0X29mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICBmc3luYyhiYXNlX2ZkXy5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaW1lIHRvIHJlYWQgdGhlIHNuYXBzaG90IGRldmljZS4KKyAgICB1bmlxdWVfZmQgc25hcHNob3RfZmQob3BlbihkbXVzZXJfZGV2Xy0+R2V0UGF0aCgpLmNfc3RyKCksIE9fUkRPTkxZIHwgT19ESVJFQ1QgfCBPX1NZTkMpKTsKKyAgICBBU1NFUlRfR0Uoc25hcHNob3RfZmQsIDApOworCisgICAgdm9pZCogYnVmZl9hZGRyOworICAgIEFTU0VSVF9FUShwb3NpeF9tZW1hbGlnbigmYnVmZl9hZGRyLCA0MDk2LCBzaXplXyksIDApOworCisgICAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIGRlY2x0eXBlKCY6OmZyZWUpPiBzbmFwc2hvdF9idWZmZXIoYnVmZl9hZGRyLCA6OmZyZWUpOworCisgICAgLy8gU2NhbiB0aGUgZW50aXJlIHNuYXBzaG90IGRldmljZSBhbmQgcmVhZCB0aGUgZGF0YSBhbmQgdmVyaWZ5IGRhdGEKKyAgICAvLyBpbnRlZ3JpdHkuIFNpbmNlIHRoZSBiYXNlIGRldmljZSB3YXMgZm9yY2VmdWxseSBjb3JydXB0ZWQsIHRoZSBkYXRhIGZyb20KKyAgICAvLyB0aGlzIHNjYW4gc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHNjcmF0Y2ggc3BhY2Ugb2YgdGhlIENPVyBwYXJ0aXRpb24uCisgICAgLy8KKyAgICAvLyBGdXJ0aGVybW9yZSwgYWZ0ZXIgdGhlIG1lcmdlIGlzIGNvbXBsZXRlLCBiYXNlIGRldmljZSBkYXRhIGlzIGFnYWluCisgICAgLy8gdmVyaWZpZWQgYXMgdGhlIGFmb3JlbWVudGlvbmVkIGNvcnJ1cHRlZCBibG9ja3MgYXJlbid0IHBlcnNpc3RlZC4KKyAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQoc25hcHNob3RfZmQsIHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgc2l6ZV8sIDApLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobWVtY21wKHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgb3JpZ19idWZmZXJfLmdldCgpLCBzaXplXyksIDApOworfQorCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OkNyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8yKCkgewotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKIAotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293X3N5c3RlbV8tPmZkKSk7Ci0KLSAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gb3B0aW9ucy5ibG9ja19zaXplOworICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyB3cml0ZXItPkdldEJsb2NrU2l6ZSgpOwogICAgIHNpemVfdCB4ID0gbnVtX2Jsb2NrczsKICAgICBzaXplX3QgYmxrX3NyY19jb3B5ID0gMDsKIAogICAgIC8vIENyZWF0ZSBvdmVybGFwcGluZyBjb3B5IG9wZXJhdGlvbnMKICAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShibGtfc3JjX2NvcHksIGJsa19zcmNfY29weSArIDEpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KGJsa19zcmNfY29weSwgYmxrX3NyY19jb3B5ICsgMSkpOwogICAgICAgICB4IC09IDE7CiAgICAgICAgIGlmICh4ID09IDEpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzIxLDcgKzQ1Myw3IEBACiAgICAgfQogCiAgICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwogCiAgICAgLy8gQ29uc3RydWN0IHRoZSBidWZmZXIgcmVxdWlyZWQgZm9yIHZhbGlkYXRpb24KICAgICBvcmlnX2J1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7CkBAIC0zNDksMjIgKzQ4MSwxNiBAQAogfQogCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OkNyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8xKCkgewotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKIAotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293X3N5c3RlbV8tPmZkKSk7Ci0KLSAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gb3B0aW9ucy5ibG9ja19zaXplOworICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyB3cml0ZXItPkdldEJsb2NrU2l6ZSgpOwogICAgIHNpemVfdCB4ID0gbnVtX2Jsb2NrczsKICAgICBzaXplX3QgYmxrX3NyY19jb3B5ID0gbnVtX2Jsb2NrcyAtIDE7CiAKICAgICAvLyBDcmVhdGUgb3ZlcmxhcHBpbmcgY29weSBvcGVyYXRpb25zCiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoYmxrX3NyY19jb3B5ICsgMSwgYmxrX3NyY19jb3B5KSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weShibGtfc3JjX2NvcHkgKyAxLCBibGtfc3JjX2NvcHkpKTsKICAgICAgICAgeCAtPSAxOwogICAgICAgICBpZiAoeCA9PSAwKSB7CiAgICAgICAgICAgICBBU1NFUlRfRVEoYmxrX3NyY19jb3B5LCAwKTsKQEAgLTM3NCw3ICs1MDAsNyBAQAogICAgIH0KIAogICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKIAogICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCiAgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwpAQCAtMzg0LDEwICs1MTAsMTEgQEAKICAgICAgICAgICAgICAgdHJ1ZSk7CiAKICAgICAvLyBNZXJnZWQgb3BlcmF0aW9ucwotICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgb3JpZ19idWZmZXJfLmdldCgpLCBvcHRpb25zLmJsb2NrX3NpemUsIDApLAorICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgb3JpZ19idWZmZXJfLmdldCgpLCB3cml0ZXItPkdldEJsb2NrU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSwKICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KAotICAgICAgICAgICAgICAgICAgICAgIGJhc2VfZmRfLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgb3B0aW9ucy5ibG9ja19zaXplLCBzaXplXywgMCksCisgICAgICAgICAgICAgICAgICAgICAgYmFzZV9mZF8sIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyB3cml0ZXItPkdldEJsb2NrU2l6ZSgpLCBzaXplXywgMCksCiAgICAgICAgICAgICAgIHRydWUpOwogfQogCkBAIC0zOTUsOCArNTIyLDggQEAKICAgICB1bmlxdWVfZmQgcm5kX2ZkOwogICAgIGxvZmZfdCBvZmZzZXQgPSAwOwogCi0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOwogCiAgICAgcm5kX2ZkLnJlc2V0KG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKICAgICBBU1NFUlRfVFJVRShybmRfZmQgPiAwKTsKQEAgLTQxMSwxMyArNTM4LDcgQEAKICAgICAgICAgb2Zmc2V0ICs9IDFfTWlCOwogICAgIH0KIAotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293X3N5c3RlbV8tPmZkKSk7Ci0KLSAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gb3B0aW9ucy5ibG9ja19zaXplOworICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyB3cml0ZXItPkdldEJsb2NrU2l6ZSgpOwogICAgIHNpemVfdCBibGtfZW5kX2NvcHkgPSBudW1fYmxvY2tzICogMzsKICAgICBzaXplX3Qgc291cmNlX2JsayA9IG51bV9ibG9ja3MgLSAxOwogICAgIHNpemVfdCBibGtfc3JjX2NvcHkgPSBibGtfZW5kX2NvcHkgLSAxOwpAQCAtNDI1LDcgKzU0Niw3IEBACiAKICAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7CiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoc291cmNlX2JsaywgYmxrX3NyY19jb3B5KSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKICAgICAgICAgeCAtPSAxOwogICAgICAgICBpZiAoeCA9PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQzNSwxMiArNTU2LDEyIEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IG51bV9ibG9ja3M7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2NrcyhudW1fYmxvY2tzICsgaSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmRvbV9idWZmZXJfMV8uZ2V0KClbb3B0aW9ucy5ibG9ja19zaXplICogKGkgLSAxKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ibG9ja19zaXplLCAyICogbnVtX2Jsb2NrcyArIGkgLSAxLCB4b3Jfb2Zmc2V0KSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKAorICAgICAgICAgICAgICAgIG51bV9ibG9ja3MgKyBpIC0gMSwgJnJhbmRvbV9idWZmZXJfMV8uZ2V0KClbd3JpdGVyLT5HZXRCbG9ja1NpemUoKSAqIChpIC0gMSldLAorICAgICAgICAgICAgICAgIHdyaXRlci0+R2V0QmxvY2tTaXplKCksIDIgKiBudW1fYmxvY2tzICsgaSAtIDEsIHhvcl9vZmZzZXQpKTsKICAgICB9CiAgICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwogICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCiAgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwogICAgIC8vIFJlYWQgdGhlIGVudGlyZSBiYXNlIGRldmljZQpAQCAtNDU4LDggKzU3OSw4IEBACiAgICAgdW5pcXVlX2ZkIHJuZF9mZDsKICAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKIAotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKIAogICAgIHJuZF9mZC5yZXNldChvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKSk7CiAgICAgQVNTRVJUX1RSVUUocm5kX2ZkID4gMCk7CkBAIC00NzUsMjAgKzU5NiwxNCBAQAogICAgIH0KICAgICBtZW1zZXQocmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgMCwgc2l6ZV8pOwogCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7CisgICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIHdyaXRlci0+R2V0QmxvY2tTaXplKCk7CiAgICAgc2l6ZV90IHggPSBudW1fYmxvY2tzOwogICAgIHNpemVfdCBzb3VyY2VfYmxrID0gMDsKICAgICBzaXplX3QgYmxrX3NyY19jb3B5ID0gMiAqIG51bV9ibG9ja3M7CiAgICAgdWludDE2X3QgeG9yX29mZnNldCA9IDU7CiAKICAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KHNvdXJjZV9ibGssIGJsa19zcmNfY29weSkpOwogCiAgICAgICAgIHggLT0gMTsKICAgICAgICAgaWYgKHggPT0gMCkgewpAQCAtNDk4LDEwICs2MTMsMTAgQEAKICAgICAgICAgYmxrX3NyY19jb3B5ICs9IDE7CiAgICAgfQogCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2NrcyhudW1fYmxvY2tzLCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXywgMiAqIG51bV9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b3Jfb2Zmc2V0KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRYb3JCbG9ja3MobnVtX2Jsb2NrcywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8sIDIgKiBudW1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvcl9vZmZzZXQpKTsKICAgICAvLyBGbHVzaCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CiAgICAgLy8gQ29uc3RydWN0IHRoZSBidWZmZXIgcmVxdWlyZWQgZm9yIHZhbGlkYXRpb24KICAgICBvcmlnX2J1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7CiAgICAgLy8gUmVhZCB0aGUgZW50aXJlIGJhc2UgZGV2aWNlCkBAIC01MTUsMTQ0ICs2MzAsMzkgQEAKICAgICB9CiB9CiAKLXZvaWQgU25hcHVzZXJkVGVzdDo6Q3JlYXRlQ293RGV2aWNlKCkgewotICAgIHVuaXF1ZV9mZCBybmRfZmQ7Ci0gICAgbG9mZl90IG9mZnNldCA9IDA7Ci0KLSAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGNvd19zeXN0ZW1fID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wb3JhcnlGaWxlPihwYXRoKTsKLQotICAgIHJuZF9mZC5yZXNldChvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKSk7Ci0gICAgQVNTRVJUX1RSVUUocm5kX2ZkID4gMCk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiByYW5kb21fYnVmZmVyXzFfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHNpemVfKTsKLQotICAgIC8vIEZpbGwgcmFuZG9tIGRhdGEKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IChzaXplXyAvIDFfTWlCKTsgaisrKSB7Ci0gICAgICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChybmRfZmQsIChjaGFyKilyYW5kb21fYnVmZmVyXzFfLmdldCgpICsgb2Zmc2V0LCAxX01pQiwgMCksCi0gICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBvZmZzZXQgKz0gMV9NaUI7Ci0gICAgfQotCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7Ci0gICAgc2l6ZV90IGJsa19lbmRfY29weSA9IG51bV9ibG9ja3MgKiAyOwotICAgIHNpemVfdCBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrcyAtIDE7Ci0gICAgc2l6ZV90IGJsa19zcmNfY29weSA9IGJsa19lbmRfY29weSAtIDE7Ci0KLSAgICB1aW50MzJfdCBzZXF1ZW5jZVtudW1fYmxvY2tzICogMl07Ci0gICAgLy8gU2VxdWVuY2UgZm9yIENvcHkgb3BzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgc2VxdWVuY2VbaV0gPSBudW1fYmxvY2tzIC0gMSAtIGk7Ci0gICAgfQotICAgIC8vIFNlcXVlbmNlIGZvciBYb3Igb3BzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgc2VxdWVuY2VbbnVtX2Jsb2NrcyArIGldID0gNSAqIG51bV9ibG9ja3MgLSAxIC0gaTsKLSAgICB9Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFNlcXVlbmNlRGF0YSgyICogbnVtX2Jsb2Nrcywgc2VxdWVuY2UpKTsKLQotICAgIHNpemVfdCB4ID0gbnVtX2Jsb2NrczsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKLSAgICAgICAgeCAtPSAxOwotICAgICAgICBpZiAoeCA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzb3VyY2VfYmxrIC09IDE7Ci0gICAgICAgIGJsa19zcmNfY29weSAtPSAxOwotICAgIH0KLQotICAgIHNvdXJjZV9ibGsgPSBudW1fYmxvY2tzOwotICAgIGJsa19zcmNfY29weSA9IGJsa19lbmRfY29weTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3Moc291cmNlX2JsaywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pKTsKLQotICAgIHNpemVfdCBibGtfemVyb19jb3B5X3N0YXJ0ID0gc291cmNlX2JsayArIG51bV9ibG9ja3M7Ci0gICAgc2l6ZV90IGJsa196ZXJvX2NvcHlfZW5kID0gYmxrX3plcm9fY29weV9zdGFydCArIG51bV9ibG9ja3M7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcyhibGtfemVyb19jb3B5X3N0YXJ0LCBudW1fYmxvY2tzKSk7Ci0KLSAgICBzaXplX3QgYmxrX3JhbmRvbTJfcmVwbGFjZV9zdGFydCA9IGJsa196ZXJvX2NvcHlfZW5kOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2NrcyhibGtfcmFuZG9tMl9yZXBsYWNlX3N0YXJ0LCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXykpOwotCi0gICAgc2l6ZV90IGJsa194b3Jfc3RhcnQgPSBibGtfcmFuZG9tMl9yZXBsYWNlX3N0YXJ0ICsgbnVtX2Jsb2NrczsKLSAgICBzaXplX3QgeG9yX29mZnNldCA9IEJMT0NLX1NaIC8gMjsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWG9yQmxvY2tzKGJsa194b3Jfc3RhcnQsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfLCBudW1fYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9yX29mZnNldCkpOwotCi0gICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLSAgICAvLyBDb25zdHJ1Y3QgdGhlIGJ1ZmZlciByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbgotICAgIG9yaWdfYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPih0b3RhbF9iYXNlX3NpemVfKTsKLSAgICBzdGQ6OnN0cmluZyB6ZXJvX2J1ZmZlcihzaXplXywgMCk7Ci0gICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHNpemVfLCBzaXplXyksIHRydWUpOwotICAgIG1lbWNweSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgc2l6ZV8sIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKTsKLSAgICBtZW1jcHkoKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIChzaXplXyAqIDIpLCAodm9pZCopemVyb19idWZmZXIuY19zdHIoKSwgc2l6ZV8pOwotICAgIG1lbWNweSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgKHNpemVfICogMyksIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKTsKLSAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFzZV9mZF8sICZvcmlnX2J1ZmZlcl8uZ2V0KClbc2l6ZV8gKiA0XSwgc2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfICsgeG9yX29mZnNldCksCi0gICAgICAgICAgICAgIHRydWUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZV87IGkrKykgewotICAgICAgICBvcmlnX2J1ZmZlcl8uZ2V0KClbKHNpemVfICogNCkgKyBpXSA9Ci0gICAgICAgICAgICAgICAgKHVpbnQ4X3QpKG9yaWdfYnVmZmVyXy5nZXQoKVsoc2l6ZV8gKiA0KSArIGldIF4gcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKVtpXSk7Ci0gICAgfQotfQotCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OkluaXRDb3dEZXZpY2UoKSB7Ci0gICAgdWludDY0X3QgbnVtX3NlY3RvcnMgPSBjbGllbnRfLT5Jbml0RG1Vc2VyQ293KHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXywgY293X3N5c3RlbV8tPnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfbG9vcF8tPmRldmljZSgpLCBiYXNlX2xvb3BfLT5kZXZpY2UoKSk7Ci0gICAgQVNTRVJUX05FKG51bV9zZWN0b3JzLCAwKTsKKyAgICBhdXRvIGZhY3RvcnkgPSBoYXJuZXNzXy0+R2V0QmxvY2tTZXJ2ZXJGYWN0b3J5KCk7CisgICAgYXV0byBvcGVuZXIgPSBmYWN0b3J5LT5DcmVhdGVPcGVuZXIoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfKTsKKyAgICBoYW5kbGVyc18tPkRpc2FibGVWZXJpZmljYXRpb24oKTsKKyAgICBjb25zdCBUZXN0UGFyYW0gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBhdXRvIGhhbmRsZXIgPSBoYW5kbGVyc18tPkFkZEhhbmRsZXIoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfLCBjb3dfc3lzdGVtXy0+cGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9kZXZfLT5HZXRQYXRoKCksIGJhc2VfZGV2Xy0+R2V0UGF0aCgpLCBvcGVuZXIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5pb191cmluZywgcGFyYW1zLm9fZGlyZWN0KTsKKyAgICBBU1NFUlRfTkUoaGFuZGxlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX05FKGhhbmRsZXItPnNuYXB1c2VyZCgpLCBudWxscHRyKTsKKyNpZmRlZiBfX0FORFJPSURfXworICAgIEFTU0VSVF9ORShoYW5kbGVyLT5zbmFwdXNlcmQoKS0+R2V0TnVtU2VjdG9ycygpLCAwKTsKKyNlbmRpZgogfQogCi12b2lkIFNuYXB1c2VyZFRlc3Q6OlNldERldmljZUNvbnRyb2xOYW1lKCkgewotICAgIHN5c3RlbV9kZXZpY2VfbmFtZV8uY2xlYXIoKTsKLSAgICBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8uY2xlYXIoKTsKLQotICAgIHN0ZDo6c3RyaW5nIHN0cihjb3dfc3lzdGVtXy0+cGF0aCk7Ci0gICAgc3RkOjpzaXplX3QgZm91bmQgPSBzdHIuZmluZF9sYXN0X29mKCIvXFwiKTsKLSAgICBBU1NFUlRfTkUoZm91bmQsIHN0ZDo6c3RyaW5nOjpucG9zKTsKLSAgICBzeXN0ZW1fZGV2aWNlX25hbWVfID0gc3RyLnN1YnN0cihmb3VuZCArIDEpOwotCi0gICAgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfID0gc3lzdGVtX2RldmljZV9uYW1lXyArICItY3RybCI7Ci19Ci0KLXZvaWQgU25hcHVzZXJkVGVzdDo6Q3JlYXRlRG1Vc2VyRGV2aWNlKCkgewotICAgIHVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihiYXNlX2xvb3BfLT5kZXZpY2UoKS5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpKTsKLSAgICBBU1NFUlRfVFJVRShmZCA+IDApOwotCi0gICAgdWludDY0X3QgZGV2X3N6ID0gZ2V0X2Jsb2NrX2RldmljZV9zaXplKGZkLmdldCgpKTsKLSAgICBBU1NFUlRfVFJVRShkZXZfc3ogPiAwKTsKK3ZvaWQgU25hcHVzZXJkVGVzdDo6Q3JlYXRlVXNlckRldmljZSgpIHsKKyAgICBhdXRvIGRldl9zeiA9IGJhc2VfZGV2Xy0+R2V0U2l6ZSgpOworICAgIEFTU0VSVF9ORShkZXZfc3osIDApOwogCiAgICAgY293X251bV9zZWN0b3JzXyA9IGRldl9zeiA+PiA5OwogCi0gICAgRG1UYWJsZSBkbXVzZXJfdGFibGU7Ci0gICAgQVNTRVJUX1RSVUUoZG11c2VyX3RhYmxlLkFkZFRhcmdldCgKLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RG1UYXJnZXRVc2VyPigwLCBjb3dfbnVtX3NlY3RvcnNfLCBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8pKSk7Ci0gICAgQVNTRVJUX1RSVUUoZG11c2VyX3RhYmxlLnZhbGlkKCkpOwotCi0gICAgZG11c2VyX2Rldl8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBkZXZpY2U+KHN5c3RlbV9kZXZpY2VfbmFtZV8sIGRtdXNlcl90YWJsZSk7Ci0gICAgQVNTRVJUX1RSVUUoZG11c2VyX2Rldl8tPnZhbGlkKCkpOwotICAgIEFTU0VSVF9GQUxTRShkbXVzZXJfZGV2Xy0+cGF0aCgpLmVtcHR5KCkpOwotCi0gICAgYXV0byBtaXNjX2RldmljZSA9ICIvZGV2L2RtLXVzZXIvIiArIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXzsKLSAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpmc19tZ3I6OldhaXRGb3JGaWxlKG1pc2NfZGV2aWNlLCAxMHMpKTsKKyAgICBkbXVzZXJfZGV2XyA9IGhhcm5lc3NfLT5DcmVhdGVVc2VyRGV2aWNlKHN5c3RlbV9kZXZpY2VfbmFtZV8sIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvd19udW1fc2VjdG9yc18pOworICAgIEFTU0VSVF9ORShkbXVzZXJfZGV2XywgbnVsbHB0cik7CiB9CiAKIHZvaWQgU25hcHVzZXJkVGVzdDo6SW5pdERhZW1vbigpIHsKLSAgICBib29sIG9rID0gY2xpZW50Xy0+QXR0YWNoRG1Vc2VyKHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXyk7Ci0gICAgQVNTRVJUX1RSVUUob2spOworICAgIEFTU0VSVF9UUlVFKGhhbmRsZXJzXy0+U3RhcnRIYW5kbGVyKHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXykpOwogfQogCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OkNoZWNrTWVyZ2VDb21wbGV0aW9uKCkgewogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGRvdWJsZSBwZXJjZW50YWdlID0gY2xpZW50Xy0+R2V0TWVyZ2VQZXJjZW50KCk7CisgICAgICAgIGRvdWJsZSBwZXJjZW50YWdlID0gaGFuZGxlcnNfLT5HZXRNZXJnZVBlcmNlbnRhZ2UoKTsKICAgICAgICAgaWYgKChpbnQpcGVyY2VudGFnZSA9PSAxMDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02NjIsMzAgKzY3MiwyNiBAQAogfQogCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OlNldHVwSW1wbCgpIHsKLSAgICBDcmVhdGVCYXNlRGV2aWNlKCk7Ci0gICAgQ3JlYXRlQ293RGV2aWNlKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlQmFzZURldmljZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVDb3dEZXZpY2UoKSk7CiAKICAgICBTZXREZXZpY2VDb250cm9sTmFtZSgpOwogCi0gICAgU3RhcnRTbmFwdXNlcmREYWVtb24oKTsKLQotICAgIENyZWF0ZURtVXNlckRldmljZSgpOwotICAgIEluaXRDb3dEZXZpY2UoKTsKLSAgICBJbml0RGFlbW9uKCk7Ci0KLSAgICBzZXR1cF9va18gPSB0cnVlOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZVVzZXJEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdENvd0RldmljZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RGFlbW9uKCkpOwogfQogCiBib29sIFNuYXB1c2VyZFRlc3Q6Ok1lcmdlKCkgewotICAgIFN0YXJ0TWVyZ2UoKTsKKyAgICBpZiAoIVN0YXJ0TWVyZ2UoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIENoZWNrTWVyZ2VDb21wbGV0aW9uKCk7Ci0gICAgbWVyZ2Vfb2tfID0gdHJ1ZTsKLSAgICByZXR1cm4gbWVyZ2Vfb2tfOworICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFNuYXB1c2VyZFRlc3Q6OlN0YXJ0TWVyZ2UoKSB7Ci0gICAgYm9vbCBvayA9IGNsaWVudF8tPkluaXRpYXRlTWVyZ2Uoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfKTsKLSAgICBBU1NFUlRfVFJVRShvayk7Citib29sIFNuYXB1c2VyZFRlc3Q6OlN0YXJ0TWVyZ2UoKSB7CisgICAgcmV0dXJuIGhhbmRsZXJzXy0+SW5pdGlhdGVNZXJnZShzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8pOwogfQogCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OlZhbGlkYXRlTWVyZ2UoKSB7CkBAIC02OTYsMTYxICs3MDIsMzI1IEBACiB9CiAKIHZvaWQgU25hcHVzZXJkVGVzdDo6U2ltdWxhdGVEYWVtb25SZXN0YXJ0KCkgewotICAgIFNodXRkb3duKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2h1dGRvd24oKSk7CiAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDUwMG1zKTsKICAgICBTZXREZXZpY2VDb250cm9sTmFtZSgpOwotICAgIFN0YXJ0U25hcHVzZXJkRGFlbW9uKCk7Ci0gICAgQ3JlYXRlRG1Vc2VyRGV2aWNlKCk7Ci0gICAgSW5pdENvd0RldmljZSgpOwotICAgIEluaXREYWVtb24oKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVVc2VyRGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRDb3dEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdERhZW1vbigpKTsKIH0KIAogdm9pZCBTbmFwdXNlcmRUZXN0OjpNZXJnZUludGVycnVwdFJhbmRvbWx5KGludCBtYXhfZHVyYXRpb24pIHsKICAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7Ci0gICAgU3RhcnRNZXJnZSgpOworICAgIEFTU0VSVF9UUlVFKFN0YXJ0TWVyZ2UoKSk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICAgICAgaW50IGR1cmF0aW9uID0gc3RkOjpyYW5kKCkgJSBtYXhfZHVyYXRpb247CiAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGR1cmF0aW9uKSk7Ci0gICAgICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOwotICAgICAgICBTdGFydE1lcmdlKCk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKICAgICB9CiAKLSAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CiAgICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7CiB9CiAKIHZvaWQgU25hcHVzZXJkVGVzdDo6TWVyZ2VJbnRlcnJ1cHRGaXhlZChpbnQgZHVyYXRpb24pIHsKLSAgICBTdGFydE1lcmdlKCk7CisgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU7IGkrKykgewogICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkdXJhdGlvbikpOwotICAgICAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKLSAgICAgICAgU3RhcnRNZXJnZSgpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKFN0YXJ0TWVyZ2UoKSk7CiAgICAgfQogCi0gICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCkpOworICAgIEFTU0VSVF9UUlVFKE1lcmdlKCkpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3Q6Ok1lcmdlSW50ZXJydXB0QW5kVmFsaWRhdGUoaW50IGR1cmF0aW9uKSB7CisgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykgeworICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkdXJhdGlvbikpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CisgICAgICAgIFJlYWRTbmFwc2hvdEFuZFZhbGlkYXRlT3ZlcmxhcHBpbmdCbG9ja3MoKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CiAgICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7CiB9CiAKIHZvaWQgU25hcHVzZXJkVGVzdDo6TWVyZ2VJbnRlcnJ1cHQoKSB7CiAgICAgLy8gSW50ZXJydXB0IG1lcmdlIGF0IHZhcmlvdXMgaW50ZXJ2YWxzCi0gICAgU3RhcnRNZXJnZSgpOworICAgIEFTU0VSVF9UUlVFKFN0YXJ0TWVyZ2UoKSk7CiAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDI1MG1zKTsKLSAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CiAKLSAgICBTdGFydE1lcmdlKCk7CisgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMjUwbXMpOwotICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKIAotICAgIFN0YXJ0TWVyZ2UoKTsKKyAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOwogICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxNTBtcyk7Ci0gICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCkpOwogCi0gICAgU3RhcnRNZXJnZSgpOworICAgIEFTU0VSVF9UUlVFKFN0YXJ0TWVyZ2UoKSk7CiAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zKTsKLSAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CiAKLSAgICBTdGFydE1lcmdlKCk7CisgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoODAwbXMpOwotICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKIAotICAgIFN0YXJ0TWVyZ2UoKTsKKyAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOwogICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig2MDBtcyk7Ci0gICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCkpOwogCiAgICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7CiB9CiAKLVRFU1RfRihTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9JT19URVNUKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBEZWZhdWx0KCkpOworVEVTVF9QKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X0lPX1RFU1QpIHsKKyAgICBpZiAoIWhhcm5lc3NfLT5IYXNVc2VyRGV2aWNlKCkpIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJTa2lwcGluZyBzbmFwc2hvdCByZWFkOyBub3Qgc3VwcG9ydGVkIjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBEZWZhdWx0KCkpOwogICAgIC8vIEkvTyBiZWZvcmUgbWVyZ2UKLSAgICBSZWFkU25hcHNob3REZXZpY2VBbmRWYWxpZGF0ZSgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJlYWRTbmFwc2hvdERldmljZUFuZFZhbGlkYXRlKCkpOwogICAgIEFTU0VSVF9UUlVFKE1lcmdlKCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKICAgICAvLyBJL08gYWZ0ZXIgbWVyZ2UgLSBkYWVtb24gc2hvdWxkIHJlYWQgZGlyZWN0bHkKICAgICAvLyBmcm9tIGJhc2UgZGV2aWNlCi0gICAgUmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUoKTsKLSAgICBTaHV0ZG93bigpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJlYWRTbmFwc2hvdERldmljZUFuZFZhbGlkYXRlKCkpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTUVSR0VfSU9fVEVTVCkgewotICAgIEFTU0VSVF9UUlVFKFNldHVwRGVmYXVsdCgpKTsKK1RFU1RfUChTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9NRVJHRV9JT19URVNUKSB7CisgICAgaWYgKCFoYXJuZXNzXy0+SGFzVXNlckRldmljZSgpKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiU2tpcHBpbmcgc25hcHNob3QgcmVhZDsgbm90IHN1cHBvcnRlZCI7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwRGVmYXVsdCgpKTsKICAgICAvLyBJc3N1ZSBJL08gYmVmb3JlIG1lcmdlIGJlZ2lucwotICAgIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmU25hcHVzZXJkVGVzdDo6UmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUsIHRoaXMpOworICAgIGF1dG8gcmVhZF9mdXR1cmUgPQorICAgICAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZTbmFwdXNlcmRUZXN0OjpSZWFkU25hcHNob3REZXZpY2VBbmRWYWxpZGF0ZSwgdGhpcyk7CiAgICAgLy8gU3RhcnQgdGhlIG1lcmdlCiAgICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7CiAgICAgVmFsaWRhdGVNZXJnZSgpOwotICAgIFNodXRkb3duKCk7CisgICAgcmVhZF9mdXR1cmUud2FpdCgpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTUVSR0VfSU9fVEVTVF8xKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBEZWZhdWx0KCkpOworVEVTVF9QKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01FUkdFX0lPX1RFU1RfMSkgeworICAgIGlmICghaGFybmVzc18tPkhhc1VzZXJEZXZpY2UoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIlNraXBwaW5nIHNuYXBzaG90IHJlYWQ7IG5vdCBzdXBwb3J0ZWQiOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXR1cERlZmF1bHQoKSk7CiAgICAgLy8gU3RhcnQgdGhlIG1lcmdlCi0gICAgU3RhcnRNZXJnZSgpOworICAgIEFTU0VSVF9UUlVFKFN0YXJ0TWVyZ2UoKSk7CiAgICAgLy8gSXNzdWUgSS9PIGluIHBhcmFsbGVsIHdoZW4gbWVyZ2UgaXMgaW4tcHJvZ3Jlc3MKLSAgICBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgJlNuYXB1c2VyZFRlc3Q6OlJlYWRTbmFwc2hvdERldmljZUFuZFZhbGlkYXRlLCB0aGlzKTsKKyAgICBhdXRvIHJlYWRfZnV0dXJlID0KKyAgICAgICAgICAgIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmU25hcHVzZXJkVGVzdDo6UmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUsIHRoaXMpOwogICAgIENoZWNrTWVyZ2VDb21wbGV0aW9uKCk7CiAgICAgVmFsaWRhdGVNZXJnZSgpOwotICAgIFNodXRkb3duKCk7CisgICAgcmVhZF9mdXR1cmUud2FpdCgpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfUmVzdW1lKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBEZWZhdWx0KCkpOwotICAgIE1lcmdlSW50ZXJydXB0KCk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfUmVzdW1lKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBEZWZhdWx0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKE1lcmdlSW50ZXJydXB0KCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX1RFU1RfMSkgewotICAgIEFTU0VSVF9UUlVFKFNldHVwQ29weU92ZXJsYXBfMSgpKTsKK1RFU1RfUChTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9DT1BZX092ZXJsYXBfVEVTVF8xKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBDb3B5T3ZlcmxhcF8xKCkpOwogICAgIEFTU0VSVF9UUlVFKE1lcmdlKCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX1RFU1RfMikgewotICAgIEFTU0VSVF9UUlVFKFNldHVwQ29weU92ZXJsYXBfMigpKTsKK1RFU1RfUChTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9DT1BZX092ZXJsYXBfVEVTVF8yKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBDb3B5T3ZlcmxhcF8yKCkpOwogICAgIEFTU0VSVF9UUlVFKE1lcmdlKCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX01lcmdlX1Jlc3VtZV9URVNUKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBDb3B5T3ZlcmxhcF8xKCkpOwotICAgIE1lcmdlSW50ZXJydXB0KCk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX01lcmdlX1Jlc3VtZV9URVNUKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBDb3B5T3ZlcmxhcF8xKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKE1lcmdlSW50ZXJydXB0KCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfQ3Jhc2hfRml4ZWRfT3JkZXJlZCkgewotICAgIEFTU0VSVF9UUlVFKFNldHVwT3JkZXJlZE9wcygpKTsKLSAgICBNZXJnZUludGVycnVwdEZpeGVkKDMwMCk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX01lcmdlX1Jlc3VtZV9JT19WYWxpZGF0ZV9URVNUKSB7CisgICAgaWYgKCFoYXJuZXNzXy0+SGFzVXNlckRldmljZSgpKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiU2tpcHBpbmcgc25hcHNob3QgcmVhZDsgbm90IHN1cHBvcnRlZCI7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwQ29weU92ZXJsYXBfMigpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShNZXJnZUludGVycnVwdEFuZFZhbGlkYXRlKDIpKTsKICAgICBWYWxpZGF0ZU1lcmdlKCk7Ci0gICAgU2h1dGRvd24oKTsKIH0KIAotVEVTVF9GKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01lcmdlX0NyYXNoX1JhbmRvbV9PcmRlcmVkKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBPcmRlcmVkT3BzKCkpOwotICAgIE1lcmdlSW50ZXJydXB0UmFuZG9tbHkoNTAwKTsKK1RFU1RfUChTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9NZXJnZV9DcmFzaF9GaXhlZF9PcmRlcmVkKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBPcmRlcmVkT3BzKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKE1lcmdlSW50ZXJydXB0Rml4ZWQoMzAwKSk7CiAgICAgVmFsaWRhdGVNZXJnZSgpOwotICAgIFNodXRkb3duKCk7CiB9CiAKLVRFU1RfRihTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9NZXJnZV9DcmFzaF9GaXhlZF9JbnZlcnRlZCkgewotICAgIEFTU0VSVF9UUlVFKFNldHVwT3JkZXJlZE9wc0ludmVydGVkKCkpOwotICAgIE1lcmdlSW50ZXJydXB0Rml4ZWQoNTApOworVEVTVF9QKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01lcmdlX0NyYXNoX1JhbmRvbV9PcmRlcmVkKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBPcmRlcmVkT3BzKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKE1lcmdlSW50ZXJydXB0UmFuZG9tbHkoNTAwKSk7CiAgICAgVmFsaWRhdGVNZXJnZSgpOwotICAgIFNodXRkb3duKCk7CiB9CiAKLVRFU1RfRihTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9NZXJnZV9DcmFzaF9SYW5kb21fSW52ZXJ0ZWQpIHsKLSAgICBBU1NFUlRfVFJVRShTZXR1cE9yZGVyZWRPcHNJbnZlcnRlZCgpKTsKLSAgICBNZXJnZUludGVycnVwdFJhbmRvbWx5KDUwKTsKK1RFU1RfUChTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9NZXJnZV9DcmFzaF9GaXhlZF9JbnZlcnRlZCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwT3JkZXJlZE9wc0ludmVydGVkKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKE1lcmdlSW50ZXJydXB0Rml4ZWQoNTApKTsKICAgICBWYWxpZGF0ZU1lcmdlKCk7Ci0gICAgU2h1dGRvd24oKTsKIH0KIAorVEVTVF9QKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01lcmdlX0NyYXNoX1JhbmRvbV9JbnZlcnRlZCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwT3JkZXJlZE9wc0ludmVydGVkKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKE1lcmdlSW50ZXJydXB0UmFuZG9tbHkoNTApKTsKKyAgICBWYWxpZGF0ZU1lcmdlKCk7Cit9CisKK2NsYXNzIEhhbmRsZXJUZXN0IDogcHVibGljIFNuYXB1c2VyZFRlc3RCYXNlIHsKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICBBc3NlcnRpb25SZXN1bHQgUmVhZFNlY3RvcnMoc2VjdG9yX3Qgc2VjdG9yLCB1aW50NjRfdCBzaXplLCB2b2lkKiBidWZmZXIpOworCisgICAgVGVzdEJsb2NrU2VydmVyRmFjdG9yeSBmYWN0b3J5XzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEJsb2NrU2VydmVyT3BlbmVyPiBvcGVuZXJfOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IGhhbmRsZXJfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWFkV29ya2VyPiByZWFkX3dvcmtlcl87CisgICAgVGVzdEJsb2NrU2VydmVyKiBibG9ja19zZXJ2ZXJfOworICAgIHN0ZDo6ZnV0dXJlPGJvb2w+IGhhbmRsZXJfdGhyZWFkXzsKK307CisKK3ZvaWQgSGFuZGxlclRlc3Q6OlNldFVwKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNuYXB1c2VyZFRlc3RCYXNlOjpTZXRVcCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVCYXNlRGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUNvd0RldmljZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXREZXZpY2VDb250cm9sTmFtZSgpKTsKKworICAgIG9wZW5lcl8gPSBmYWN0b3J5Xy5DcmVhdGVUZXN0T3BlbmVyKHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXyk7CisgICAgQVNTRVJUX05FKG9wZW5lcl8sIG51bGxwdHIpOworCisgICAgY29uc3QgVGVzdFBhcmFtIHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgaGFuZGxlcl8gPSBzdGQ6Om1ha2Vfc2hhcmVkPFNuYXBzaG90SGFuZGxlcj4oc3lzdGVtX2RldmljZV9jdHJsX25hbWVfLCBjb3dfc3lzdGVtXy0+cGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2Rldl8tPkdldFBhdGgoKSwgYmFzZV9kZXZfLT5HZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVyXywgMSwgZmFsc2UsIGZhbHNlLCBwYXJhbXMub19kaXJlY3QpOworICAgIEFTU0VSVF9UUlVFKGhhbmRsZXJfLT5Jbml0Q293RGV2aWNlKCkpOworICAgIEFTU0VSVF9UUlVFKGhhbmRsZXJfLT5Jbml0aWFsaXplV29ya2VycygpKTsKKworICAgIHJlYWRfd29ya2VyXyA9IHN0ZDo6bWFrZV91bmlxdWU8UmVhZFdvcmtlcj4oY293X3N5c3RlbV8tPnBhdGgsIGJhc2VfZGV2Xy0+R2V0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfLCBiYXNlX2Rldl8tPkdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfLT5HZXRTaGFyZWRQdHIoKSwgb3BlbmVyXyk7CisgICAgQVNTRVJUX1RSVUUocmVhZF93b3JrZXJfLT5Jbml0KCkpOworICAgIGJsb2NrX3NlcnZlcl8gPSBzdGF0aWNfY2FzdDxUZXN0QmxvY2tTZXJ2ZXIqPihyZWFkX3dvcmtlcl8tPmJsb2NrX3NlcnZlcigpKTsKKworICAgIGhhbmRsZXJfdGhyZWFkXyA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmU25hcHNob3RIYW5kbGVyOjpTdGFydCwgaGFuZGxlcl8uZ2V0KCkpOworfQorCit2b2lkIEhhbmRsZXJUZXN0OjpUZWFyRG93bigpIHsKKyAgICBBU1NFUlRfVFJVRShmYWN0b3J5Xy5EZWxldGVRdWV1ZShzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8pKTsKKyAgICBBU1NFUlRfVFJVRShoYW5kbGVyX3RocmVhZF8uZ2V0KCkpOworICAgIFNuYXB1c2VyZFRlc3RCYXNlOjpUZWFyRG93bigpOworfQorCitBc3NlcnRpb25SZXN1bHQgSGFuZGxlclRlc3Q6OlJlYWRTZWN0b3JzKHNlY3Rvcl90IHNlY3RvciwgdWludDY0X3Qgc2l6ZSwgdm9pZCogYnVmZmVyKSB7CisgICAgaWYgKCFyZWFkX3dvcmtlcl8tPlJlcXVlc3RTZWN0b3JzKHNlY3Rvciwgc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAicmVxdWVzdCBzZWN0b3JzIGZhaWxlZCI7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gc3RkOjptb3ZlKGJsb2NrX3NlcnZlcl8tPnNlbnRfaW8oKSk7CisgICAgaWYgKHJlc3VsdC5zaXplKCkgIT0gc2l6ZSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJzaXplIG1pc21hdGNoIGluIHJlc3VsdCwgZ290ICIgPDwgcmVzdWx0LnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGVkICIgPDwgc2l6ZTsKKyAgICB9CisKKyAgICBtZW1jcHkoYnVmZmVyLCByZXN1bHQuZGF0YSgpLCBzaXplKTsKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworfQorCisvLyBUaGlzIHRlc3QgbWlycm9ycyBSZWFkU25hcHNob3REZXZpY2VBbmRWYWxpZGF0ZS4KK1RFU1RfUChIYW5kbGVyVGVzdCwgUmVhZCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHNuYXB1c2VyZF9idWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oc2l6ZV8pOworCisgICAgLy8gQ09QWQorICAgIGxvZmZfdCBvZmZzZXQgPSAwOworICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKG9mZnNldCAvIFNFQ1RPUl9TSVpFLCBzaXplXywgc25hcHVzZXJkX2J1ZmZlci5nZXQoKSkpOworICAgIEFTU0VSVF9FUShtZW1jbXAoc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgb3JpZ19idWZmZXJfLmdldCgpLCBzaXplXyksIDApOworCisgICAgLy8gUkVQTEFDRQorICAgIG9mZnNldCArPSBzaXplXzsKKyAgICBBU1NFUlRfVFJVRShSZWFkU2VjdG9ycyhvZmZzZXQgLyBTRUNUT1JfU0laRSwgc2l6ZV8sIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCkpKTsKKyAgICBBU1NFUlRfRVEobWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBzaXplXywgc2l6ZV8pLCAwKTsKKworICAgIC8vIFpFUk8KKyAgICBvZmZzZXQgKz0gc2l6ZV87CisgICAgQVNTRVJUX1RSVUUoUmVhZFNlY3RvcnMob2Zmc2V0IC8gU0VDVE9SX1NJWkUsIHNpemVfLCBzbmFwdXNlcmRfYnVmZmVyLmdldCgpKSk7CisgICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgKHNpemVfICogMiksIHNpemVfKSwgMCk7CisKKyAgICAvLyBSRVBMQUNFCisgICAgb2Zmc2V0ICs9IHNpemVfOworICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKG9mZnNldCAvIFNFQ1RPUl9TSVpFLCBzaXplXywgc25hcHVzZXJkX2J1ZmZlci5nZXQoKSkpOworICAgIEFTU0VSVF9FUShtZW1jbXAoc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIChzaXplXyAqIDMpLCBzaXplXyksIDApOworCisgICAgLy8gWE9SCisgICAgb2Zmc2V0ICs9IHNpemVfOworICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKG9mZnNldCAvIFNFQ1RPUl9TSVpFLCBzaXplXywgc25hcHVzZXJkX2J1ZmZlci5nZXQoKSkpOworICAgIEFTU0VSVF9FUShtZW1jbXAoc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIChzaXplXyAqIDQpLCBzaXplXyksIDApOworfQorCitURVNUX1AoSGFuZGxlclRlc3QsIFJlYWRVbmFsaWduZWRTZWN0b3IpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBzbmFwdXNlcmRfYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KEJMT0NLX1NaKTsKKworICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKDEsIEJMT0NLX1NaLCBzbmFwdXNlcmRfYnVmZmVyLmdldCgpKSk7CisgICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCBvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBTRUNUT1JfU0laRSwgQkxPQ0tfU1opLCAwKTsKK30KKworVEVTVF9QKEhhbmRsZXJUZXN0LCBSZWFkVW5hbGlnbmVkU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHNuYXB1c2VyZF9idWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oU0VDVE9SX1NJWkUpOworCisgICAgQVNTRVJUX1RSVUUoUmVhZFNlY3RvcnMoMCwgU0VDVE9SX1NJWkUsIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCkpKTsKKyAgICBBU1NFUlRfRVEobWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIG9yaWdfYnVmZmVyXy5nZXQoKSwgU0VDVE9SX1NJWkUpLCAwKTsKK30KKworc3RkOjp2ZWN0b3I8Ym9vbD4gR2V0SW9VcmluZ0NvbmZpZ3MoKSB7CisjaWYgX19BTkRST0lEX18KKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8udmlydHVhbF9hYi5pb191cmluZy5lbmFibGVkIiwgZmFsc2UpKSB7CisgICAgICAgIHJldHVybiB7ZmFsc2V9OworICAgIH0KKyNlbmRpZgorICAgIGlmICghS2VybmVsU3VwcG9ydHNJb1VyaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIHtmYWxzZX07CisgICAgfQorICAgIHJldHVybiB7ZmFsc2UsIHRydWV9OworfQorCitzdGQ6OnZlY3RvcjxUZXN0UGFyYW0+IEdldFRlc3RDb25maWdzKCkgeworICAgIHN0ZDo6dmVjdG9yPFRlc3RQYXJhbT4gdGVzdFBhcmFtczsKKyAgICBzdGQ6OnZlY3Rvcjxib29sPiB1cmluZ19jb25maWdzID0gR2V0SW9VcmluZ0NvbmZpZ3MoKTsKKworICAgIGZvciAoYm9vbCBjb25maWcgOiB1cmluZ19jb25maWdzKSB7CisgICAgICAgIFRlc3RQYXJhbSBwYXJhbTsKKyAgICAgICAgcGFyYW0uaW9fdXJpbmcgPSBjb25maWc7CisgICAgICAgIHBhcmFtLm9fZGlyZWN0ID0gZmFsc2U7CisgICAgICAgIHRlc3RQYXJhbXMucHVzaF9iYWNrKHN0ZDo6bW92ZShwYXJhbSkpOworICAgIH0KKworICAgIGZvciAoYm9vbCBjb25maWcgOiB1cmluZ19jb25maWdzKSB7CisgICAgICAgIFRlc3RQYXJhbSBwYXJhbTsKKyAgICAgICAgcGFyYW0uaW9fdXJpbmcgPSBjb25maWc7CisgICAgICAgIHBhcmFtLm9fZGlyZWN0ID0gdHJ1ZTsKKyAgICAgICAgdGVzdFBhcmFtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHBhcmFtKSk7CisgICAgfQorICAgIHJldHVybiB0ZXN0UGFyYW1zOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoSW8sIFNuYXB1c2VyZFRlc3QsIDo6dGVzdGluZzo6VmFsdWVzSW4oR2V0VGVzdENvbmZpZ3MoKSkpOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKElvLCBIYW5kbGVyVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXNJbihHZXRUZXN0Q29uZmlncygpKSk7CisKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApAQCAtODU5LDIwICsxMDI5LDUgQEAKIAogICAgIGdmbGFnczo6UGFyc2VDb21tYW5kTGluZUZsYWdzKCZhcmdjLCAmYXJndiwgZmFsc2UpOwogCi0gICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoImN0bC5zdG9wIiwgInNuYXB1c2VyZCIpOwotCi0gICAgaWYgKEZMQUdTX2ZvcmNlX2NvbmZpZyA9PSAiaW91cmluZ19kaXNhYmxlZCIpIHsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eSgic25hcHVzZXJkLnRlc3QuaW9fdXJpbmcuZm9yY2VfZGlzYWJsZSIsICIxIikpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGRpc2FibGUgcHJvcGVydHk6IHNuYXB1c2VyZC50ZXN0LmlvX3VyaW5nLmRpc2FibGVkIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCByZXQgPSBSVU5fQUxMX1RFU1RTKCk7Ci0KLSAgICBpZiAoRkxBR1NfZm9yY2VfY29uZmlnID09ICJpb3VyaW5nX2Rpc2FibGVkIikgewotICAgICAgICBhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eSgic25hcHVzZXJkLnRlc3QuaW9fdXJpbmcuZm9yY2VfZGlzYWJsZSIsICIwIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOwogfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF90cmFuc2l0aW9ucy5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3RyYW5zaXRpb25zLmNwcAppbmRleCAyOGM5ZjY4Li4yYWQ0ZWExIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3RyYW5zaXRpb25zLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3RyYW5zaXRpb25zLmNwcApAQCAtMTg5LDMzICsxODksMzIgQEAKICAgICBjdi5ub3RpZnlfYWxsKCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBJc01lcmdlQmVnaW5FcnJvcihNRVJHRV9JT19UUkFOU0lUSU9OIGlvX3N0YXRlKSB7CisgICAgcmV0dXJuIGlvX3N0YXRlID09IE1FUkdFX0lPX1RSQU5TSVRJT046OlJFQURfQUhFQURfRkFJTFVSRSB8fAorICAgICAgICAgICBpb19zdGF0ZSA9PSBNRVJHRV9JT19UUkFOU0lUSU9OOjpJT19URVJNSU5BVEVEOworfQorCiAvLyBJbnZva2VkIGJ5IE1lcmdlIHRocmVhZCAtIFdhaXRzIG9uIFJBIHRocmVhZCB0byByZXN1bWUgbWVyZ2luZy4gV2lsbAogLy8gYmUgd2FrZW4gdXAgUkEgdGhyZWFkLgogYm9vbCBTbmFwc2hvdEhhbmRsZXI6OldhaXRGb3JNZXJnZUJlZ2luKCkgewotICAgIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgd2hpbGUgKCFNZXJnZUluaXRpYXRlZCgpKSB7Ci0gICAgICAgICAgICBjdi53YWl0KGxvY2spOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CiAKLSAgICAgICAgICAgIGlmIChpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFIHx8Ci0gICAgICAgICAgICAgICAgaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046OklPX1RFUk1JTkFURUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBjdi53YWl0KGxvY2ssIFt0aGlzXSgpIC0+IGJvb2wgeyByZXR1cm4gTWVyZ2VJbml0aWF0ZWQoKSB8fCBJc01lcmdlQmVnaW5FcnJvcihpb19zdGF0ZV8pOyB9KTsKIAotICAgICAgICB3aGlsZSAoIShpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6TUVSR0VfQkVHSU4gfHwKLSAgICAgICAgICAgICAgICAgaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046OlJFQURfQUhFQURfRkFJTFVSRSB8fAotICAgICAgICAgICAgICAgICBpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6SU9fVEVSTUlOQVRFRCkpIHsKLSAgICAgICAgICAgIGN2LndhaXQobG9jayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046OlJFQURfQUhFQURfRkFJTFVSRSB8fAotICAgICAgICAgICAgaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046OklPX1RFUk1JTkFURUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChJc01lcmdlQmVnaW5FcnJvcihpb19zdGF0ZV8pKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiV2FpdEZvck1lcmdlQmVnaW4gZmFpbGVkIHdpdGggc3RhdGU6ICIgPDwgaW9fc3RhdGVfOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorCisgICAgY3Yud2FpdChsb2NrLCBbdGhpc10oKSAtPiBib29sIHsKKyAgICAgICAgcmV0dXJuIGlvX3N0YXRlXyA9PSBNRVJHRV9JT19UUkFOU0lUSU9OOjpNRVJHRV9CRUdJTiB8fCBJc01lcmdlQmVnaW5FcnJvcihpb19zdGF0ZV8pOworICAgIH0pOworCisgICAgaWYgKElzTWVyZ2VCZWdpbkVycm9yKGlvX3N0YXRlXykpIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJXYWl0Rm9yTWVyZ2VCZWdpbiBmYWlsZWQgd2l0aCBzdGF0ZTogIiA8PCBpb19zdGF0ZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vIEludm9rZWQgYnkgUkEgdGhyZWFkIC0gRmx1c2hlcyB0aGUgUkEgYmxvY2sgdG8gc2NyYXRjaCBzcGFjZSBpZiBuZWNlc3NhcnkKQEAgLTI3Nyw2ICsyNzYsNyBAQAogICAgICAgICBpZiAoaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046Ok1FUkdFX0ZBSUxFRCB8fAogICAgICAgICAgICAgaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046Ok1FUkdFX0NPTVBMRVRFIHx8CiAgICAgICAgICAgICBpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6SU9fVEVSTUlOQVRFRCkgeworICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJXYWl0IGZvciBtZXJnZSByZWFkeSBmYWlsZWQ6ICIgPDwgaW9fc3RhdGVfOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzY2LDEwICszNjYsMzYgQEAKICAgICB9CiB9CiAKK3ZvaWQgU25hcHNob3RIYW5kbGVyOjpSYVRocmVhZFN0YXJ0ZWQoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKKyAgICByYV90aHJlYWRfc3RhcnRlZF8gPSB0cnVlOworfQorCit2b2lkIFNuYXBzaG90SGFuZGxlcjo6V2FpdEZvclJhVGhyZWFkVG9TdGFydCgpIHsKKyAgICBhdXRvIG5vdyA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgIGF1dG8gZGVhZGxpbmUgPSBub3cgKyAzczsKKyAgICB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgICAgIHdoaWxlICghcmFfdGhyZWFkX3N0YXJ0ZWRfKSB7CisgICAgICAgICAgICBhdXRvIHN0YXR1cyA9IGN2LndhaXRfdW50aWwobG9jaywgZGVhZGxpbmUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgeworICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZC1haGVhZCB0aHJlYWQgZGlkIG5vdCBzdGFydCI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNuYXBzaG90SGFuZGxlcjo6TWFya01lcmdlQ29tcGxldGUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworICAgIG1lcmdlX2NvbXBsZXRlXyA9IHRydWU7Cit9CisKIHN0ZDo6c3RyaW5nIFNuYXBzaG90SGFuZGxlcjo6R2V0TWVyZ2VTdGF0dXMoKSB7CiAgICAgYm9vbCBtZXJnZV9ub3RfaW5pdGlhdGVkID0gZmFsc2U7CiAgICAgYm9vbCBtZXJnZV9tb25pdG9yZWQgPSBmYWxzZTsKICAgICBib29sIG1lcmdlX2ZhaWxlZCA9IGZhbHNlOworICAgIGJvb2wgbWVyZ2VfY29tcGxldGUgPSBmYWxzZTsKIAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwpAQCAtMzg1LDEwICs0MTEsOSBAQAogICAgICAgICBpZiAoaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046Ok1FUkdFX0ZBSUxFRCkgewogICAgICAgICAgICAgbWVyZ2VfZmFpbGVkID0gdHJ1ZTsKICAgICAgICAgfQotICAgIH0KIAotICAgIHN0cnVjdCBDb3dIZWFkZXIqIGNoID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgQ293SGVhZGVyKj4obWFwcGVkX2FkZHJfKTsKLSAgICBib29sIG1lcmdlX2NvbXBsZXRlID0gKGNoLT5udW1fbWVyZ2Vfb3BzID09IHJlYWRlcl8tPmdldF9udW1fdG90YWxfZGF0YV9vcHMoKSk7CisgICAgICAgIG1lcmdlX2NvbXBsZXRlID0gbWVyZ2VfY29tcGxldGVfOworICAgIH0KIAogICAgIGlmIChtZXJnZV9ub3RfaW5pdGlhdGVkKSB7CiAgICAgICAgIC8vIE1lcmdlIHdhcyBub3QgaW5pdGlhdGVkIHlldDsgaG93ZXZlciwgd2UgaGF2ZSBtZXJnZSBjb21wbGV0aW9uCkBAIC00MjQsNyArNDQ5LDYgQEAKICAgICAgICAgcmV0dXJuICJzbmFwc2hvdC1tZXJnZS1mYWlsZWQiOwogICAgIH0KIAotICAgIC8vIE1lcmdlIGNvbXBsZXRlCiAgICAgaWYgKG1lcmdlX2NvbXBsZXRlKSB7CiAgICAgICAgIHJldHVybiAic25hcHNob3QtbWVyZ2UtY29tcGxldGUiOwogICAgIH0KQEAgLTYxOCw3ICs2NDIsNiBAQAogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdm9pZCo+OjppdGVyYXRvciBpdCA9IHJlYWRfYWhlYWRfYnVmZmVyX21hcF8uZmluZChibG9jayk7CiAKICAgICBpZiAoaXQgPT0gcmVhZF9haGVhZF9idWZmZXJfbWFwXy5lbmQoKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkJsb2NrOiAiIDw8IGJsb2NrIDw8ICIgbm90IGZvdW5kIGluIFJBIGJ1ZmZlciI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTY0Miw2ICs2NjUsMTMgQEAKICAgICAgICAgTUVSR0VfR1JPVVBfU1RBVEUgc3RhdGUgPSBibGtfc3RhdGUtPm1lcmdlX3N0YXRlXzsKICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewogICAgICAgICAgICAgY2FzZSBNRVJHRV9HUk9VUF9TVEFURTo6R1JPVVBfTUVSR0VfUEVORElORzogeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBtZXJnZS1yZXN1bWUgcGF0aCwgY2hlY2sgaWYgdGhlIGRhdGEgaXMKKyAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSBzY3JhdGNoIHNwYWNlLiBEYXRhIGZyb20gc2NyYXRjaCBzcGFjZSB0YWtlcworICAgICAgICAgICAgICAgIC8vIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gZnJvbSBzb3VyY2UgZGV2aWNlIGZvciBvdmVybGFwcGluZworICAgICAgICAgICAgICAgIC8vIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBpZiAocmVzdW1lX21lcmdlXyAmJiBHZXRSQUJ1ZmZlcigmbG9jaywgbmV3X2Jsb2NrLCBidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTUVSR0VfR1JPVVBfU1RBVEU6OkdST1VQX01FUkdFX0lOX1BST0dSRVNTKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYmxrX3N0YXRlLT5udW1faW9zX2luX3Byb2dyZXNzICs9IDE7ICAvLyByZWYgY291bnQKICAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CiAgICAgICAgICAgICB9CkBAIC02NjgsNSArNjk4LDI2IEBACiAgICAgfQogfQogCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgTUVSR0VfSU9fVFJBTlNJVElPTiB2YWx1ZSkgeworICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgY2FzZSBNRVJHRV9JT19UUkFOU0lUSU9OOjpJTlZBTElEOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJJTlZBTElEIjsKKyAgICAgICAgY2FzZSBNRVJHRV9JT19UUkFOU0lUSU9OOjpNRVJHRV9SRUFEWToKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAiTUVSR0VfUkVBRFkiOworICAgICAgICBjYXNlIE1FUkdFX0lPX1RSQU5TSVRJT046Ok1FUkdFX0JFR0lOOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJNRVJHRV9CRUdJTiI7CisgICAgICAgIGNhc2UgTUVSR0VfSU9fVFJBTlNJVElPTjo6TUVSR0VfRkFJTEVEOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJNRVJHRV9GQUlMRUQiOworICAgICAgICBjYXNlIE1FUkdFX0lPX1RSQU5TSVRJT046Ok1FUkdFX0NPTVBMRVRFOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJNRVJHRV9DT01QTEVURSI7CisgICAgICAgIGNhc2UgTUVSR0VfSU9fVFJBTlNJVElPTjo6SU9fVEVSTUlOQVRFRDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAiSU9fVEVSTUlOQVRFRCI7CisgICAgICAgIGNhc2UgTUVSR0VfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJSRUFEX0FIRUFEX0ZBSUxVUkUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJ1bmtub3duIjsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdmVyaWZ5LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdmVyaWZ5LmNwcAppbmRleCAxOGMxZGZjLi42ODE3MzQwIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3ZlcmlmeS5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF92ZXJpZnkuY3BwCkBAIC0xNCwxMiArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgorI2luY2x1ZGUgInNuYXB1c2VyZF92ZXJpZnkuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc2NvcGVndWFyZC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAKKyNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3ZlcmlmeS5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF92ZXJpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk5MDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF92ZXJpZnkuaApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c25hcHVzZXJkL3NuYXB1c2VyZF9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnN0b3JhZ2VfbGl0ZXJhbHM7CisKK2NsYXNzIFVwZGF0ZVZlcmlmeSB7CisgIHB1YmxpYzoKKyAgICBVcGRhdGVWZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7CisgICAgdm9pZCBWZXJpZnlVcGRhdGVQYXJ0aXRpb24oKTsKKyAgICBib29sIENoZWNrUGFydGl0aW9uVmVyaWZpY2F0aW9uKCk7CisKKyAgcHJpdmF0ZToKKyAgICBlbnVtIGNsYXNzIFVwZGF0ZVZlcmlmeVN0YXRlIHsKKyAgICAgICAgVkVSSUZZX1VOS05PV04sCisgICAgICAgIFZFUklGWV9GQUlMRUQsCisgICAgICAgIFZFUklGWV9TVUNDRVNTLAorICAgIH07CisKKyAgICBzdGQ6OnN0cmluZyBtaXNjX25hbWVfOworICAgIFVwZGF0ZVZlcmlmeVN0YXRlIHN0YXRlXzsKKyAgICBzdGQ6Om11dGV4IG1fbG9ja187CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbV9jdl87CisKKyAgICAvKgorICAgICAqIFNjYW5uaW5nIG9mIHBhcnRpdGlvbnMgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiBib3RoIGluIHRlcm1zIG9mIG1lbW9yeQorICAgICAqIGFuZCBDUFUgdXNhZ2UuIFRoZSBnb2FsIGhlcmUgaXMgdG8gc2NhbiB0aGUgcGFydGl0aW9ucyBmYXN0IGVub3VnaCB3aXRob3V0CisgICAgICogc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gdGhlIGJvb3QgdGltZS4KKyAgICAgKgorICAgICAqIFBhcnRpdGlvbnMgc3VjaCBhcyBzeXN0ZW0sIHByb2R1Y3Qgd2hpY2ggbWF5IGJlIGh1Z2UgYW5kIG1heSBuZWVkIG11bHRpcGxlCisgICAgICogdGhyZWFkcyB0byBzcGVlZCB1cCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuIFVzaW5nIG11bHRpcGxlIHRocmVhZHMgZm9yCisgICAgICogYWxsIHBhcnRpdGlvbnMgbWF5IGluY3JlYXNlIENQVSB1c2FnZSBzaWduaWZpY2FudGx5LiBIZW5jZSwgbGltaXQgdGhhdCB0bworICAgICAqIDEgdGhyZWFkIHBlciBwYXJ0aXRpb24uCisgICAgICoKKyAgICAgKiBUaGVzZSBudW1iZXJzIHdlcmUgZGVyaXZlZCBieSBtb25pdG9yaW5nIHRoZSBtZW1vcnkgYW5kIENQVSBwcmVzc3VyZQorICAgICAqICgvcHJvYy9wcmVzc3VyZS97Y3B1LG1lbW9yeX07IGFuZCBtb25pdG9yaW5nIHRoZSBJbmFjdGl2ZShmaWxlKSBhbmQKKyAgICAgKiBBY3RpdmUoZmlsZSkgcGFnZXMgZnJvbSAvcHJvYy9tZW1pbmZvLgorICAgICAqCisgICAgICogQWRkaXRpb25hbGx5LCBmb3IgbG93IG1lbW9yeSBkZXZpY2VzLCBpdCBpcyBhZHZpc2libGUgdG8gdXNlIE9fRElSRUNUCisgICAgICogZnVjbnRpb25hbGl0eSBmb3Igc291cmNlIGJsb2NrIGRldmljZS4KKyAgICAgKi8KKyAgICBpbnQga01pblRocmVhZHNUb1ZlcmlmeSA9IDE7CisgICAgaW50IGtNYXhUaHJlYWRzVG9WZXJpZnkgPSAzOworICAgIHVpbnQ2NF90IGtUaHJlc2hvbGRTaXplID0gNzUwX01pQjsKKyAgICB1aW50NjRfdCBrQmxvY2tTaXplVmVyaWZ5ID0gMl9NaUI7CisKKyAgICBib29sIElzQmxvY2tBbGlnbmVkKHVpbnQ2NF90IHJlYWRfc2l6ZSkgeyByZXR1cm4gKChyZWFkX3NpemUgJiAoQkxPQ0tfU1ogLSAxKSkgPT0gMCk7IH0KKyAgICB2b2lkIFVwZGF0ZVBhcnRpdGlvblZlcmlmaWNhdGlvblN0YXRlKFVwZGF0ZVZlcmlmeVN0YXRlIHN0YXRlKTsKKyAgICBib29sIFZlcmlmeVBhcnRpdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9ibG9ja19kZXZpY2UpOworICAgIGJvb2wgVmVyaWZ5QmxvY2tzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRtX2Jsb2NrX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCBza2lwX2Jsb2NrcywgdWludDY0X3QgZGV2X3N6KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS93b3JrZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3dvcmtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyMDhmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS93b3JrZXIuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAid29ya2VyLmgiCisKKyNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitXb3JrZXI6Oldvcmtlcihjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCkgeworICAgIGNvd19kZXZpY2VfID0gY293X2RldmljZTsKKyAgICBtaXNjX25hbWVfID0gbWlzY19uYW1lOworICAgIGJhc2VfcGF0aF9tZXJnZV8gPSBiYXNlX3BhdGhfbWVyZ2U7CisgICAgc25hcHVzZXJkXyA9IHNuYXB1c2VyZDsKK30KKworYm9vbCBXb3JrZXI6OkluaXQoKSB7CisgICAgaWYgKCFJbml0aWFsaXplRmRzKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghSW5pdFJlYWRlcigpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXb3JrZXI6OkluaXRSZWFkZXIoKSB7CisgICAgcmVhZGVyXyA9IHNuYXB1c2VyZF8tPkNsb25lUmVhZGVyRm9yV29ya2VyKCk7CisKKyAgICBpZiAoIXJlYWRlcl8tPkluaXRGb3JNZXJnZShzdGQ6Om1vdmUoY293X2ZkXykpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV29ya2VyOjpJbml0aWFsaXplRmRzKCkgeworICAgIGNvd19mZF8ucmVzZXQob3Blbihjb3dfZGV2aWNlXy5jX3N0cigpLCBPX1JEV1IpKTsKKyAgICBpZiAoY293X2ZkXyA8IDApIHsKKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiT3BlbiBGYWlsZWQ6ICIgPDwgY293X2RldmljZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBCYXNlIGRldmljZSB1c2VkIGJ5IG1lcmdlIHRocmVhZAorICAgIGJhc2VfcGF0aF9tZXJnZV9mZF8ucmVzZXQob3BlbihiYXNlX3BhdGhfbWVyZ2VfLmNfc3RyKCksIE9fUkRXUikpOworICAgIGlmIChiYXNlX3BhdGhfbWVyZ2VfZmRfIDwgMCkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcGVuIEZhaWxlZDogIiA8PCBiYXNlX3BhdGhfbWVyZ2VfOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS93b3JrZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS93b3JrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODlkMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3dvcmtlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfcmVhZGVyLmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2tlcm5lbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKK2NsYXNzIFNuYXBzaG90SGFuZGxlcjsKKworY2xhc3MgV29ya2VyIHsKKyAgcHVibGljOgorICAgIFdvcmtlcihjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKKyAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkKTsKKyAgICB2aXJ0dWFsIH5Xb3JrZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgSW5pdCgpOworCisgIHByb3RlY3RlZDoKKyAgICBib29sIEluaXRpYWxpemVGZHMoKTsKKyAgICBib29sIEluaXRSZWFkZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgQ2xvc2VGZHMoKSB7IGJhc2VfcGF0aF9tZXJnZV9mZF8gPSB7fTsgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4gcmVhZGVyXzsKKworICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87ICAvLyBOZWVkZWQgZm9yIFNOQVBfTE9HLgorCisgICAgdW5pcXVlX2ZkIGJhc2VfcGF0aF9tZXJnZV9mZF87CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmRfOworCisgIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgY293X2RldmljZV87CisgICAgc3RkOjpzdHJpbmcgYmFzZV9wYXRoX21lcmdlXzsKKyAgICB1bmlxdWVfZmQgY293X2ZkXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXRpbGl0eS5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3V0aWxpdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NGNhM2QKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3V0aWxpdHkuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAidXRpbGl0eS5oIgorCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3Byb2Nlc3Nncm91cC5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworYm9vbCBTZXRUaHJlYWRQcmlvcml0eShbW21heWJlX3VudXNlZF1dIGludCBwcmlvcml0eSkgeworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgcmV0dXJuIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgZ2V0dGlkKCksIHByaW9yaXR5KSAhPSAtMTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworYm9vbCBTZXRQcm9maWxlcyhbW21heWJlX3VudXNlZF1dIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnN0cmluZ192aWV3PiBwcm9maWxlcykgeworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgaWYgKHNldGdpZChBSURfU1lTVEVNKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBTZXRUYXNrUHJvZmlsZXMoZ2V0dGlkKCksIHByb2ZpbGVzKTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworYm9vbCBLZXJuZWxTdXBwb3J0c0lvVXJpbmcoKSB7CisgICAgc3RydWN0IHV0c25hbWUgdXRzIHt9OworICAgIHVuc2lnbmVkIGludCBtYWpvciwgbWlub3I7CisKKyAgICB1bmFtZSgmdXRzKTsKKyAgICBpZiAoc3NjYW5mKHV0cy5yZWxlYXNlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV2Ugd2lsbCBvbmx5IHN1cHBvcnQga2VybmVscyBmcm9tIDUuNiBvbndhcmRzIGFzIElPU1FFX0FTWU5DIGZsYWcgYW5kCisgICAgLy8gSU9fVVJJTkdfT1BfUkVBRC9XUklURSBvcGNvZGVzIHdlcmUgaW50cm9kdWNlZCBvbmx5IG9uIDUuNiBrZXJuZWwKKyAgICByZXR1cm4gbWFqb3IgPiA1IHx8IChtYWpvciA9PSA1ICYmIG1pbm9yID49IDYpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3V0aWxpdHkuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXRpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzNjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3V0aWxpdHkuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHN0cmluZ192aWV3PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitib29sIFNldFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Citib29sIFNldFByb2ZpbGVzKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnN0cmluZ192aWV3PiBwcm9maWxlcyk7Citib29sIEtlcm5lbFN1cHBvcnRzSW9VcmluZygpOworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvdGVzdF9oZWxwZXJzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC90ZXN0X2hlbHBlcnMuY3BwCmluZGV4IDlmMWQ2NzYuLjJlYWMzNDcgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC90ZXN0X2hlbHBlcnMuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC90ZXN0X2hlbHBlcnMuY3BwCkBAIC0xMzAsMTIgKzEzMCw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0ZDo6c3RyaW5nIEhhc2hTbmFwc2hvdChJU25hcHNob3RXcml0ZXIqIHdyaXRlcikgewotICAgIGF1dG8gcmVhZGVyID0gd3JpdGVyLT5PcGVuUmVhZGVyKCk7Ci0gICAgaWYgKCFyZWFkZXIpIHsKLSAgICAgICAgcmV0dXJuIHt9OwotICAgIH0KLQorc3RkOjpzdHJpbmcgSGFzaFNuYXBzaG90KElDb3dXcml0ZXI6OkZpbGVEZXNjcmlwdG9yKiByZWFkZXIpIHsKICAgICBTSEEyNTZfQ1RYIGN0eDsKICAgICBTSEEyNTZfSW5pdCgmY3R4KTsKIApAQCAtMjE0LDY4ICsyMDksNiBAQAogICAgIHJldHVybiBwYXJ0aXRpb25fdXBkYXRlLT5tdXRhYmxlX25ld19wYXJ0aXRpb25faW5mbygpLT5zaXplKCk7CiB9CiAKLUFzc2VydGlvblJlc3VsdCBMb3dTcGFjZVVzZXJkYXRhOjpJbml0KHVpbnQ2NF90IG1heF9mcmVlX3NwYWNlKSB7Ci0gICAgYXV0byByZXMgPSBSZWFkVXNlcmRhdGFTdGF0cygpOwotICAgIGlmICghcmVzKSByZXR1cm4gcmVzOwotCi0gICAgLy8gVHJ5IHRvIGZpbGwgdXAgdGhlIGRpc2sgYXMgbXVjaCBhcyBwb3NzaWJsZSB1bnRpbCBmcmVlX3NwYWNlXyA8PSBtYXhfZnJlZV9zcGFjZS4KLSAgICBiaWdfZmlsZV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KCk7Ci0gICAgaWYgKGJpZ19maWxlXy0+ZmQgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgfQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChiaWdfZmlsZV8tPnBhdGgsIGtVc2VyRGF0YURldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiVGVtcCBmaWxlIGFsbG9jYXRlZCB0byAiIDw8IGJpZ19maWxlXy0+cGF0aCA8PCAiLCBub3QgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGtVc2VyRGF0YURldmljZTsKLSAgICB9Ci0gICAgdWludDY0X3QgbmV4dF9jb25zdW1lID0gc3RkOjptaW4oc3RkOjptYXgoYXZhaWxhYmxlX3NwYWNlXywgbWF4X2ZyZWVfc3BhY2UpIC0gbWF4X2ZyZWVfc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KXN0ZDo6bnVtZXJpY19saW1pdHM8b2ZmX3Q+OjptYXgoKSk7Ci0gICAgb2ZmX3QgYWxsb2NhdGVkID0gMDsKLSAgICB3aGlsZSAobmV4dF9jb25zdW1lID4gMCAmJiBmcmVlX3NwYWNlXyA+IG1heF9mcmVlX3NwYWNlKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBmYWxsb2NhdGUoYmlnX2ZpbGVfLT5mZCwgMCwgYWxsb2NhdGVkLCBuZXh0X2NvbnN1bWUpOwotICAgICAgICBpZiAoc3RhdHVzID09IC0xICYmIGVycm5vID09IEVOT1NQQykgewotICAgICAgICAgICAgbmV4dF9jb25zdW1lIC89IDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICAgICAgfQotICAgICAgICBhbGxvY2F0ZWQgKz0gbmV4dF9jb25zdW1lOwotCi0gICAgICAgIHJlcyA9IFJlYWRVc2VyZGF0YVN0YXRzKCk7Ci0gICAgICAgIGlmICghcmVzKSByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCBhbGxvY2F0ZWQgPDwgIiBieXRlcyBhbGxvY2F0ZWQgdG8gIiA8PCBiaWdfZmlsZV8tPnBhdGg7Ci0gICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgTG93U3BhY2VVc2VyZGF0YTo6UmVhZFVzZXJkYXRhU3RhdHMoKSB7Ci0gICAgc3RydWN0IHN0YXR2ZnMgYnVmOwotICAgIGlmIChzdGF0dmZzKGtVc2VyRGF0YURldmljZSwgJmJ1ZikgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgfQotICAgIGJzaXplXyA9IGJ1Zi5mX2JzaXplOwotICAgIGZyZWVfc3BhY2VfID0gYnNpemVfICogYnVmLmZfYmZyZWU7Ci0gICAgYXZhaWxhYmxlX3NwYWNlXyA9IGJzaXplXyAqIGJ1Zi5mX2JhdmFpbDsKLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotfQotCi11aW50NjRfdCBMb3dTcGFjZVVzZXJkYXRhOjpmcmVlX3NwYWNlKCkgY29uc3QgewotICAgIENIRUNLKGluaXRpYWxpemVkXyk7Ci0gICAgcmV0dXJuIGZyZWVfc3BhY2VfOwotfQotCi11aW50NjRfdCBMb3dTcGFjZVVzZXJkYXRhOjphdmFpbGFibGVfc3BhY2UoKSBjb25zdCB7Ci0gICAgQ0hFQ0soaW5pdGlhbGl6ZWRfKTsKLSAgICByZXR1cm4gYXZhaWxhYmxlX3NwYWNlXzsKLX0KLQotdWludDY0X3QgTG93U3BhY2VVc2VyZGF0YTo6YnNpemUoKSBjb25zdCB7Ci0gICAgQ0hFQ0soaW5pdGlhbGl6ZWRfKTsKLSAgICByZXR1cm4gYnNpemVfOwotfQotCiBib29sIElzVmlydHVhbEFiRW5hYmxlZCgpIHsKICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJyby52aXJ0dWFsX2FiLmVuYWJsZWQiLCBmYWxzZSk7CiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvQW5kcm9pZC5icCBiL2ZzX21nci9saWJzbmFwc2hvdC90b29scy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzkyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImNvd19iZW5jaG1hcmsiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJmc19tZ3JfZGVmYXVsdHMiLAorICAgICAgICAibGlic25hcHNob3RfY293X2RlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJjb3dfYmVuY2htYXJrLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWyItV2Vycm9yIl0sCit9CisKKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAid3JpdGVfY293IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiZnNfbWdyX2RlZmF1bHRzIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2Nvd19kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsid3JpdGVfY293LmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCisgICAgICAgICJsaWJnZmxhZ3MiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAorfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL2Nvd19iZW5jaG1hcmsuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL2Nvd19iZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNWUzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvY293X2JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwyMDIgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cmFuZG9tPgorCisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2NvbXByZXNzLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgorCitzdGF0aWMgY29uc3QgdWludDMyX3QgQkxPQ0tfU1ogPSA0MDk2Oworc3RhdGljIGNvbnN0IHVpbnQzMl90IFNFRURfTlVNQkVSID0gMTA7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBDb21wcmVzc2lvblRvU3RyaW5nKENvd0NvbXByZXNzaW9uJiBjb21wcmVzc2lvbikgeworICAgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgICBzd2l0Y2ggKGNvbXByZXNzaW9uLmFsZ29yaXRobSkgeworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc0Jyb3RsaToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoImJyb3RsaSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzR3o6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJneiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTHo0OgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgibHo0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3Nac3RkOgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgienN0ZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTm9uZToKKyAgICAgICAgICAgIHJldHVybiAiTm8gQ29tcHJlc3Npb24iOworICAgIH0KKyAgICBvdXRwdXQuYXBwZW5kKCIgIiArIHN0ZDo6dG9fc3RyaW5nKGNvbXByZXNzaW9uLmNvbXByZXNzaW9uX2xldmVsKSk7CisgICAgcmV0dXJuIG91dHB1dDsKK30KKwordm9pZCBPbmVTaG90Q29tcHJlc3Npb25UZXN0KCkgeworICAgIHN0ZDo6Y291dCA8PCAiXG4tLS0tLS0tT25lIFNob3QgQ29tcHJlc3NvciBQZXJmIEFuYWx5c2lzLS0tLS0tLVxuIjsKKworICAgIHN0ZDo6dmVjdG9yPENvd0NvbXByZXNzaW9uPiBjb21wcmVzc2lvbl9saXN0ID0geworICAgICAgICAgICAge2tDb3dDb21wcmVzc0x6NCwgMH0sICAgICB7a0Nvd0NvbXByZXNzQnJvdGxpLCAxfSwge2tDb3dDb21wcmVzc0Jyb3RsaSwgM30sCisgICAgICAgICAgICB7a0Nvd0NvbXByZXNzQnJvdGxpLCAxMX0sIHtrQ293Q29tcHJlc3Nac3RkLCAzfSwgICB7a0Nvd0NvbXByZXNzWnN0ZCwgNn0sCisgICAgICAgICAgICB7a0Nvd0NvbXByZXNzWnN0ZCwgOX0sICAgIHtrQ293Q29tcHJlc3Nac3RkLCAyMn0sICB7a0Nvd0NvbXByZXNzR3osIDF9LAorICAgICAgICAgICAge2tDb3dDb21wcmVzc0d6LCAzfSwgICAgICB7a0Nvd0NvbXByZXNzR3osIDZ9LCAgICAge2tDb3dDb21wcmVzc0d6LCA5fX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPj4gY29tcHJlc3NvcnM7CisgICAgZm9yIChhdXRvIGkgOiBjb21wcmVzc2lvbl9saXN0KSB7CisgICAgICAgIGNvbXByZXNzb3JzLmVtcGxhY2VfYmFjayhJQ29tcHJlc3Nvcjo6Q3JlYXRlKGksIEJMT0NLX1NaKSk7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgYSBidWZmZXIgb2Ygc2l6ZSA4IGJsb2Nrcy4KKyAgICBzdGQ6OmFycmF5PGNoYXIsIDMyNzY4PiBidWZmZXI7CisKKyAgICAvLyBHZW5lcmF0ZSBhIHJhbmRvbSA0ayBidWZmZXIgb2YgY2hhcmFjdGVycworICAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbihTRUVEX05VTUJFUik7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiBkaXN0cmlidXRpb24oMCwgMTApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGJ1ZmZlcltpXSA9IHN0YXRpY19jYXN0PGNoYXI+KGRpc3RyaWJ1dGlvbihnZW4pKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8ZG91YmxlLCBzdGQ6OnN0cmluZz4+IGxhdGVuY2llczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8ZG91YmxlLCBzdGQ6OnN0cmluZz4+IHJhdGlvczsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcHJlc3NvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBjb21wcmVzc2VkX2RhdGEgPQorICAgICAgICAgICAgICAgIGNvbXByZXNzb3JzW2ldLT5Db21wcmVzcyhidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgY29uc3QgYXV0byBlbmQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXRlbmN5ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM+KGVuZCAtIHN0YXJ0KSAvIDEwMDAuMDsKKyAgICAgICAgY29uc3QgZG91YmxlIGNvbXByZXNzaW9uX3JhdGlvID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY29tcHJlc3NlZF9kYXRhLnNpemUoKSkgKiAxLjAwIC8gYnVmZmVyLnNpemUoKTsKKworICAgICAgICBzdGQ6OmNvdXQgPDwgIk1ldHJpY3MgZm9yICIgPDwgQ29tcHJlc3Npb25Ub1N0cmluZyhjb21wcmVzc2lvbl9saXN0W2ldKSA8PCAiOiBsYXRlbmN5IC0+ICIKKyAgICAgICAgICAgICAgICAgIDw8IGxhdGVuY3kuY291bnQoKSA8PCAibXMgIgorICAgICAgICAgICAgICAgICAgPDwgIiBjb21wcmVzc2lvbiByYXRpbyAtPiIgPDwgY29tcHJlc3Npb25fcmF0aW8gPDwgIiBcbiI7CisKKyAgICAgICAgbGF0ZW5jaWVzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihsYXRlbmN5LmNvdW50KCksIENvbXByZXNzaW9uVG9TdHJpbmcoY29tcHJlc3Npb25fbGlzdFtpXSkpKTsKKyAgICAgICAgcmF0aW9zLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihjb21wcmVzc2lvbl9yYXRpbywgQ29tcHJlc3Npb25Ub1N0cmluZyhjb21wcmVzc2lvbl9saXN0W2ldKSkpOworICAgIH0KKworICAgIGludCBiZXN0X3NwZWVkID0gMDsKKyAgICBpbnQgYmVzdF9yYXRpbyA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGxhdGVuY2llcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobGF0ZW5jaWVzW2ldLmZpcnN0IDwgbGF0ZW5jaWVzW2Jlc3Rfc3BlZWRdLmZpcnN0KSB7CisgICAgICAgICAgICBiZXN0X3NwZWVkID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmF0aW9zW2ldLmZpcnN0IDwgcmF0aW9zW2Jlc3RfcmF0aW9dLmZpcnN0KSB7CisgICAgICAgICAgICBiZXN0X3JhdGlvID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiQkVTVCBTUEVFRDogIiA8PCBsYXRlbmNpZXNbYmVzdF9zcGVlZF0uZmlyc3QgPDwgIm1zICIKKyAgICAgICAgICAgICAgPDwgbGF0ZW5jaWVzW2Jlc3Rfc3BlZWRdLnNlY29uZCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAiQkVTVCBSQVRJTzogIiA8PCByYXRpb3NbYmVzdF9yYXRpb10uZmlyc3QgPDwgIiAiIDw8IHJhdGlvc1tiZXN0X3JhdGlvXS5zZWNvbmQKKyAgICAgICAgICAgICAgPDwgIlxuIjsKK30KKwordm9pZCBJbmNyZW1lbnRhbENvbXByZXNzaW9uVGVzdCgpIHsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuLS0tLS0tLUluY3JlbWVudGFsIENvbXByZXNzb3IgUGVyZiBBbmFseXNpcy0tLS0tLS1cbiI7CisKKyAgICBzdGQ6OnZlY3RvcjxDb3dDb21wcmVzc2lvbj4gY29tcHJlc3Npb25fbGlzdCA9IHsKKyAgICAgICAgICAgIHtrQ293Q29tcHJlc3NMejQsIDB9LCAgICAge2tDb3dDb21wcmVzc0Jyb3RsaSwgMX0sIHtrQ293Q29tcHJlc3NCcm90bGksIDN9LAorICAgICAgICAgICAge2tDb3dDb21wcmVzc0Jyb3RsaSwgMTF9LCB7a0Nvd0NvbXByZXNzWnN0ZCwgM30sICAge2tDb3dDb21wcmVzc1pzdGQsIDZ9LAorICAgICAgICAgICAge2tDb3dDb21wcmVzc1pzdGQsIDl9LCAgICB7a0Nvd0NvbXByZXNzWnN0ZCwgMjJ9LCAge2tDb3dDb21wcmVzc0d6LCAxfSwKKyAgICAgICAgICAgIHtrQ293Q29tcHJlc3NHeiwgM30sICAgICAge2tDb3dDb21wcmVzc0d6LCA2fSwgICAgIHtrQ293Q29tcHJlc3NHeiwgOX19OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJQ29tcHJlc3Nvcj4+IGNvbXByZXNzb3JzOworICAgIGZvciAoYXV0byBpIDogY29tcHJlc3Npb25fbGlzdCkgeworICAgICAgICBjb21wcmVzc29ycy5lbXBsYWNlX2JhY2soSUNvbXByZXNzb3I6OkNyZWF0ZShpLCBCTE9DS19TWikpOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGEgYnVmZmVyIG9mIHNpemUgOCBibG9ja3MuCisgICAgc3RkOjphcnJheTxjaGFyLCAzMjc2OD4gYnVmZmVyOworCisgICAgLy8gR2VuZXJhdGUgYSByYW5kb20gNGsgYnVmZmVyIG9mIGNoYXJhY3RlcnMKKyAgICBzdGQ6OmRlZmF1bHRfcmFuZG9tX2VuZ2luZSBnZW4oU0VFRF9OVU1CRVIpOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gZGlzdHJpYnV0aW9uKDAsIDEwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZmZlci5zaXplKCk7IGkrKykgeworICAgICAgICBidWZmZXJbaV0gPSBzdGF0aWNfY2FzdDxjaGFyPihkaXN0cmlidXRpb24oZ2VuKSk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGRvdWJsZSwgc3RkOjpzdHJpbmc+PiBsYXRlbmNpZXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGRvdWJsZSwgc3RkOjpzdHJpbmc+PiByYXRpb3M7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXByZXNzb3JzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+PiBjb21wcmVzc2VkX2RhdGFfdmVjOworICAgICAgICBpbnQgbnVtX2Jsb2NrcyA9IGJ1ZmZlci5zaXplKCkgLyBCTE9DS19TWjsKKyAgICAgICAgY29uc3QgdWludDhfdCogaXRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlci5kYXRhKCkpOworCisgICAgICAgIGNvbnN0IGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICAgICAgd2hpbGUgKG51bV9ibG9ja3MgPiAwKSB7CisgICAgICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBjb21wcmVzc2VkX2RhdGEgPSBjb21wcmVzc29yc1tpXS0+Q29tcHJlc3MoaXRlciwgQkxPQ0tfU1opOworICAgICAgICAgICAgY29tcHJlc3NlZF9kYXRhX3ZlYy5lbXBsYWNlX2JhY2soY29tcHJlc3NlZF9kYXRhKTsKKyAgICAgICAgICAgIG51bV9ibG9ja3MtLTsKKyAgICAgICAgICAgIGl0ZXIgKz0gQkxPQ0tfU1o7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgICBjb25zdCBhdXRvIGxhdGVuY3kgPQorICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcz4oZW5kIC0gc3RhcnQpIC8gMTAwMC4wOworCisgICAgICAgIHNpemVfdCBzaXplID0gMDsKKyAgICAgICAgZm9yIChhdXRvJiBpIDogY29tcHJlc3NlZF9kYXRhX3ZlYykgeworICAgICAgICAgICAgc2l6ZSArPSBpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBkb3VibGUgY29tcHJlc3Npb25fcmF0aW8gPSBzaXplICogMS4wMCAvIGJ1ZmZlci5zaXplKCk7CisKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJNZXRyaWNzIGZvciAiIDw8IENvbXByZXNzaW9uVG9TdHJpbmcoY29tcHJlc3Npb25fbGlzdFtpXSkgPDwgIjogbGF0ZW5jeSAtPiAiCisgICAgICAgICAgICAgICAgICA8PCBsYXRlbmN5LmNvdW50KCkgPDwgIm1zICIKKyAgICAgICAgICAgICAgICAgIDw8ICIgY29tcHJlc3Npb24gcmF0aW8gLT4iIDw8IGNvbXByZXNzaW9uX3JhdGlvIDw8ICIgXG4iOworCisgICAgICAgIGxhdGVuY2llcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIobGF0ZW5jeS5jb3VudCgpLCBDb21wcmVzc2lvblRvU3RyaW5nKGNvbXByZXNzaW9uX2xpc3RbaV0pKSk7CisgICAgICAgIHJhdGlvcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoY29tcHJlc3Npb25fcmF0aW8sIENvbXByZXNzaW9uVG9TdHJpbmcoY29tcHJlc3Npb25fbGlzdFtpXSkpKTsKKyAgICB9CisKKyAgICBpbnQgYmVzdF9zcGVlZCA9IDA7CisgICAgaW50IGJlc3RfcmF0aW8gPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBsYXRlbmNpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGxhdGVuY2llc1tpXS5maXJzdCA8IGxhdGVuY2llc1tiZXN0X3NwZWVkXS5maXJzdCkgeworICAgICAgICAgICAgYmVzdF9zcGVlZCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJhdGlvc1tpXS5maXJzdCA8IHJhdGlvc1tiZXN0X3JhdGlvXS5maXJzdCkgeworICAgICAgICAgICAgYmVzdF9yYXRpbyA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIkJFU1QgU1BFRUQ6ICIgPDwgbGF0ZW5jaWVzW2Jlc3Rfc3BlZWRdLmZpcnN0IDw8ICJtcyAiCisgICAgICAgICAgICAgIDw8IGxhdGVuY2llc1tiZXN0X3NwZWVkXS5zZWNvbmQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIkJFU1QgUkFUSU86ICIgPDwgcmF0aW9zW2Jlc3RfcmF0aW9dLmZpcnN0IDw8ICIgIiA8PCByYXRpb3NbYmVzdF9yYXRpb10uc2Vjb25kCisgICAgICAgICAgICAgIDw8ICJcbiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oKSB7CisgICAgYW5kcm9pZDo6c25hcHNob3Q6Ok9uZVNob3RDb21wcmVzc2lvblRlc3QoKTsKKyAgICBhbmRyb2lkOjpzbmFwc2hvdDo6SW5jcmVtZW50YWxDb21wcmVzc2lvblRlc3QoKTsKKworICAgIHJldHVybiAwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC90b29scy90ZXN0ZGF0YS9jb3dfdjIgYi9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvdGVzdGRhdGEvY293X3YyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzdkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvdGVzdGRhdGEvY293X3YyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC90b29scy90ZXN0ZGF0YS9pbmNvbXByZXNzaWJsZV9ibG9jayBiL2ZzX21nci9saWJzbmFwc2hvdC90b29scy90ZXN0ZGF0YS9pbmNvbXByZXNzaWJsZV9ibG9jawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzQ1Y2QwCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL3Rlc3RkYXRhL2luY29tcHJlc3NpYmxlX2Jsb2NrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC90b29scy93cml0ZV9jb3cuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL3dyaXRlX2Nvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1MTE3NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC90b29scy93cml0ZV9jb3cuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfY29tcHJlc3MuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3dyaXRlci5oPgorCisjaW5jbHVkZSA8Z2ZsYWdzL2dmbGFncy5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIgorCitERUZJTkVfYm9vbChzaWxlbnQsIGZhbHNlLCAiUnVuIHNpbGVudGx5Iik7CitERUZJTkVfaW50MzIod3JpdGVyX3ZlcnNpb24sIDIsICJ3aGljaCB2ZXJzaW9uIG9mIENPVyB3cml0ZXIgdG8gYmUgdXNlZCIpOworREVGSU5FX2Jvb2wod3JpdGVfbGVnYWN5LCBmYWxzZSwKKyAgICAgICAgICAgICJXcml0ZXMgYSBsZWdhY3kgY293X3YyIGluIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGlzIGNvdyB3YXMgdXNlZCB0byB0ZXN0IGJhY2t3YXJkcyAiCisgICAgICAgICAgICAiY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZlcnNpb24gMiBhbmQgdmVyc2lvbiAzIik7CitERUZJTkVfYm9vbCh3cml0ZV9oZWFkZXIsIGZhbHNlLCAiVGVzdCByZWFkaW5nL3dyaXRpbmcganVzdCB0aGUgaGVhZGVyIik7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c25hcHNob3Q7CisKKy8vIFRoaXMgd3JpdGVzIGEgc2ltcGxlIGNvdyB2MiBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gVGhpcyBmaWxlIHdpbGwgc2VydmUgYXMgdGVzdGRhdGEgZm9yCisvLyBlbnN1cmluZyBvdXIgdjMgY293IHJlYWRlciB3aWxsIGJlIGFibGUgdG8gcmVhZCBhIGNvdyBmaWxlIGNyZWF0ZWQgYnkgdGhlIHYyIHdyaXRlci4KKy8vCisvLyBXQVJOSU5HOiBXZSBzaG91bGQgbm90IGJlIG92ZXJyaWRpbmcgdGhpcyB0ZXN0IGZpbGUsIGFzIGl0IHdpbGwgc2VydmUgYXMgaGlzdG9yaWMgbWFya2VyIGZvciB3aGF0CisvLyBhIGRldmljZSB3aXRoIG9sZCB3cml0ZXJfdjIgd2lsbCB3cml0ZSBhcyBhIGNvdy4KK3N0YXRpYyB2b2lkIHdyaXRlX2xlZ2FjeV9jb3dfdjIoKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSA1OworICAgIG9wdGlvbnMubnVtX21lcmdlX29wcyA9IDE7CisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIGNoYXIgY3dkX2J1ZmZlclsxMDI0XTsKKyAgICBzaXplX3QgY3dkX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGN3ZF9idWZmZXIpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHBhdGguCisgICAgY2hhciogZXJyID0gZ2V0Y3dkKGN3ZF9idWZmZXIsIGN3ZF9idWZmZXJfc2l6ZSk7CisgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGRuJ3QgZ2V0IGN1cnJlbnQgZGlyZWN0b3J5IjsKKyAgICB9CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKG9wZW4oc3RyY2F0KGN3ZF9idWZmZXIsICIvY293X3YyIiksIE9fQ1JFQVQgfCBPX1JEV1IsIDA2NjYpKTsKKyAgICBpZiAoZmQuZ2V0KCkgPT0gLTEpIHsKKyAgICAgICAgTE9HKEZBVEFMKSA8PCAiY291bGRuJ3Qgb3BlbiB0bXBfY293IjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigyLCBvcHRpb25zLCBzdGQ6Om1vdmUoZmQpKTsKKyAgICB3cml0ZXItPkFkZENvcHkoMCwgNSk7CisgICAgd3JpdGVyLT5BZGRSYXdCbG9ja3MoMiwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICB3cml0ZXItPkFkZExhYmVsKDEpOworICAgIHdyaXRlci0+QWRkWG9yQmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDI0LCAxMCk7CisgICAgd3JpdGVyLT5BZGRaZXJvQmxvY2tzKDUsIDEwKTsKKyAgICB3cml0ZXItPkFkZExhYmVsKDIpOworICAgIHdyaXRlci0+RmluYWxpemUoKTsKK30KKworc3RhdGljIGJvb2wgV3JpdGVDb3coY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQob3BlbihwYXRoLmNfc3RyKCksIE9fUkRPTkxZKSk7CisgICAgZmQucmVzZXQob3BlbihwYXRoLmNfc3RyKCksIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY0KSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiY291bGQgbm90IG9wZW4gIiA8PCBwYXRoIDw8ICIgZm9yIHdyaXRpbmciOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IHdyaXRlciA9CisgICAgICAgICAgICBDcmVhdGVDb3dXcml0ZXIoRkxBR1Nfd3JpdGVyX3ZlcnNpb24sIG9wdGlvbnMsIHN0ZDo6bW92ZShmZCkpOworICAgIGlmICghd3JpdGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB3cml0ZXItPkFkZENvcHkoMCwgNSk7CisgICAgd3JpdGVyLT5BZGRSYXdCbG9ja3MoMiwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICB3cml0ZXItPkFkZExhYmVsKDEpOworICAgIHdyaXRlci0+QWRkWG9yQmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDI0LCAxMCk7CisgICAgd3JpdGVyLT5BZGRaZXJvQmxvY2tzKDUsIDEwKTsKKyAgICB3cml0ZXItPkFkZExhYmVsKDIpOworICAgIHdyaXRlci0+RmluYWxpemUoKTsKKworICAgIGlmICghRkxBR1Nfc2lsZW50KSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiV3JpdGluZyBDT1cgd2l0aCB3cml0ZXIgdiIgPDwgRkxBR1Nfd3JpdGVyX3ZlcnNpb24gPDwgIlxuIjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ2ZsYWdzOjpQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoJmFyZ2MsICZhcmd2LCB0cnVlKTsKKyAgICBpZiAoRkxBR1Nfd3JpdGVfbGVnYWN5KSB7CisgICAgICAgIHdyaXRlX2xlZ2FjeV9jb3dfdjIoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICBnZmxhZ3M6OlNob3dVc2FnZVdpdGhGbGFncyhhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghV3JpdGVDb3coYXJndlsxXSkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL3Rlc3RzL0FuZHJvaWQuYnAgYi9mc19tZ3IvdGVzdHMvQW5kcm9pZC5icAppbmRleCBiOWJhZTI1Li4yYWViYTBhIDEwMDY0NAotLS0gYS9mc19tZ3IvdGVzdHMvQW5kcm9pZC5icAorKysgYi9mc19tZ3IvdGVzdHMvQW5kcm9pZC5icApAQCAtMzgsNyArMzgsOCBAQAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmZzX21nciIsCi0gICAgICAgICJsaWJmc3RhYiIsCisgICAgICAgICJsaWJnbW9jayIsCisgICAgICAgICJsaWJndGVzdCIsCiAgICAgXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJmaWxlX3dhaXRfdGVzdC5jcHAiLApAQCAtMTA5LDcgKzExMCw2IEBACiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliZnNfbWdyIiwKLSAgICAgICAgImxpYmZzdGFiIiwKICAgICAgICAgImxpYmdtb2NrIiwKICAgICAgICAgImxpYmd0ZXN0IiwKICAgICBdLApkaWZmIC0tZ2l0IGEvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2ggYi9mc19tZ3IvdGVzdHMvYWRiLXJlbW91bnQtdGVzdC5zaAppbmRleCBjODdlNTY0Li43YWM3YTE2IDEwMDc1NQotLS0gYS9mc19tZ3IvdGVzdHMvYWRiLXJlbW91bnQtdGVzdC5zaAorKysgYi9mc19tZ3IvdGVzdHMvYWRiLXJlbW91bnQtdGVzdC5zaApAQCAtMTIzMyw2ICsxMjMzLDEyIEBACiBhZGJfc2ggZ3JlcCAtcSAiIC92ZW5kb3IgW14gXSogcncsIiAvcHJvYy9tb3VudHMgPC9kZXYvbnVsbCAmJgogICBkaWUgIi92ZW5kb3IgaXMgbm90IFJPIgogCitkYXRhX2RldmljZT0kKGFkYl9zaCBhd2sgJyQyID09ICIvZGF0YSIgeyBwcmludCAkMTsgZXhpdCB9JyAvcHJvYy9tb3VudHMpCitSTz0kKGFkYl9zaCBncmVwICIgcm8sIiAvcHJvYy9tb3VudHMgPC9kZXYvbnVsbCB8CisgICAgZ3JlcCAtdiAiXiR7ZGF0YV9kZXZpY2V9IiB8CisgICAgc2tpcF9hZG1pbmlzdHJhdGl2ZV9tb3VudHMgfAorICAgIGF3ayAneyBwcmludCAkMSB9JykKKwogVD0kKGFkYl9kYXRlKQogYWRiIHJlbW91bnQgPiYyIHx8CiAgIGRpZSAtdCAiJHtUfSIgImFkYiByZW1vdW50IgpAQCAtMTI0MSw2ICsxMjQ3LDEyIEBACiBhZGJfc2ggZ3JlcCAtcSAiIC92ZW5kb3IgW14gXSogcncsIiAvcHJvYy9tb3VudHMgPC9kZXYvbnVsbCB8fAogICBkaWUgLXQgIiR7VH0iICIvdmVuZG9yIGlzIG5vdCBSVyIKIAorIyBPbmx5IGZpbmQgbW91bnRzIHRoYXQgYXJlIHJlbW91bnRlZCBSTyAtPiBSVworUlc9JChhZGJfc2ggZ3JlcCAiIHJ3LCIgL3Byb2MvbW91bnRzIDwvZGV2L251bGwgfAorICAgIGdyZXAgLXYgIl4ke2RhdGFfZGV2aWNlfSIgfAorICAgIHNraXBfYWRtaW5pc3RyYXRpdmVfbW91bnRzIHwKKyAgICBncmVwIC1FICJeKCQoam9pbl93aXRoICd8JyAke1JPfSkpICIpCisKIHNjcmF0Y2hfb25fc3VwZXI9ZmFsc2UKIGlmICR7b3ZlcmxheWZzX25lZWRlZH07IHRoZW4KICAgaXNfb3ZlcmxheWZzX21vdW50ZWQgL3N5c3RlbSB8fApAQCAtMTI4NywyNyArMTI5OSwxOSBAQAogICAgIGZpCiAgIGRvbmUKIAotICBkYXRhX2RldmljZT0kKGFkYl9zaCBhd2sgJyQyID09ICIvZGF0YSIgeyBwcmludCAkMTsgZXhpdCB9JyAvcHJvYy9tb3VudHMpCiAgICMgS0lTUyAod2UgZG8gbm90IHN1cHBvcnQgc3ViLW1vdW50cyBmb3Igc3lzdGVtIHBhcnRpdGlvbnMgY3VycmVudGx5KQogICBhZGJfc2ggZ3JlcCAiXm92ZXJsYXkgIiAvcHJvYy9tb3VudHMgPC9kZXYvbnVsbCB8CiAgICAgZ3JlcCAtdkUgIl5vdmVybGF5LiogLyhhcGV4fHN5c3RlbXx2ZW5kb3IpL1teIF0iIHwKICAgICBncmVwICIgb3ZlcmxheSBybywiICYmCiAgICAgZGllICJleHBlY3RlZCBvdmVybGF5IHRvIGJlIFJXIGFmdGVyIHJlbW91bnQiCi0gIGFkYl9zaCBncmVwIC12IG5vYXRpbWUgL3Byb2MvbW91bnRzIDwvZGV2L251bGwgfAotICAgIGdyZXAgLXYgIl4ke2RhdGFfZGV2aWNlfSIgfAotICAgIHNraXBfYWRtaW5pc3RyYXRpdmVfbW91bnRzIHwKLSAgICBncmVwIC12ICcgcm8sJyAmJgotICAgIGRpZSAibW91bnRzIGFyZSBub3Qgbm9hdGltZSIKIAotICBEPSQoYWRiX3NoIGdyZXAgIiBydywiIC9wcm9jL21vdW50cyA8L2Rldi9udWxsIHwKLSAgICAgIGdyZXAgLXYgIl4ke2RhdGFfZGV2aWNlfSIgfAotICAgICAgc2tpcF9hZG1pbmlzdHJhdGl2ZV9tb3VudHMgfAorICBEPSQoZWNobyAiJHtSV30iIHwKICAgICAgIGF3ayAneyBwcmludCAkMSB9JyB8CiAgICAgICBzZWQgJ3N8L2Rldi9yb290fC98JyB8CiAgICAgICBzb3J0IC11KQogICBpZiBbIC1uICIke0R9IiBdOyB0aGVuCiAgICAgYWRiX3NoIGRmIC1rICR7RH0gPC9kZXYvbnVsbCB8Ci0gICAgICBzZWQgLWUgJ3MvXkZpbGVzeXN0ZW0gICAgICAvRmlsZXN5c3RlbSAocncpIC8nCisgICAgICBzZWQgLWUgJ3MvXkZpbGVzeXN0ZW0gICAgIC9GaWxlc3lzdGVtIChydykvJwogICBmaSA+JjIKICAgZm9yIGQgaW4gJHtEfTsgZG8KICAgICBpZiBhZGJfc2ggdHVuZTJmcyAtbCAiJHtkfSIgPC9kZXYvbnVsbCAyPiYxIHwgZ3JlcCAtcSAiRmlsZXN5c3RlbSBmZWF0dXJlczouKnNoYXJlZF9ibG9ja3MiIHx8CkBAIC0xMzE5LDYgKzEzMjMsMTAgQEAKICAgaXNfb3ZlcmxheWZzX21vdW50ZWQgJiYgZGllIC10ICIke1R9IiAidW5leHBlY3RlZCBvdmVybGF5IHRha2VvdmVyIgogZmkKIAorZWNobyAtbiAiJHtSV30iIHwKKyAgZ3JlcCAtdiBub2F0aW1lICYmCisgIGRpZSAibW91bnRzIChydykgYXJlIG5vdCBub2F0aW1lIgorCiBMT0cgT0sgImFkYiByZW1vdW50IFJXIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZnNfbWdyL3Rlc3RzL2ZzX21ncl90ZXN0LmNwcCBiL2ZzX21nci90ZXN0cy9mc19tZ3JfdGVzdC5jcHAKaW5kZXggZTMzNjgxYy4uMzIyYmYxYiAxMDA2NDQKLS0tIGEvZnNfbWdyL3Rlc3RzL2ZzX21ncl90ZXN0LmNwcAorKysgYi9mc19tZ3IvdGVzdHMvZnNfbWdyX3Rlc3QuY3BwCkBAIC0yOSwxMSArMjksMTMgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGZzX21nci5oPgogI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSAiLi4vZnNfbWdyX3ByaXZfYm9vdF9jb25maWcuaCIKKyNpbmNsdWRlICIuLi9mc19tZ3JfcHJpdi5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZnNfbWdyOwordXNpbmcgbmFtZXNwYWNlIHRlc3Rpbmc7CiAKIG5hbWVzcGFjZSB7CiAKQEAgLTExOSwzNyArMTIxLDQyIEBACiAgICAgICAgIHsidGVybWluYXRvciIsICJ0cnVuY2F0ZWQifSwKIH07CiAKLWNvbnN0IHN0ZDo6c3RyaW5nIGJvb3Rjb25maWcgPQotICAgICAgICAiYW5kcm9pZGJvb3QuYm9vdGRldmljZSA9IFwiMWQ4NDAwMC51ZnNoY1wiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5ib290X2RldmljZXMgPSBcImRldjFcIiwgXCJkZXYyLHdpdGhjb21tYVwiLCBcImRldjNcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuYmFzZWJhbmQgPSBcInNkeVwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5rZXltYXN0ZXIgPSBcIjFcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3Quc2VyaWFsbm8gPSBcIkJMQUhCTEFIQkxBSFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeCA9IFwiX2FcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmUucGxhdGZvcm0gPSBcInNkdzgxM1wiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5oYXJkd2FyZSA9IFwiZm9vXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnJldmlzaW9uID0gXCJFVlQxLjBcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuYm9vdGxvYWRlciA9IFwiYnVycC0wLjEtNzUyMVwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5oYXJkd2FyZS5za3UgPSBcIm1hcnlcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmUucmFkaW8uc3VidHlwZSA9IFwiMFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5kdGJvX2lkeCA9IFwiMlwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5tb2RlID0gXCJub3JtYWxcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmUuZGRyID0gXCIxR0IsY29tYnVjaGksTFBERFI0WFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5kZHJfaW5mbyA9IFwiY29tYnVjaGlhbmRyb2lkYm9vdC5kZHJfc2l6ZT0yR0JcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmUudWZzID0gXCIyR0IsY29tYnVzaGlcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuYm9vdHRpbWUgPSBcIjBCTEU6NTgsMUJMTDoyMiwxQkxFOjU3MSwyQkxMOjEwNSxPRFQ6MCxBVkI6MTIzXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnJhbWR1bXAgPSBcImRpc2FibGVkXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnZibWV0YS5kZXZpY2UgPSBcIlBBUlRVVUlEPWFhMDhmMWE0LWM3YzktNDAyZS05YTY2LTk3MDdjYWZhOWNlYlwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuYXZiX3ZlcnNpb24gPSBcIjEuMVwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlX3N0YXRlID0gXCJ1bmxvY2tlZFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuaGFzaF9hbGcgPSBcInNoYTI1NlwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuc2l6ZSA9IFwiNTI0OFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGlnZXN0ID0gXCIiCi0gICAgICAgICJhYzEzMTQ3ZTk1OTg2MWMyMGYyYTZkYTk3ZDI1ZmU3OWU2MGU5MDJjMDIyYTM3MWM1YzAzOWQzMWU3YzY4ODYwXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnZibWV0YS5pbnZhbGlkYXRlX29uX2Vycm9yID0gXCJ5ZXNcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QudmVyaXR5bW9kZSA9IFwiZW5mb3JjaW5nXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnZlcmlmaWVkYm9vdHN0YXRlID0gXCJvcmFuZ2VcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3Quc3BhY2UgPSBcInNoYTI1NiA1MjQ4IGFuZHJvaWRib290Lm5vc3BhY2UgPSBub3BlXCJcbiI7Citjb25zdCBzdGQ6OnN0cmluZyBib290Y29uZmlnID0gUiIoCithbmRyb2lkYm9vdC5ib290ZGV2aWNlID0gIjFkODQwMDAudWZzaGMiCithbmRyb2lkYm9vdC5ib290X2RldmljZXMgPSAiZGV2MSIsICJkZXYyLHdpdGhjb21tYSIsICJkZXYzIgorYW5kcm9pZGJvb3QuYmFzZWJhbmQgPSAic2R5IgorYW5kcm9pZGJvb3Qua2V5bWFzdGVyID0gIjEiCithbmRyb2lkYm9vdC5zZXJpYWxubyA9ICJCTEFIQkxBSEJMQUgiCithbmRyb2lkYm9vdC5zbG90X3N1ZmZpeCA9ICJfYSIKK2FuZHJvaWRib290LmhhcmR3YXJlLnBsYXRmb3JtID0gInNkdzgxMyIKK2FuZHJvaWRib290LmhhcmR3YXJlID0gImZvbyIKK2FuZHJvaWRib290LnJldmlzaW9uID0gIkVWVDEuMCIKK2FuZHJvaWRib290LmJvb3Rsb2FkZXIgPSAiYnVycC0wLjEtNzUyMSIKK2FuZHJvaWRib290LmhhcmR3YXJlLnNrdSA9ICJtYXJ5IgorYW5kcm9pZGJvb3QuaGFyZHdhcmUucmFkaW8uc3VidHlwZSA9ICIwIgorYW5kcm9pZGJvb3QuZHRib19pZHggPSAiMiIKK2FuZHJvaWRib290Lm1vZGUgPSAibm9ybWFsIgorYW5kcm9pZGJvb3QuaGFyZHdhcmUuZGRyID0gIjFHQixjb21idWNoaSxMUEREUjRYIgorYW5kcm9pZGJvb3QuZGRyX2luZm8gPSAiY29tYnVjaGlhbmRyb2lkYm9vdC5kZHJfc2l6ZT0yR0IiCithbmRyb2lkYm9vdC5oYXJkd2FyZS51ZnMgPSAiMkdCLGNvbWJ1c2hpIgorYW5kcm9pZGJvb3QuYm9vdHRpbWUgPSAiMEJMRTo1OCwxQkxMOjIyLDFCTEU6NTcxLDJCTEw6MTA1LE9EVDowLEFWQjoxMjMiCithbmRyb2lkYm9vdC5yYW1kdW1wID0gImRpc2FibGVkIgorYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZSA9ICJQQVJUVVVJRD1hYTA4ZjFhNC1jN2M5LTQwMmUtOWE2Ni05NzA3Y2FmYTljZWIiCithbmRyb2lkYm9vdC52Ym1ldGEuYXZiX3ZlcnNpb24gPSAiMS4xIgorYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZV9zdGF0ZSA9ICJ1bmxvY2tlZCIKK2FuZHJvaWRib290LnZibWV0YS5oYXNoX2FsZyA9ICJzaGEyNTYiCithbmRyb2lkYm9vdC52Ym1ldGEuc2l6ZSA9ICI1MjQ4IgorYW5kcm9pZGJvb3QudmJtZXRhLmRpZ2VzdCA9ICJhYzEzMTQ3ZTk1OTg2MWMyMGYyYTZkYTk3ZDI1ZmU3OWU2MGU5MDJjMDIyYTM3MWM1YzAzOWQzMWU3YzY4ODYwIgorYW5kcm9pZGJvb3QudmJtZXRhLmludmFsaWRhdGVfb25fZXJyb3IgPSAieWVzIgorYW5kcm9pZGJvb3QudmVyaXR5bW9kZSA9ICJlbmZvcmNpbmciCithbmRyb2lkYm9vdC52ZXJpZmllZGJvb3RzdGF0ZSA9ICJvcmFuZ2UiCithbmRyb2lkYm9vdC5zcGFjZSA9ICJzaGEyNTYgNTI0OCBhbmRyb2lkYm9vdC5ub3NwYWNlID0gbm9wZSIKK2p1c3Qua2V5CitrZXkuZW1wdHkudmFsdWUgPQorZGVzc2VydC52YWx1ZSA9ICJpY2UsIGNyZWFtIgorZGVzc2VydC5saXN0ID0gImljZSIsICJjcmVhbSIKK2FtYmlndW91cy5saXN0ID0gIiwgIiwgIiwgIgorKSI7CiAKIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBib290Y29uZmlnX3Jlc3VsdF9zcGFjZSA9IHsKICAgICAgICAgeyJhbmRyb2lkYm9vdC5ib290ZGV2aWNlIiwgIjFkODQwMDAudWZzaGMifSwKQEAgLTE4Miw2ICsxODksMTEgQEAKICAgICAgICAgeyJhbmRyb2lkYm9vdC52ZXJpdHltb2RlIiwgImVuZm9yY2luZyJ9LAogICAgICAgICB7ImFuZHJvaWRib290LnZlcmlmaWVkYm9vdHN0YXRlIiwgIm9yYW5nZSJ9LAogICAgICAgICB7ImFuZHJvaWRib290LnNwYWNlIiwgInNoYTI1NiA1MjQ4IGFuZHJvaWRib290Lm5vc3BhY2UgPSBub3BlIn0sCisgICAgICAgIHsianVzdC5rZXkiLCAiIn0sCisgICAgICAgIHsia2V5LmVtcHR5LnZhbHVlIiwgIiJ9LAorICAgICAgICB7ImRlc3NlcnQudmFsdWUiLCAiaWNlLCBjcmVhbSJ9LAorICAgICAgICB7ImRlc3NlcnQubGlzdCIsICJpY2UsY3JlYW0ifSwKKyAgICAgICAgeyJhbWJpZ3VvdXMubGlzdCIsICIsICwsICJ9LAogfTsKIAogYm9vbCBDb21wYXJlRmxhZ3MoRnN0YWJFbnRyeTo6RnNNZ3JGbGFncyYgbGhzLCBGc3RhYkVudHJ5OjpGc01nckZsYWdzJiByaHMpIHsKQEAgLTIxMiw0NCArMjI0LDYxIEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1URVNUKGZzX21nciwgZnNfbWdyX3BhcnNlX2NtZGxpbmUpIHsKLSAgICBFWFBFQ1RfRVEocmVzdWx0X3NwYWNlLCBmc19tZ3JfcGFyc2VfY21kbGluZShjbWRsaW5lKSk7CitURVNUKGZzX21nciwgSW1wb3J0S2VybmVsQ21kbGluZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiByZXN1bHQ7CisgICAgSW1wb3J0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoCisgICAgICAgICAgICBjbWRsaW5lLCBbJl0oc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgeyByZXN1bHQuZW1wbGFjZV9iYWNrKGtleSwgdmFsdWUpOyB9KTsKKyAgICBFWFBFQ1RfVEhBVChyZXN1bHQsIENvbnRhaW5lckVxKHJlc3VsdF9zcGFjZSkpOwogfQogCi1URVNUKGZzX21nciwgZnNfbWdyX2dldF9ib290X2NvbmZpZ19mcm9tX2tlcm5lbF9jbWRsaW5lKSB7CitURVNUKGZzX21nciwgR2V0S2VybmVsQ21kbGluZSkgewogICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHJlc3VsdF9zcGFjZSkgewotICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgYW5kcm9pZGJvb3RbXSA9ICJhbmRyb2lkYm9vdC4iOwotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZW50cnkuZmlyc3QsIGFuZHJvaWRib290KSkgY29udGludWU7Ci0gICAgICAgIGF1dG8ga2V5ID0gZW50cnkuZmlyc3Quc3Vic3RyKHN0cmxlbihhbmRyb2lkYm9vdCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsKGNtZGxpbmUsIGtleSwgJmNvbnRlbnQpKSA8PCAiIGZvciAiIDw8IGtleTsKLSAgICAgICAgRVhQRUNUX0VRKGVudHJ5LnNlY29uZCwgY29udGVudCk7Ci0gICAgfQotICAgIEVYUEVDVF9GQUxTRShmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsKGNtZGxpbmUsICJ2Ym1ldGEuYXZiX3ZlcnNpbyIsICZjb250ZW50KSk7Ci0gICAgRVhQRUNUX1RSVUUoY29udGVudC5lbXB0eSgpKSA8PCBjb250ZW50OwotICAgIEVYUEVDVF9GQUxTRShmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsKGNtZGxpbmUsICJub3NwYWNlIiwgJmNvbnRlbnQpKTsKLSAgICBFWFBFQ1RfVFJVRShjb250ZW50LmVtcHR5KCkpIDw8IGNvbnRlbnQ7Ci19Ci0KLVRFU1QoZnNfbWdyLCBmc19tZ3JfcGFyc2VfYm9vdGNvbmZpZykgewotICAgIEVYUEVDVF9FUShib290Y29uZmlnX3Jlc3VsdF9zcGFjZSwgZnNfbWdyX3BhcnNlX3Byb2NfYm9vdGNvbmZpZyhib290Y29uZmlnKSk7Ci19Ci0KLVRFU1QoZnNfbWdyLCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZykgewotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGJvb3Rjb25maWdfcmVzdWx0X3NwYWNlKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBhbmRyb2lkYm9vdFtdID0gImFuZHJvaWRib290LiI7Ci0gICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChlbnRyeS5maXJzdCwgYW5kcm9pZGJvb3QpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byBrZXkgPSBlbnRyeS5maXJzdC5zdWJzdHIoc3RybGVuKGFuZHJvaWRib290KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnKGJvb3Rjb25maWcsIGtleSwgJmNvbnRlbnQpKQotICAgICAgICAgICAgICAgIDw8ICIgZm9yICIgPDwga2V5OwotICAgICAgICBFWFBFQ1RfRVEoZW50cnkuc2Vjb25kLCBjb250ZW50KTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIFtrZXksIHZhbHVlXSA6IHJlc3VsdF9zcGFjZSkgeworICAgICAgICBFWFBFQ1RfVFJVRShHZXRLZXJuZWxDbWRsaW5lRnJvbVN0cmluZyhjbWRsaW5lLCBrZXksICZjb250ZW50KSkgPDwgIiBmb3IgIiA8PCBrZXk7CisgICAgICAgIEVYUEVDVF9FUShjb250ZW50LCB2YWx1ZSk7CiAgICAgfQogCi0gICAgRVhQRUNUX0ZBTFNFKGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnKGJvb3Rjb25maWcsICJ2Ym1ldGEuYXZiX3ZlcnNpbyIsICZjb250ZW50KSk7Ci0gICAgRVhQRUNUX1RSVUUoY29udGVudC5lbXB0eSgpKSA8PCBjb250ZW50OwotICAgIEVYUEVDVF9GQUxTRShmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZyhib290Y29uZmlnLCAibm9zcGFjZSIsICZjb250ZW50KSk7Ci0gICAgRVhQRUNUX1RSVUUoY29udGVudC5lbXB0eSgpKSA8PCBjb250ZW50OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtVbm1vZGlmaWVkVG9rZW4gPSAiPFVOTU9ESUZJRUQ+IjsKKyAgICBjb250ZW50ID0ga1VubW9kaWZpZWRUb2tlbjsKKyAgICBFWFBFQ1RfRkFMU0UoR2V0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoY21kbGluZSwgIiIsICZjb250ZW50KSk7CisgICAgRVhQRUNUX0VRKGNvbnRlbnQsIGtVbm1vZGlmaWVkVG9rZW4pIDw8ICJvdXRwdXQgcGFyYW1ldGVyIHNob3VsZG4ndCBiZSBvdmVycmlkZGVuIjsKKworICAgIGNvbnRlbnQgPSBrVW5tb2RpZmllZFRva2VuOworICAgIEVYUEVDVF9GQUxTRShHZXRLZXJuZWxDbWRsaW5lRnJvbVN0cmluZyhjbWRsaW5lLCAiYW5kcm9pZGJvb3QudmJtZXRhLmF2Yl92ZXJzaW8iLCAmY29udGVudCkpOworICAgIEVYUEVDVF9FUShjb250ZW50LCBrVW5tb2RpZmllZFRva2VuKSA8PCAib3V0cHV0IHBhcmFtZXRlciBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiI7CisKKyAgICBjb250ZW50ID0ga1VubW9kaWZpZWRUb2tlbjsKKyAgICBFWFBFQ1RfRkFMU0UoR2V0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoYm9vdGNvbmZpZywgImFuZHJvaWRib290Lm5vc3BhY2UiLCAmY29udGVudCkpOworICAgIEVYUEVDVF9FUShjb250ZW50LCBrVW5tb2RpZmllZFRva2VuKSA8PCAib3V0cHV0IHBhcmFtZXRlciBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiI7Cit9CisKK1RFU1QoZnNfbWdyLCBJbXBvcnRCb290Y29uZmlnKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHJlc3VsdDsKKyAgICBJbXBvcnRCb290Y29uZmlnRnJvbVN0cmluZyhib290Y29uZmlnLCBbJl0oc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXN1bHQuZW1wbGFjZV9iYWNrKGtleSwgdmFsdWUpOworICAgIH0pOworICAgIEVYUEVDVF9USEFUKHJlc3VsdCwgQ29udGFpbmVyRXEoYm9vdGNvbmZpZ19yZXN1bHRfc3BhY2UpKTsKK30KKworVEVTVChmc19tZ3IsIEdldEJvb3Rjb25maWcpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIGZvciAoY29uc3QgYXV0byYgW2tleSwgdmFsdWVdIDogYm9vdGNvbmZpZ19yZXN1bHRfc3BhY2UpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoYm9vdGNvbmZpZywga2V5LCAmY29udGVudCkpIDw8ICIgZm9yICIgPDwga2V5OworICAgICAgICBFWFBFQ1RfRVEoY29udGVudCwgdmFsdWUpOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtVbm1vZGlmaWVkVG9rZW4gPSAiPFVOTU9ESUZJRUQ+IjsKKyAgICBjb250ZW50ID0ga1VubW9kaWZpZWRUb2tlbjsKKyAgICBFWFBFQ1RfRkFMU0UoR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoYm9vdGNvbmZpZywgIiIsICZjb250ZW50KSk7CisgICAgRVhQRUNUX0VRKGNvbnRlbnQsIGtVbm1vZGlmaWVkVG9rZW4pIDw8ICJvdXRwdXQgcGFyYW1ldGVyIHNob3VsZG4ndCBiZSBvdmVycmlkZGVuIjsKKworICAgIGNvbnRlbnQgPSBrVW5tb2RpZmllZFRva2VuOworICAgIEVYUEVDVF9GQUxTRShHZXRCb290Y29uZmlnRnJvbVN0cmluZyhib290Y29uZmlnLCAiYW5kcm9pZGJvb3QudmJtZXRhLmF2Yl92ZXJzaW8iLCAmY29udGVudCkpOworICAgIEVYUEVDVF9FUShjb250ZW50LCBrVW5tb2RpZmllZFRva2VuKSA8PCAib3V0cHV0IHBhcmFtZXRlciBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiI7CisKKyAgICBjb250ZW50ID0ga1VubW9kaWZpZWRUb2tlbjsKKyAgICBFWFBFQ1RfRkFMU0UoR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoYm9vdGNvbmZpZywgImFuZHJvaWRib290Lm5vc3BhY2UiLCAmY29udGVudCkpOworICAgIEVYUEVDVF9FUShjb250ZW50LCBrVW5tb2RpZmllZFRva2VuKSA8PCAib3V0cHV0IHBhcmFtZXRlciBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiI7CiB9CiAKIFRFU1QoZnNfbWdyLCBmc19tZ3JfcmVhZF9mc3RhYl9maWxlX3Byb2NfbW91bnRzKSB7CkBAIC00OTcsNiArNTI2LDcgQEAKICAgICBFWFBFQ1RfRVEoIm5vbmUwIiwgZW50cnktPm1vdW50X3BvaW50KTsKICAgICB7CiAgICAgICAgIEZzdGFiRW50cnk6OkZzTWdyRmxhZ3MgZmxhZ3MgPSB7fTsKKyAgICAgICAgZmxhZ3MuZmlsZV9lbmNyeXB0aW9uID0gdHJ1ZTsKICAgICAgICAgRVhQRUNUX1RSVUUoQ29tcGFyZUZsYWdzKGZsYWdzLCBlbnRyeS0+ZnNfbWdyX2ZsYWdzKSk7CiAgICAgfQogICAgIEVYUEVDVF9FUSgiIiwgZW50cnktPm1ldGFkYXRhX2tleV9kaXIpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC90ZXN0cy92ZW5kb3JvdmVybGF5L1ZlbmRvck92ZXJsYXlIb3N0VGVzdC5qYXZhIGIvZnNfbWdyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC90ZXN0cy92ZW5kb3JvdmVybGF5L1ZlbmRvck92ZXJsYXlIb3N0VGVzdC5qYXZhCmluZGV4IGYwOGNhYjIuLjkxZjIzNWMgMTAwNjQ0Ci0tLSBhL2ZzX21nci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVzdHMvdmVuZG9yb3ZlcmxheS9WZW5kb3JPdmVybGF5SG9zdFRlc3QuamF2YQorKysgYi9mc19tZ3IvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Rlc3RzL3ZlbmRvcm92ZXJsYXkvVmVuZG9yT3ZlcmxheUhvc3RUZXN0LmphdmEKQEAgLTIxLDEwICsyMSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuanVuaXQ0LkJhc2VIb3N0SlVuaXQ0VGVzdDsKIGltcG9ydCBjb20uYW5kcm9pZC50cmFkZWZlZC51dGlsLkNvbW1hbmRSZXN1bHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5Db21tYW5kU3RhdHVzOwotCiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwpAQCAtMzgsOSArMzYsMTUgQEAKIEBSdW5XaXRoKERldmljZUpVbml0NENsYXNzUnVubmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFZlbmRvck92ZXJsYXlIb3N0VGVzdCBleHRlbmRzIEJhc2VIb3N0SlVuaXQ0VGVzdCB7CiAgIGJvb2xlYW4gd2FzUm9vdCA9IGZhbHNlOworICBTdHJpbmcgdm5ka1ZlcnNpb24gPSBudWxsOwogCiAgIEBCZWZvcmUKICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICB2bmRrVmVyc2lvbiA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbFYyQ29tbWFuZCgiZ2V0cHJvcCByby52bmRrLnZlcnNpb24iKS5nZXRTdGRvdXQoKTsKKyAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgKKyAgICAgICAgIlZlbmRvciBPdmVybGF5IGlzIGRpc2FibGVkIGZvciBWTkRLIGRlcHJlY2F0ZWQgZGV2aWNlcyIsCisgICAgICAgIHZuZGtWZXJzaW9uICE9IG51bGwgJiYgIXZuZGtWZXJzaW9uLnRyaW0oKS5pc0VtcHR5KCkpOworCiAgICAgd2FzUm9vdCA9IGdldERldmljZSgpLmlzQWRiUm9vdCgpOwogICAgIGlmICghd2FzUm9vdCkgewogICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlRlc3QgcmVxdWlyZXMgcm9vdCIsIGdldERldmljZSgpLmVuYWJsZUFkYlJvb3QoKSk7CkBAIC03NCw4ICs3OCw2IEBACiAgICAqLwogICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0VmVuZG9yT3ZlcmxheSgpIHRocm93cyBEZXZpY2VOb3RBdmFpbGFibGVFeGNlcHRpb24gewotICAgIFN0cmluZyB2bmRrVmVyc2lvbiA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbFYyQ29tbWFuZCgiZ2V0cHJvcCByby52bmRrLnZlcnNpb24iKS5nZXRTdGRvdXQoKTsKLQogICAgIC8vIENyZWF0ZSBmaWxlcyBhbmQgbW9kaWZ5IHBvbGljeQogICAgIENvbW1hbmRSZXN1bHQgcmVzdWx0ID0gZ2V0RGV2aWNlKCkuZXhlY3V0ZVNoZWxsVjJDb21tYW5kKAogICAgICAgICAiZWNobyAnLyhwcm9kdWN0fHN5c3RlbS9wcm9kdWN0KS92ZW5kb3Jfb3ZlcmxheS8iICsgdm5ka1ZlcnNpb24gKwpkaWZmIC0tZ2l0IGEvZnNfbWdyL3Rlc3RzL3Z0c19mc190ZXN0LmNwcCBiL2ZzX21nci90ZXN0cy92dHNfZnNfdGVzdC5jcHAKaW5kZXggYmYwMDNlZS4uOTUwMzA3MiAxMDA2NDQKLS0tIGEvZnNfbWdyL3Rlc3RzL3Z0c19mc190ZXN0LmNwcAorKysgYi9mc19tZ3IvdGVzdHMvdnRzX2ZzX3Rlc3QuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KICNpbmNsdWRlIDxsaWJkbS9kbS5oPgogCisjaW5jbHVkZSAiLi4vZnNfbWdyX3ByaXYuaCIKKwogdXNpbmcgdGVzdGluZzo6Q29udGFpbnM7CiB1c2luZyB0ZXN0aW5nOjpOb3Q7CiAKQEAgLTk3LDEyICs5OSw3IEBACiAgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6UmVhZGxpbmsoIi9kZXYvYmxvY2svYnktbmFtZS9zdXBlciIsICZzdXBlcl9iZGV2KSk7CiAgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6UmVhZGxpbmsoIi9kZXYvYmxvY2svYnktbmFtZS91c2VyZGF0YSIsICZ1c2VyZGF0YV9iZGV2KSk7CiAKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbXVzdF9iZV9mMmZzID0geyIvZGF0YSJ9OwotICAgIGlmICh2c3JfbGV2ZWwgPj0gX19BTkRST0lEX0FQSV9VX18gJiYKLSAgICAgICAgIURldmljZVN1cHBvcnRzRmVhdHVyZSgiYW5kcm9pZC5oYXJkd2FyZS50eXBlLmF1dG9tb3RpdmUiKSkgewotICAgICAgICBtdXN0X2JlX2YyZnMuZW1wbGFjZV9iYWNrKCIvbWV0YWRhdGEiKTsKLSAgICB9Ci0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGF0YV9mcyA9IHsiL2RhdGEiLCAiL21ldGFkYXRhIn07CiAgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGZzdGFiKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcmVudF9iZGV2ID0gZW50cnkuYmxrX2RldmljZTsKICAgICAgICAgd2hpbGUgKHRydWUpIHsKQEAgLTEzNiwxMSArMTMzLDEwIEBACiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsb3dlZCA9IHsiZXJvZnMiLCAiZXh0NCIsICJmMmZzIn07CiAgICAgICAgICAgICBFWFBFQ1RfTkUoc3RkOjpmaW5kKGFsbG93ZWQuYmVnaW4oKSwgYWxsb3dlZC5lbmQoKSwgZW50cnkuZnNfdHlwZSksIGFsbG93ZWQuZW5kKCkpCiAgICAgICAgICAgICAgICAgICAgIDw8IGVudHJ5Lm1vdW50X3BvaW50OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtdXN0X2JlX2YyZnMuYmVnaW4oKSwgbXVzdF9iZV9mMmZzLmVuZCgpLCBlbnRyeS5tb3VudF9wb2ludCkgIT0KLSAgICAgICAgICAgICAgICBtdXN0X2JlX2YyZnMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoZW50cnkuZnNfdHlwZSwgImYyZnMiKSA8PCBlbnRyeS5tb3VudF9wb2ludDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdGQ6OmZpbmQoZGF0YV9mcy5iZWdpbigpLCBkYXRhX2ZzLmVuZCgpLCBlbnRyeS5tb3VudF9wb2ludCkgIT0gZGF0YV9mcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFsbG93ZWQgPSB7ImV4dDQiLCAiZjJmcyJ9OworICAgICAgICAgICAgRVhQRUNUX05FKHN0ZDo6ZmluZChhbGxvd2VkLmJlZ2luKCksIGFsbG93ZWQuZW5kKCksIGVudHJ5LmZzX3R5cGUpLCBhbGxvd2VkLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICA8PCBlbnRyeS5tb3VudF9wb2ludCA8PCAiLCAiIDw8IGVudHJ5LmZzX3R5cGU7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9nYXRla2VlcGVyZC9BbmRyb2lkLmJwIGIvZ2F0ZWtlZXBlcmQvQW5kcm9pZC5icAppbmRleCA4MzhmNzM0Li41MzRmYzFhIDEwMDY0NAotLS0gYS9nYXRla2VlcGVyZC9BbmRyb2lkLmJwCisrKyBiL2dhdGVrZWVwZXJkL0FuZHJvaWQuYnAKQEAgLTE4LDggKzE4LDggQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImdhdGVrZWVwZXJkIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiZ2F0ZWtlZXBlcmRfZGVmYXVsdHMiLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdleHRyYSIsCkBAIC01Miw2ICs1MiwxNiBAQAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic2NyeXB0X3N0YXRpYyJdLAogICAgIGluY2x1ZGVfZGlyczogWyJleHRlcm5hbC9zY3J5cHQvbGliL2NyeXB0byJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJnYXRla2VlcGVyZCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImdhdGVrZWVwZXJkX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1haW4uY3BwIiwKKyAgICBdLAogICAgIGluaXRfcmM6IFsiZ2F0ZWtlZXBlcmQucmMiXSwKIH0KIApAQCAtODgsMyArOTgsMjAgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgXSwKIH0KKworY2NfZnV6eiB7CisgICAgbmFtZTogImdhdGVrZWVwZXJkX3NlcnZpY2VfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiZ2F0ZWtlZXBlcmRfZGVmYXVsdHMiLAorICAgICAgICAic2VydmljZV9mdXp6ZXJfZGVmYXVsdHMiCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmdXp6ZXIvR2F0ZUtlZXBlclNlcnZpY2VGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAic3VicmFobWFueWFtYW5AZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAic3dpbGxkZW5AZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgfSwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXRla2VlcGVyZC9mdXp6ZXIvR2F0ZUtlZXBlclNlcnZpY2VGdXp6ZXIuY3BwIGIvZ2F0ZWtlZXBlcmQvZnV6emVyL0dhdGVLZWVwZXJTZXJ2aWNlRnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBkNWZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2F0ZWtlZXBlcmQvZnV6emVyL0dhdGVLZWVwZXJTZXJ2aWNlRnV6emVyLmNwcApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1enpiaW5kZXIvbGliYmluZGVyX2RyaXZlci5oPgorCisjaW5jbHVkZSAiZ2F0ZWtlZXBlcmQuaCIKKwordXNpbmcgYW5kcm9pZDo6ZnV6elNlcnZpY2U7Cit1c2luZyBhbmRyb2lkOjpHYXRlS2VlcGVyUHJveHk7CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBhdXRvIGdhdGVrZWVwZXJTZXJ2aWNlID0gbmV3IEdhdGVLZWVwZXJQcm94eSgpOworICAgIGZ1enpTZXJ2aWNlKGdhdGVrZWVwZXJTZXJ2aWNlLCBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSkpOworICAgIHJldHVybiAwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhdGVrZWVwZXJkL2dhdGVrZWVwZXJkLmNwcCBiL2dhdGVrZWVwZXJkL2dhdGVrZWVwZXJkLmNwcAppbmRleCBlYjQzYTMzLi5iZGZiN2Y2IDEwMDY0NAotLS0gYS9nYXRla2VlcGVyZC9nYXRla2VlcGVyZC5jcHAKKysrIGIvZ2F0ZWtlZXBlcmQvZ2F0ZWtlZXBlcmQuY3BwCkBAIC0xMywxMSArMTMsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQogI2RlZmluZSBMT0dfVEFHICJnYXRla2VlcGVyZCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvc2VydmljZS9nYXRla2VlcGVyL0JuR2F0ZUtlZXBlclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxnYXRla2VlcGVyL0dhdGVLZWVwZXJSZXNwb25zZS5oPgorI2luY2x1ZGUgImdhdGVrZWVwZXJkLmgiCiAKICNpbmNsdWRlIDxlbmRpYW4uaD4KICNpbmNsdWRlIDxlcnJuby5oPgpAQCAtMzksMjUgKzM3LDE4IEBACiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZ2F0ZWtlZXBlci9JR2F0ZWtlZXBlci5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9zZWN1cml0eS9rZXltaW50L0hhcmR3YXJlQXV0aFRva2VuLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL3NlY3VyaXR5L2F1dGhvcml6YXRpb24vSUtleXN0b3JlQXV0aG9yaXphdGlvbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ2F0ZWtlZXBlci8xLjAvSUdhdGVrZWVwZXIuaD4KICNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpnYXRla2VlcGVyOjpWMV8wOjpHYXRla2VlcGVyUmVzcG9uc2U7CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Z2F0ZWtlZXBlcjo6VjFfMDo6R2F0ZWtlZXBlclN0YXR1c0NvZGU7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Z2F0ZWtlZXBlcjo6VjFfMDo6SUdhdGVrZWVwZXI7CiAKIHVzaW5nIEFpZGxHYXRla2VlcGVyRW5yb2xsUmVzcCA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpnYXRla2VlcGVyOjpHYXRla2VlcGVyRW5yb2xsUmVzcG9uc2U7CiB1c2luZyBBaWRsR2F0ZWtlZXBlclZlcmlmeVJlc3AgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z2F0ZWtlZXBlcjo6R2F0ZWtlZXBlclZlcmlmeVJlc3BvbnNlOwotdXNpbmcgQWlkbElHYXRla2VlcGVyID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdhdGVrZWVwZXI6OklHYXRla2VlcGVyOwogCi11c2luZyA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpzZXJ2aWNlOjpnYXRla2VlcGVyOjpCbkdhdGVLZWVwZXJTZXJ2aWNlOwotdXNpbmcgR0tSZXNwb25zZSA9IDo6YW5kcm9pZDo6c2VydmljZTo6Z2F0ZWtlZXBlcjo6R2F0ZUtlZXBlclJlc3BvbnNlOwogdXNpbmcgR0tSZXNwb25zZUNvZGUgPSA6OmFuZHJvaWQ6OnNlcnZpY2U6OmdhdGVrZWVwZXI6OlJlc3BvbnNlQ29kZTsKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNlY3VyaXR5OjprZXltaW50OjpIYXJkd2FyZUF1dGhlbnRpY2F0b3JUeXBlOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6c2VjdXJpdHk6OmtleW1pbnQ6OkhhcmR3YXJlQXV0aFRva2VuOwpAQCAtNzAsMTcyICs2MSwxODQgQEAKIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBEVU1QX1BFUk1JU1NJT04oImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CiBjb25zdGV4cHIgY29uc3QgY2hhciBnYXRla2VlcGVyU2VydmljZU5hbWVbXSA9ICJhbmRyb2lkLmhhcmR3YXJlLmdhdGVrZWVwZXIuSUdhdGVrZWVwZXIvZGVmYXVsdCI7CiAKLWNsYXNzIEdhdGVLZWVwZXJQcm94eSA6IHB1YmxpYyBCbkdhdGVLZWVwZXJTZXJ2aWNlIHsKLSAgcHVibGljOgotICAgIEdhdGVLZWVwZXJQcm94eSgpIHsKLSAgICAgICAgY2xlYXJfc3RhdGVfaWZfbmVlZGVkX2RvbmUgPSBmYWxzZTsKLSAgICAgICAgaHdfZGV2aWNlID0gSUdhdGVrZWVwZXI6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgOjpuZGs6OlNwQUlCaW5kZXIga3MyQmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKGdhdGVrZWVwZXJTZXJ2aWNlTmFtZSkpOworR2F0ZUtlZXBlclByb3h5OjpHYXRlS2VlcGVyUHJveHkoKSB7CisgICAgY2xlYXJfc3RhdGVfaWZfbmVlZGVkX2RvbmUgPSBmYWxzZTsKKyAgICBpZiAoQVNlcnZpY2VNYW5hZ2VyX2lzRGVjbGFyZWQoZ2F0ZWtlZXBlclNlcnZpY2VOYW1lKSkgeworICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBrczJCaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX3dhaXRGb3JTZXJ2aWNlKGdhdGVrZWVwZXJTZXJ2aWNlTmFtZSkpOwogICAgICAgICBhaWRsX2h3X2RldmljZSA9IEFpZGxJR2F0ZWtlZXBlcjo6ZnJvbUJpbmRlcihrczJCaW5kZXIpOwotICAgICAgICBpc19ydW5uaW5nX2dzaSA9IGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eShhbmRyb2lkOjpnc2k6OmtHc2lCb290ZWRQcm9wLCBmYWxzZSk7CisgICAgfQorICAgIGlmICghYWlkbF9od19kZXZpY2UpIHsKKyAgICAgICAgaHdfZGV2aWNlID0gSUdhdGVrZWVwZXI6OmdldFNlcnZpY2UoKTsKKyAgICB9CisgICAgaXNfcnVubmluZ19nc2kgPSBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoYW5kcm9pZDo6Z3NpOjprR3NpQm9vdGVkUHJvcCwgZmFsc2UpOwogCi0gICAgICAgIGlmICghYWlkbF9od19kZXZpY2UgJiYgIWh3X2RldmljZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGZpbmQgR2F0ZWtlZXBlciBkZXZpY2UsIHdoaWNoIG1ha2VzIG1lIHZlcnkgc2FkLiI7CisgICAgaWYgKCFhaWRsX2h3X2RldmljZSAmJiAhaHdfZGV2aWNlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBmaW5kIEdhdGVrZWVwZXIgZGV2aWNlLCB3aGljaCBtYWtlcyBtZSB2ZXJ5IHNhZC4iOworICAgIH0KK30KKwordm9pZCBHYXRlS2VlcGVyUHJveHk6OnN0b3JlX3NpZCh1aW50MzJfdCB1c2VySWQsIHVpbnQ2NF90IHNpZCkgeworICAgIGNoYXIgZmlsZW5hbWVbMjFdOworICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXUiLCB1c2VySWQpOworICAgIGludCBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQ1JFQVQsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3Qgb3BlbiBmaWxlOiAlczogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3cml0ZShmZCwgJnNpZCwgc2l6ZW9mKHNpZCkpOworICAgIGNsb3NlKGZkKTsKK30KKwordm9pZCBHYXRlS2VlcGVyUHJveHk6OmNsZWFyX3N0YXRlX2lmX25lZWRlZCgpIHsKKyAgICBpZiAoY2xlYXJfc3RhdGVfaWZfbmVlZGVkX2RvbmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtYXJrX2NvbGRfYm9vdCgpICYmICFpc19ydW5uaW5nX2dzaSkgeworICAgICAgICBBTE9HSSgiY29sZCBib290OiBjbGVhcmluZyBzdGF0ZSIpOworICAgICAgICBpZiAoYWlkbF9od19kZXZpY2UpIHsKKyAgICAgICAgICAgIGFpZGxfaHdfZGV2aWNlLT5kZWxldGVBbGxVc2VycygpOworICAgICAgICB9IGVsc2UgaWYgKGh3X2RldmljZSkgeworICAgICAgICAgICAgaHdfZGV2aWNlLT5kZWxldGVBbGxVc2VycyhbXShjb25zdCBHYXRla2VlcGVyUmVzcG9uc2UmKSB7fSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2aXJ0dWFsIH5HYXRlS2VlcGVyUHJveHkoKSB7fQorICAgIGNsZWFyX3N0YXRlX2lmX25lZWRlZF9kb25lID0gdHJ1ZTsKK30KIAotICAgIHZvaWQgc3RvcmVfc2lkKHVpbnQzMl90IHVzZXJJZCwgdWludDY0X3Qgc2lkKSB7Ci0gICAgICAgIGNoYXIgZmlsZW5hbWVbMjFdOwotICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiV1IiwgdXNlcklkKTsKK2Jvb2wgR2F0ZUtlZXBlclByb3h5OjptYXJrX2NvbGRfYm9vdCgpIHsKKyAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSA9ICIuY29sZGJvb3QiOworICAgIGlmIChhY2Nlc3MoZmlsZW5hbWUsIEZfT0spID09IC0xKSB7CiAgICAgICAgIGludCBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQ1JFQVQsIFNfSVJVU1IgfCBTX0lXVVNSKTsKICAgICAgICAgaWYgKGZkIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBvcGVuIGZpbGU6ICVzOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBvcGVuIGZpbGU6ICVzIDogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICB3cml0ZShmZCwgJnNpZCwgc2l6ZW9mKHNpZCkpOwogICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR2F0ZUtlZXBlclByb3h5OjptYXliZV9zdG9yZV9zaWQodWludDMyX3QgdXNlcklkLCB1aW50NjRfdCBzaWQpIHsKKyAgICBjaGFyIGZpbGVuYW1lWzIxXTsKKyAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiV1IiwgdXNlcklkKTsKKyAgICBpZiAoYWNjZXNzKGZpbGVuYW1lLCBGX09LKSA9PSAtMSkgeworICAgICAgICBzdG9yZV9zaWQodXNlcklkLCBzaWQpOworICAgIH0KK30KKwordWludDY0X3QgR2F0ZUtlZXBlclByb3h5OjpyZWFkX3NpZCh1aW50MzJfdCB1c2VySWQpIHsKKyAgICBjaGFyIGZpbGVuYW1lWzIxXTsKKyAgICB1aW50NjRfdCBzaWQ7CisgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIldSIsIHVzZXJJZCk7CisgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworICAgIGlmIChmZCA8IDApIHJldHVybiAwOworICAgIHJlYWQoZmQsICZzaWQsIHNpemVvZihzaWQpKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHNpZDsKK30KKwordm9pZCBHYXRlS2VlcGVyUHJveHk6OmNsZWFyX3NpZCh1aW50MzJfdCB1c2VySWQpIHsKKyAgICBjaGFyIGZpbGVuYW1lWzIxXTsKKyAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiV1IiwgdXNlcklkKTsKKyAgICBpZiAocmVtb3ZlKGZpbGVuYW1lKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UKSB7CisgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlbW92ZSBmaWxlIFslc10sIGF0dGVtcHRpbmcgMCB3cml0ZSIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBzdG9yZV9zaWQodXNlcklkLCAwKTsKKyAgICB9Cit9CisKK1N0YXR1cyBHYXRlS2VlcGVyUHJveHk6OmFkanVzdF91c2VySWQodWludDMyX3QgdXNlcklkLCB1aW50MzJfdCogaHdfdXNlcklkKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrR3NpT2Zmc2V0ID0gMTAwMDAwMDsKKyAgICBpZiAodXNlcklkID49IGtHc2lPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5UKTsKICAgICB9CiAKLSAgICB2b2lkIGNsZWFyX3N0YXRlX2lmX25lZWRlZCgpIHsKLSAgICAgICAgaWYgKGNsZWFyX3N0YXRlX2lmX25lZWRlZF9kb25lKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWFya19jb2xkX2Jvb3QoKSAmJiAhaXNfcnVubmluZ19nc2kpIHsKLSAgICAgICAgICAgIEFMT0dJKCJjb2xkIGJvb3Q6IGNsZWFyaW5nIHN0YXRlIik7Ci0gICAgICAgICAgICBpZiAoYWlkbF9od19kZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBhaWRsX2h3X2RldmljZS0+ZGVsZXRlQWxsVXNlcnMoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgaHdfZGV2aWNlLT5kZWxldGVBbGxVc2VycyhbXShjb25zdCBHYXRla2VlcGVyUmVzcG9uc2UmKSB7fSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjbGVhcl9zdGF0ZV9pZl9uZWVkZWRfZG9uZSA9IHRydWU7CisgICAgaWYgKChhaWRsX2h3X2RldmljZSA9PSBudWxscHRyKSAmJiAoaHdfZGV2aWNlID09IG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9TVEFURSk7CiAgICAgfQogCi0gICAgYm9vbCBtYXJrX2NvbGRfYm9vdCgpIHsKLSAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUgPSAiLmNvbGRib290IjsKLSAgICAgICAgaWYgKGFjY2VzcyhmaWxlbmFtZSwgRl9PSykgPT0gLTEpIHsKLSAgICAgICAgICAgIGludCBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQ1JFQVQsIFNfSVJVU1IgfCBTX0lXVVNSKTsKLSAgICAgICAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IG9wZW4gZmlsZTogJXMgOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoaXNfcnVubmluZ19nc2kpIHsKKyAgICAgICAgKmh3X3VzZXJJZCA9IHVzZXJJZCArIGtHc2lPZmZzZXQ7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQotCi0gICAgdm9pZCBtYXliZV9zdG9yZV9zaWQodWludDMyX3QgdXNlcklkLCB1aW50NjRfdCBzaWQpIHsKLSAgICAgICAgY2hhciBmaWxlbmFtZVsyMV07Ci0gICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXUiLCB1c2VySWQpOwotICAgICAgICBpZiAoYWNjZXNzKGZpbGVuYW1lLCBGX09LKSA9PSAtMSkgewotICAgICAgICAgICAgc3RvcmVfc2lkKHVzZXJJZCwgc2lkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHVpbnQ2NF90IHJlYWRfc2lkKHVpbnQzMl90IHVzZXJJZCkgewotICAgICAgICBjaGFyIGZpbGVuYW1lWzIxXTsKLSAgICAgICAgdWludDY0X3Qgc2lkOwotICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiV1IiwgdXNlcklkKTsKLSAgICAgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwotICAgICAgICBpZiAoZmQgPCAwKSByZXR1cm4gMDsKLSAgICAgICAgcmVhZChmZCwgJnNpZCwgc2l6ZW9mKHNpZCkpOwotICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgIHJldHVybiBzaWQ7Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhcl9zaWQodWludDMyX3QgdXNlcklkKSB7Ci0gICAgICAgIGNoYXIgZmlsZW5hbWVbMjFdOwotICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiV1IiwgdXNlcklkKTsKLSAgICAgICAgaWYgKHJlbW92ZShmaWxlbmFtZSkgPCAwICYmIGVycm5vICE9IEVOT0VOVCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVtb3ZlIGZpbGUgWyVzXSwgYXR0ZW1wdGluZyAwIHdyaXRlIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBzdG9yZV9zaWQodXNlcklkLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHVzZXJJZHMgYmVpbmcgcGFzc2VkIHRvIHRoZSBHYXRlS2VlcGVyIEhBTC4gSXQgZW5zdXJlcyB0aGF0Ci0gICAgLy8gc2VjdXJlIHN0b3JhZ2Ugc2hhcmVkIGFjcm9zcyBhIEdTSSBpbWFnZSBhbmQgYSBob3N0IGltYWdlIHdpbGwgbm90IG92ZXJsYXAuCi0gICAgdWludDMyX3QgYWRqdXN0X3VzZXJJZCh1aW50MzJfdCB1c2VySWQpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrR3NpT2Zmc2V0ID0gMTAwMDAwMDsKLSAgICAgICAgQ0hFQ0sodXNlcklkIDwga0dzaU9mZnNldCk7Ci0gICAgICAgIENIRUNLKChhaWRsX2h3X2RldmljZSAhPSBudWxscHRyKSB8fCAoaHdfZGV2aWNlICE9IG51bGxwdHIpKTsKLSAgICAgICAgaWYgKGlzX3J1bm5pbmdfZ3NpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlcklkICsga0dzaU9mZnNldDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlcklkOwotICAgIH0KKyAgICAqaHdfdXNlcklkID0gdXNlcklkOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CiAKICNkZWZpbmUgR0tfRVJST1IgKmdrUmVzcG9uc2UgPSBHS1Jlc3BvbnNlOjplcnJvcigpLCBTdGF0dXM6Om9rKCkKIAotICAgIFN0YXR1cyBlbnJvbGwoaW50MzJfdCB1c2VySWQsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8dWludDhfdD4+JiBjdXJyZW50UGFzc3dvcmRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiYgY3VycmVudFBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGRlc2lyZWRQYXNzd29yZCwgR0tSZXNwb25zZSogZ2tSZXNwb25zZSkgb3ZlcnJpZGUgewotICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICAgICAgY29uc3QgaW50IGNhbGxpbmdfcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgIGNvbnN0IGludCBjYWxsaW5nX3VpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKEtFWUdVQVJEX1BFUk1JU1NJT04sIGNhbGxpbmdfcGlkLCBjYWxsaW5nX3VpZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKLSAgICAgICAgfQorU3RhdHVzIEdhdGVLZWVwZXJQcm94eTo6ZW5yb2xsKGludDMyX3QgdXNlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8dWludDhfdD4+JiBjdXJyZW50UGFzc3dvcmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4mIGN1cnJlbnRQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGVzaXJlZFBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdLUmVzcG9uc2UqIGdrUmVzcG9uc2UpIHsKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBjb25zdCBpbnQgY2FsbGluZ19waWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgY2FsbGluZ191aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKEtFWUdVQVJEX1BFUk1JU1NJT04sIGNhbGxpbmdfcGlkLCBjYWxsaW5nX3VpZCkpIHsKKyAgICAgICAgcmV0dXJuIEdLX0VSUk9SOworICAgIH0KIAotICAgICAgICAvLyBNYWtlIHN1cmUgdG8gY2xlYXIgYW55IHN0YXRlIGZyb20gYmVmb3JlIGZhY3RvcnkgcmVzZXQgYXMgc29vbiBhcyBhIGNyZWRlbnRpYWwgaXMKLSAgICAgICAgLy8gZW5yb2xsZWQgKHdoaWNoIG1heSBoYXBwZW4gZHVyaW5nIGRldmljZSBzZXR1cCkuCi0gICAgICAgIGNsZWFyX3N0YXRlX2lmX25lZWRlZCgpOworICAgIC8vIE1ha2Ugc3VyZSB0byBjbGVhciBhbnkgc3RhdGUgZnJvbSBiZWZvcmUgZmFjdG9yeSByZXNldCBhcyBzb29uIGFzIGEgY3JlZGVudGlhbCBpcworICAgIC8vIGVucm9sbGVkICh3aGljaCBtYXkgaGFwcGVuIGR1cmluZyBkZXZpY2Ugc2V0dXApLgorICAgIGNsZWFyX3N0YXRlX2lmX25lZWRlZCgpOwogCi0gICAgICAgIC8vIG5lZWQgYSBkZXNpcmVkIHBhc3N3b3JkIHRvIGVucm9sbAotICAgICAgICBpZiAoZGVzaXJlZFBhc3N3b3JkLnNpemUoKSA9PSAwKSByZXR1cm4gR0tfRVJST1I7CisgICAgLy8gbmVlZCBhIGRlc2lyZWQgcGFzc3dvcmQgdG8gZW5yb2xsCisgICAgaWYgKGRlc2lyZWRQYXNzd29yZC5zaXplKCkgPT0gMCkgcmV0dXJuIEdLX0VSUk9SOwogCi0gICAgICAgIGlmICghYWlkbF9od19kZXZpY2UgJiYgIWh3X2RldmljZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiaGFzIG5vIEhBTCB0byB0YWxrIHRvIjsKLSAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKLSAgICAgICAgfQorICAgIGlmICghYWlkbF9od19kZXZpY2UgJiYgIWh3X2RldmljZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJoYXMgbm8gSEFMIHRvIHRhbGsgdG8iOworICAgICAgICByZXR1cm4gR0tfRVJST1I7CisgICAgfQogCi0gICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBjdXJQd2RIYW5kbGU7Ci0gICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBjdXJQd2Q7CisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IGN1clB3ZEhhbmRsZTsKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gY3VyUHdkOwogCi0gICAgICAgIGlmIChjdXJyZW50UGFzc3dvcmRIYW5kbGUgJiYgY3VycmVudFBhc3N3b3JkKSB7Ci0gICAgICAgICAgICBpZiAoaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSGlkbCBJbXBsZW1lbnRhdGlvbnMgZXhwZWN0cyBwYXNzd29yZEhhbmRsZSB0byBiZSBpbgotICAgICAgICAgICAgICAgIC8vIGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90IGZvcm1hdC4KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBhc3N3b3JkSGFuZGxlLT5zaXplKCkgIT0gc2l6ZW9mKGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90KSkgewotICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBhc3N3b3JkIGhhbmRsZSBoYXMgd3JvbmcgbGVuZ3RoIjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1clB3ZEhhbmRsZS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KGN1cnJlbnRQYXNzd29yZEhhbmRsZS0+ZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXNzd29yZEhhbmRsZS0+c2l6ZSgpKTsKLSAgICAgICAgICAgIGN1clB3ZC5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KGN1cnJlbnRQYXNzd29yZC0+ZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXNzd29yZC0+c2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBuZXdQd2Q7Ci0gICAgICAgIG5ld1B3ZC5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KGRlc2lyZWRQYXNzd29yZC5kYXRhKCkpLCBkZXNpcmVkUGFzc3dvcmQuc2l6ZSgpKTsKLQotICAgICAgICB1aW50MzJfdCBod191c2VySWQgPSBhZGp1c3RfdXNlcklkKHVzZXJJZCk7Ci0gICAgICAgIHVpbnQ2NF90IHNlY3VyZVVzZXJJZCA9IDA7Ci0gICAgICAgIGlmIChhaWRsX2h3X2RldmljZSkgewotICAgICAgICAgICAgLy8gQUlETCBnYXRla2VlcGVyIHNlcnZpY2UKLSAgICAgICAgICAgIEFpZGxHYXRla2VlcGVyRW5yb2xsUmVzcCByc3A7Ci0gICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGFpZGxfaHdfZGV2aWNlLT5lbnJvbGwoaHdfdXNlcklkLCBjdXJQd2RIYW5kbGUsIGN1clB3ZCwgbmV3UHdkLCAmcnNwKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0LmlzT2soKSkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImVucm9sbCB0cmFuc2FjdGlvbiBmYWlsZWQiOworICAgIGlmIChjdXJyZW50UGFzc3dvcmRIYW5kbGUgJiYgY3VycmVudFBhc3N3b3JkKSB7CisgICAgICAgIGlmIChod19kZXZpY2UpIHsKKyAgICAgICAgICAgIC8vIEhpZGwgSW1wbGVtZW50YXRpb25zIGV4cGVjdHMgcGFzc3dvcmRIYW5kbGUgdG8gYmUgaW4KKyAgICAgICAgICAgIC8vIGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90IGZvcm1hdC4KKyAgICAgICAgICAgIGlmIChjdXJyZW50UGFzc3dvcmRIYW5kbGUtPnNpemUoKSAhPSBzaXplb2YoZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QpKSB7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJQYXNzd29yZCBoYW5kbGUgaGFzIHdyb25nIGxlbmd0aCI7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJzcC5zdGF0dXNDb2RlID49IEFpZGxJR2F0ZWtlZXBlcjo6U1RBVFVTX09LKSB7Ci0gICAgICAgICAgICAgICAgKmdrUmVzcG9uc2UgPSBHS1Jlc3BvbnNlOjpvayh7cnNwLmRhdGEuYmVnaW4oKSwgcnNwLmRhdGEuZW5kKCl9KTsKLSAgICAgICAgICAgICAgICBzZWN1cmVVc2VySWQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocnNwLnNlY3VyZVVzZXJJZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJzcC5zdGF0dXNDb2RlID09IEFpZGxJR2F0ZWtlZXBlcjo6RVJST1JfUkVUUllfVElNRU9VVCAmJgotICAgICAgICAgICAgICAgICAgICAgICByc3AudGltZW91dE1zID4gMCkgewotICAgICAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6cmV0cnkocnNwLnRpbWVvdXRNcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6ZXJyb3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChod19kZXZpY2UpIHsKLSAgICAgICAgICAgIC8vIEhJREwgZ2F0ZWtlZXBlciBzZXJ2aWNlCi0gICAgICAgICAgICBSZXR1cm48dm9pZD4gaHdSZXMgPSBod19kZXZpY2UtPmVucm9sbCgKKyAgICAgICAgfQorICAgICAgICBjdXJQd2RIYW5kbGUuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QqPihjdXJyZW50UGFzc3dvcmRIYW5kbGUtPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXNzd29yZEhhbmRsZS0+c2l6ZSgpKTsKKyAgICAgICAgY3VyUHdkLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4oY3VycmVudFBhc3N3b3JkLT5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFzc3dvcmQtPnNpemUoKSk7CisgICAgfQorCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IG5ld1B3ZDsKKyAgICBuZXdQd2Quc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QqPihkZXNpcmVkUGFzc3dvcmQuZGF0YSgpKSwgZGVzaXJlZFBhc3N3b3JkLnNpemUoKSk7CisKKyAgICB1aW50MzJfdCBod191c2VySWQgPSAwOworICAgIFN0YXR1cyByZXN1bHQgPSBhZGp1c3RfdXNlcklkKHVzZXJJZCwgJmh3X3VzZXJJZCk7CisgICAgaWYgKCFyZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdWludDY0X3Qgc2VjdXJlVXNlcklkID0gMDsKKyAgICBpZiAoYWlkbF9od19kZXZpY2UpIHsKKyAgICAgICAgLy8gQUlETCBnYXRla2VlcGVyIHNlcnZpY2UKKyAgICAgICAgQWlkbEdhdGVrZWVwZXJFbnJvbGxSZXNwIHJzcDsKKyAgICAgICAgYXV0byByZXN1bHQgPSBhaWRsX2h3X2RldmljZS0+ZW5yb2xsKGh3X3VzZXJJZCwgY3VyUHdkSGFuZGxlLCBjdXJQd2QsIG5ld1B3ZCwgJnJzcCk7CisgICAgICAgIGlmICghcmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZW5yb2xsIHRyYW5zYWN0aW9uIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJzcC5zdGF0dXNDb2RlID49IEFpZGxJR2F0ZWtlZXBlcjo6U1RBVFVTX09LKSB7CisgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6Om9rKHtyc3AuZGF0YS5iZWdpbigpLCByc3AuZGF0YS5lbmQoKX0pOworICAgICAgICAgICAgc2VjdXJlVXNlcklkID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJzcC5zZWN1cmVVc2VySWQpOworICAgICAgICB9IGVsc2UgaWYgKHJzcC5zdGF0dXNDb2RlID09IEFpZGxJR2F0ZWtlZXBlcjo6RVJST1JfUkVUUllfVElNRU9VVCAmJiByc3AudGltZW91dE1zID4gMCkgeworICAgICAgICAgICAgKmdrUmVzcG9uc2UgPSBHS1Jlc3BvbnNlOjpyZXRyeShyc3AudGltZW91dE1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6ZXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaHdfZGV2aWNlKSB7CisgICAgICAgIC8vIEhJREwgZ2F0ZWtlZXBlciBzZXJ2aWNlCisgICAgICAgIFJldHVybjx2b2lkPiBod1JlcyA9IGh3X2RldmljZS0+ZW5yb2xsKAogICAgICAgICAgICAgICAgIGh3X3VzZXJJZCwgY3VyUHdkSGFuZGxlLCBjdXJQd2QsIG5ld1B3ZCwKICAgICAgICAgICAgICAgICBbJmdrUmVzcG9uc2VdKGNvbnN0IEdhdGVrZWVwZXJSZXNwb25zZSYgcnNwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyc3AuY29kZSA+PSBHYXRla2VlcGVyU3RhdHVzQ29kZTo6U1RBVFVTX09LKSB7CkBAIC0yNDcsMTEwICsyNTAsMTE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OmVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmICghaHdSZXMuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZW5yb2xsIHRyYW5zYWN0aW9uIGZhaWxlZCI7CisgICAgICAgIGlmICghaHdSZXMuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJlbnJvbGwgdHJhbnNhY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2tSZXNwb25zZS0+cmVzcG9uc2VfY29kZSgpID09IEdLUmVzcG9uc2VDb2RlOjpPSykgeworICAgICAgICAgICAgaWYgKGdrUmVzcG9uc2UtPnBheWxvYWQoKS5zaXplKCkgIT0gc2l6ZW9mKGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90KSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkhBTCByZXR1cm5lZCBwYXNzd29yZCBoYW5kbGUgb2YgaW52YWxpZCBsZW5ndGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2tSZXNwb25zZS0+cGF5bG9hZCgpLnNpemUoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ2tSZXNwb25zZS0+cmVzcG9uc2VfY29kZSgpID09IEdLUmVzcG9uc2VDb2RlOjpPSykgewotICAgICAgICAgICAgICAgIGlmIChna1Jlc3BvbnNlLT5wYXlsb2FkKCkuc2l6ZSgpICE9IHNpemVvZihnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSEFMIHJldHVybmVkIHBhc3N3b3JkIGhhbmRsZSBvZiBpbnZhbGlkIGxlbmd0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2tSZXNwb25zZS0+cGF5bG9hZCgpLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNvbnN0IGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90KiBoYW5kbGUgPQorICAgICAgICAgICAgY29uc3QgZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QqIGhhbmRsZSA9CiAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QqPigKLSAgICAgICAgICAgICAgICAgICAgICAgIGdrUmVzcG9uc2UtPnBheWxvYWQoKS5kYXRhKCkpOwotICAgICAgICAgICAgICAgIHNlY3VyZVVzZXJJZCA9IGhhbmRsZS0+dXNlcl9pZDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBna1Jlc3BvbnNlLT5wYXlsb2FkKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIHNlY3VyZVVzZXJJZCA9IGhhbmRsZS0+dXNlcl9pZDsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChna1Jlc3BvbnNlLT5yZXNwb25zZV9jb2RlKCkgPT0gR0tSZXNwb25zZUNvZGU6Ok9LICYmICFna1Jlc3BvbnNlLT5zaG91bGRfcmVlbnJvbGwoKSkgewotICAgICAgICAgICAgc3RvcmVfc2lkKHVzZXJJZCwgc2VjdXJlVXNlcklkKTsKLQotICAgICAgICAgICAgR0tSZXNwb25zZSB2ZXJpZnlSZXNwb25zZTsKLSAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHZlcmlmeSB0aGlzIHBhc3N3b3JkIHNvIHdlIGRvbid0IGFzayB0aGUgdXNlciB0byBlbnRlciBpdCBhZ2FpbgotICAgICAgICAgICAgLy8gaWYgdGhleSBqdXN0IGNyZWF0ZWQgaXQuCi0gICAgICAgICAgICBhdXRvIHN0YXR1cyA9IHZlcmlmeSh1c2VySWQsIGdrUmVzcG9uc2UtPnBheWxvYWQoKSwgZGVzaXJlZFBhc3N3b3JkLCAmdmVyaWZ5UmVzcG9uc2UpOwotICAgICAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpIHx8IHZlcmlmeVJlc3BvbnNlLnJlc3BvbnNlX2NvZGUoKSAhPSBHS1Jlc3BvbnNlQ29kZTo6T0spIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdmVyaWZ5IHBhc3N3b3JkIGFmdGVyIGVucm9sbGluZyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgIH0KIAotICAgIFN0YXR1cyB2ZXJpZnkoaW50MzJfdCB1c2VySWQsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dWludDhfdD4mIGVucm9sbGVkUGFzc3dvcmRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwcm92aWRlZFBhc3N3b3JkLCBHS1Jlc3BvbnNlKiBna1Jlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiB2ZXJpZnlDaGFsbGVuZ2UodXNlcklkLCAwIC8qIGNoYWxsZW5nZSAqLywgZW5yb2xsZWRQYXNzd29yZEhhbmRsZSwgcHJvdmlkZWRQYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBna1Jlc3BvbnNlKTsKKyAgICBpZiAoZ2tSZXNwb25zZS0+cmVzcG9uc2VfY29kZSgpID09IEdLUmVzcG9uc2VDb2RlOjpPSyAmJiAhZ2tSZXNwb25zZS0+c2hvdWxkX3JlZW5yb2xsKCkpIHsKKyAgICAgICAgc3RvcmVfc2lkKHVzZXJJZCwgc2VjdXJlVXNlcklkKTsKKworICAgICAgICBHS1Jlc3BvbnNlIHZlcmlmeVJlc3BvbnNlOworICAgICAgICAvLyBpbW1lZGlhdGVseSB2ZXJpZnkgdGhpcyBwYXNzd29yZCBzbyB3ZSBkb24ndCBhc2sgdGhlIHVzZXIgdG8gZW50ZXIgaXQgYWdhaW4KKyAgICAgICAgLy8gaWYgdGhleSBqdXN0IGNyZWF0ZWQgaXQuCisgICAgICAgIGF1dG8gc3RhdHVzID0gdmVyaWZ5KHVzZXJJZCwgZ2tSZXNwb25zZS0+cGF5bG9hZCgpLCBkZXNpcmVkUGFzc3dvcmQsICZ2ZXJpZnlSZXNwb25zZSk7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSB8fCB2ZXJpZnlSZXNwb25zZS5yZXNwb25zZV9jb2RlKCkgIT0gR0tSZXNwb25zZUNvZGU6Ok9LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdmVyaWZ5IHBhc3N3b3JkIGFmdGVyIGVucm9sbGluZyI7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBTdGF0dXMgdmVyaWZ5Q2hhbGxlbmdlKGludDMyX3QgdXNlcklkLCBpbnQ2NF90IGNoYWxsZW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHByb3ZpZGVkUGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHS1Jlc3BvbnNlKiBna1Jlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICBjb25zdCBpbnQgY2FsbGluZ19waWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgY29uc3QgaW50IGNhbGxpbmdfdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oS0VZR1VBUkRfUEVSTUlTU0lPTiwgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKSkgeworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBHYXRlS2VlcGVyUHJveHk6OnZlcmlmeShpbnQzMl90IHVzZXJJZCwgY29uc3QgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZW5yb2xsZWRQYXNzd29yZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwcm92aWRlZFBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdLUmVzcG9uc2UqIGdrUmVzcG9uc2UpIHsKKyAgICByZXR1cm4gdmVyaWZ5Q2hhbGxlbmdlKHVzZXJJZCwgMCAvKiBjaGFsbGVuZ2UgKi8sIGVucm9sbGVkUGFzc3dvcmRIYW5kbGUsIHByb3ZpZGVkUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBna1Jlc3BvbnNlKTsKK30KKworU3RhdHVzIEdhdGVLZWVwZXJQcm94eTo6dmVyaWZ5Q2hhbGxlbmdlKGludDMyX3QgdXNlcklkLCBpbnQ2NF90IGNoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZW5yb2xsZWRQYXNzd29yZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcHJvdmlkZWRQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHS1Jlc3BvbnNlKiBna1Jlc3BvbnNlKSB7CisgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgY29uc3QgaW50IGNhbGxpbmdfcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IGNhbGxpbmdfdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihLRVlHVUFSRF9QRVJNSVNTSU9OLCBjYWxsaW5nX3BpZCwgY2FsbGluZ191aWQpKSB7CisgICAgICAgIHJldHVybiBHS19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBjYW4ndCB2ZXJpZnkgaWYgd2UncmUgbWlzc2luZyBlaXRoZXIgcGFyYW0KKyAgICBpZiAoZW5yb2xsZWRQYXNzd29yZEhhbmRsZS5zaXplKCkgPT0gMCB8fCBwcm92aWRlZFBhc3N3b3JkLnNpemUoKSA9PSAwKSByZXR1cm4gR0tfRVJST1I7CisKKyAgICBpZiAoIWFpZGxfaHdfZGV2aWNlICYmICFod19kZXZpY2UpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiaGFzIG5vIEhBTCB0byB0YWxrIHRvIjsKKyAgICAgICAgcmV0dXJuIEdLX0VSUk9SOworICAgIH0KKworICAgIGlmIChod19kZXZpY2UpIHsKKyAgICAgICAgLy8gSGlkbCBJbXBsZW1lbnRhdGlvbnMgZXhwZWN0cyBwYXNzd29yZEhhbmRsZSB0byBiZSBpbiBnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdAorICAgICAgICBpZiAoZW5yb2xsZWRQYXNzd29yZEhhbmRsZS5zaXplKCkgIT0gc2l6ZW9mKGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90KSkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJQYXNzd29yZCBoYW5kbGUgaGFzIHdyb25nIGxlbmd0aCI7CiAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgLy8gY2FuJ3QgdmVyaWZ5IGlmIHdlJ3JlIG1pc3NpbmcgZWl0aGVyIHBhcmFtCi0gICAgICAgIGlmIChlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLnNpemUoKSA9PSAwIHx8IHByb3ZpZGVkUGFzc3dvcmQuc2l6ZSgpID09IDApIHJldHVybiBHS19FUlJPUjsKKyAgICB1aW50MzJfdCBod191c2VySWQgPSAwOworICAgIFN0YXR1cyByZXN1bHQgPSBhZGp1c3RfdXNlcklkKHVzZXJJZCwgJmh3X3VzZXJJZCk7CisgICAgaWYgKCFyZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0gICAgICAgIGlmICghYWlkbF9od19kZXZpY2UgJiYgIWh3X2RldmljZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiaGFzIG5vIEhBTCB0byB0YWxrIHRvIjsKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gY3VyUHdkSGFuZGxlOworICAgIGN1clB3ZEhhbmRsZS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KGVucm9sbGVkUGFzc3dvcmRIYW5kbGUuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLnNpemUoKSk7CisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IGVudGVyZWRQd2Q7CisgICAgZW50ZXJlZFB3ZC5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHByb3ZpZGVkUGFzc3dvcmQuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWRQYXNzd29yZC5zaXplKCkpOworCisgICAgdWludDY0X3Qgc2VjdXJlVXNlcklkID0gMDsKKyAgICBpZiAoYWlkbF9od19kZXZpY2UpIHsKKyAgICAgICAgLy8gQUlETCBnYXRla2VlcGVyIHNlcnZpY2UKKyAgICAgICAgQWlkbEdhdGVrZWVwZXJWZXJpZnlSZXNwIHJzcDsKKyAgICAgICAgYXV0byByZXN1bHQgPSBhaWRsX2h3X2RldmljZS0+dmVyaWZ5KGh3X3VzZXJJZCwgY2hhbGxlbmdlLCBjdXJQd2RIYW5kbGUsIGVudGVyZWRQd2QsICZyc3ApOworICAgICAgICBpZiAoIXJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInZlcmlmeSB0cmFuc2FjdGlvbiBmYWlsZWQiOwogICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGh3X2RldmljZSkgewotICAgICAgICAgICAgLy8gSGlkbCBJbXBsZW1lbnRhdGlvbnMgZXhwZWN0cyBwYXNzd29yZEhhbmRsZSB0byBiZSBpbiBnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdAotICAgICAgICAgICAgaWYgKGVucm9sbGVkUGFzc3dvcmRIYW5kbGUuc2l6ZSgpICE9IHNpemVvZihnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdCkpIHsKLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBhc3N3b3JkIGhhbmRsZSBoYXMgd3JvbmcgbGVuZ3RoIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChyc3Auc3RhdHVzQ29kZSA+PSBBaWRsSUdhdGVrZWVwZXI6OlNUQVRVU19PSykgeworICAgICAgICAgICAgc2VjdXJlVXNlcklkID0gcnNwLmhhcmR3YXJlQXV0aFRva2VuLnVzZXJJZDsKKyAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSBIYXJkd2FyZUF1dGhUb2tlbiB0byBhIHZlY3RvciBhcyBod19hdXRoX3Rva2VuX3QuCisgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6Om9rKAorICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW4yQWlkbFZlYyhyc3AuaGFyZHdhcmVBdXRoVG9rZW4pLAorICAgICAgICAgICAgICAgICAgICByc3Auc3RhdHVzQ29kZSA9PSBBaWRsSUdhdGVrZWVwZXI6OlNUQVRVU19SRUVOUk9MTCAvKiByZWVucm9sbCAqLyk7CisgICAgICAgIH0gZWxzZSBpZiAocnNwLnN0YXR1c0NvZGUgPT0gQWlkbElHYXRla2VlcGVyOjpFUlJPUl9SRVRSWV9USU1FT1VUKSB7CisgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OnJldHJ5KHJzcC50aW1lb3V0TXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmdrUmVzcG9uc2UgPSBHS1Jlc3BvbnNlOjplcnJvcigpOwogICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgaHdfdXNlcklkID0gYWRqdXN0X3VzZXJJZCh1c2VySWQpOwotICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gY3VyUHdkSGFuZGxlOwotICAgICAgICBjdXJQd2RIYW5kbGUuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QqPihlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLmRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucm9sbGVkUGFzc3dvcmRIYW5kbGUuc2l6ZSgpKTsKLSAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IGVudGVyZWRQd2Q7Ci0gICAgICAgIGVudGVyZWRQd2Quc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QqPihwcm92aWRlZFBhc3N3b3JkLmRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZFBhc3N3b3JkLnNpemUoKSk7Ci0KLSAgICAgICAgdWludDY0X3Qgc2VjdXJlVXNlcklkID0gMDsKLSAgICAgICAgaWYgKGFpZGxfaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICAvLyBBSURMIGdhdGVrZWVwZXIgc2VydmljZQotICAgICAgICAgICAgQWlkbEdhdGVrZWVwZXJWZXJpZnlSZXNwIHJzcDsKLSAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0KLSAgICAgICAgICAgICAgICBhaWRsX2h3X2RldmljZS0+dmVyaWZ5KGh3X3VzZXJJZCwgY2hhbGxlbmdlLCBjdXJQd2RIYW5kbGUsIGVudGVyZWRQd2QsICZyc3ApOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidmVyaWZ5IHRyYW5zYWN0aW9uIGZhaWxlZCI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJzcC5zdGF0dXNDb2RlID49IEFpZGxJR2F0ZWtlZXBlcjo6U1RBVFVTX09LKSB7Ci0gICAgICAgICAgICAgICAgc2VjdXJlVXNlcklkID0gcnNwLmhhcmR3YXJlQXV0aFRva2VuLnVzZXJJZDsKLSAgICAgICAgICAgICAgICAvLyBTZXJpYWxpemUgSGFyZHdhcmVBdXRoVG9rZW4gdG8gYSB2ZWN0b3IgYXMgaHdfYXV0aF90b2tlbl90LgotICAgICAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6b2soYXV0aFRva2VuMkFpZGxWZWMocnNwLmhhcmR3YXJlQXV0aFRva2VuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcC5zdGF0dXNDb2RlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlkbElHYXRla2VlcGVyOjpTVEFUVVNfUkVFTlJPTEwgLyogcmVlbnJvbGwgKi8pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyc3Auc3RhdHVzQ29kZSA9PSBBaWRsSUdhdGVrZWVwZXI6OkVSUk9SX1JFVFJZX1RJTUVPVVQpIHsKLSAgICAgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OnJldHJ5KHJzcC50aW1lb3V0TXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OmVycm9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICAvLyBISURMIGdhdGVrZWVwZXIgc2VydmljZQotICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IGh3UmVzID0gaHdfZGV2aWNlLT52ZXJpZnkoCisgICAgfSBlbHNlIGlmIChod19kZXZpY2UpIHsKKyAgICAgICAgLy8gSElETCBnYXRla2VlcGVyIHNlcnZpY2UKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGh3UmVzID0gaHdfZGV2aWNlLT52ZXJpZnkoCiAgICAgICAgICAgICAgICAgaHdfdXNlcklkLCBjaGFsbGVuZ2UsIGN1clB3ZEhhbmRsZSwgZW50ZXJlZFB3ZCwKICAgICAgICAgICAgICAgICBbJmdrUmVzcG9uc2VdKGNvbnN0IEdhdGVrZWVwZXJSZXNwb25zZSYgcnNwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyc3AuY29kZSA+PSBHYXRla2VlcGVyU3RhdHVzQ29kZTo6U1RBVFVTX09LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6Om9rKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyc3AuZGF0YS5iZWdpbigpLCByc3AuZGF0YS5lbmQoKX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNwLmNvZGUgPT0gR2F0ZWtlZXBlclN0YXR1c0NvZGU6OlNUQVRVU19SRUVOUk9MTCAvKiByZWVucm9sbCAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyc3AuZGF0YS5iZWdpbigpLCByc3AuZGF0YS5lbmQoKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzcC5jb2RlID09IEdhdGVrZWVwZXJTdGF0dXNDb2RlOjpTVEFUVVNfUkVFTlJPTEwgLyogcmVlbnJvbGwgKi8pOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJzcC5jb2RlID09IEdhdGVrZWVwZXJTdGF0dXNDb2RlOjpFUlJPUl9SRVRSWV9USU1FT1VUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OnJldHJ5KHJzcC50aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTM1OCwxNDkgKzM2NiwxMTUgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgICAgICBpZiAoIWh3UmVzLmlzT2soKSkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInZlcmlmeSB0cmFuc2FjdGlvbiBmYWlsZWQiOwotICAgICAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90KiBoYW5kbGUgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QqPigKLSAgICAgICAgICAgICAgICAgICAgZW5yb2xsZWRQYXNzd29yZEhhbmRsZS5kYXRhKCkpOwotICAgICAgICAgICAgc2VjdXJlVXNlcklkID0gaGFuZGxlLT51c2VyX2lkOworICAgICAgICBpZiAoIWh3UmVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidmVyaWZ5IHRyYW5zYWN0aW9uIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY29uc3QgZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QqIGhhbmRsZSA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgZW5yb2xsZWRQYXNzd29yZEhhbmRsZS5kYXRhKCkpOworICAgICAgICBzZWN1cmVVc2VySWQgPSBoYW5kbGUtPnVzZXJfaWQ7CisgICAgfQogCi0gICAgICAgIGlmIChna1Jlc3BvbnNlLT5yZXNwb25zZV9jb2RlKCkgPT0gR0tSZXNwb25zZUNvZGU6Ok9LKSB7Ci0gICAgICAgICAgICBpZiAoZ2tSZXNwb25zZS0+cGF5bG9hZCgpLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGNvbm5lY3QgdG8gSUtleXN0b3JlQXV0aG9yaXphdGlvbiBBSURMIHNlcnZpY2UgZmlyc3QuCi0gICAgICAgICAgICAgICAgQUlCaW5kZXIqIGF1dGh6QUlCaW5kZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoImFuZHJvaWQuc2VjdXJpdHkuYXV0aG9yaXphdGlvbiIpOwotICAgICAgICAgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGF1dGh6QmluZGVyKGF1dGh6QUlCaW5kZXIpOwotICAgICAgICAgICAgICAgIGF1dG8gYXV0aHpTZXJ2aWNlID0gSUtleXN0b3JlQXV0aG9yaXphdGlvbjo6ZnJvbUJpbmRlcihhdXRoekJpbmRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dGh6U2VydmljZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2tSZXNwb25zZS0+cGF5bG9hZCgpLnNpemUoKSAhPSBzaXplb2YoaHdfYXV0aF90b2tlbl90KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW5jb3JyZWN0IHNpemUgb2YgQXV0aFRva2VuIHBheWxvYWQuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGh3X2F1dGhfdG9rZW5fdCogaHdBdXRoVG9rZW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaHdfYXV0aF90b2tlbl90Kj4oZ2tSZXNwb25zZS0+cGF5bG9hZCgpLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEhhcmR3YXJlQXV0aFRva2VuIGF1dGhUb2tlbjsKLQotICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW4udGltZXN0YW1wLm1pbGxpU2Vjb25kcyA9IGJldG9oNjQoaHdBdXRoVG9rZW4tPnRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlbi5jaGFsbGVuZ2UgPSBod0F1dGhUb2tlbi0+Y2hhbGxlbmdlOwotICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW4udXNlcklkID0gaHdBdXRoVG9rZW4tPnVzZXJfaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlbi5hdXRoZW50aWNhdG9ySWQgPSBod0F1dGhUb2tlbi0+YXV0aGVudGljYXRvcl9pZDsKLSAgICAgICAgICAgICAgICAgICAgYXV0aFRva2VuLmF1dGhlbnRpY2F0b3JUeXBlID0gc3RhdGljX2Nhc3Q8SGFyZHdhcmVBdXRoZW50aWNhdG9yVHlwZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0b2gzMihod0F1dGhUb2tlbi0+YXV0aGVudGljYXRvcl90eXBlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlbi5tYWMuYXNzaWduKCZod0F1dGhUb2tlbi0+aG1hY1swXSwgJmh3QXV0aFRva2VuLT5obWFjWzMyXSk7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gYXV0aHpTZXJ2aWNlLT5hZGRBdXRoVG9rZW4oYXV0aFRva2VuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsdXJlIGluIHNlbmRpbmcgQXV0aFRva2VuIHRvIEF1dGhvcml6YXRpb25TZXJ2aWNlLiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZGVsaXZlciBhdXRoIHRva2VuLiBVbmFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleXN0b3JlLiI7CisgICAgaWYgKGdrUmVzcG9uc2UtPnJlc3BvbnNlX2NvZGUoKSA9PSBHS1Jlc3BvbnNlQ29kZTo6T0spIHsKKyAgICAgICAgaWYgKGdrUmVzcG9uc2UtPnBheWxvYWQoKS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgLy8gdHJ5IHRvIGNvbm5lY3QgdG8gSUtleXN0b3JlQXV0aG9yaXphdGlvbiBBSURMIHNlcnZpY2UgZmlyc3QuCisgICAgICAgICAgICBBSUJpbmRlciogYXV0aHpBSUJpbmRlciA9IEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKCJhbmRyb2lkLnNlY3VyaXR5LmF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGF1dGh6QmluZGVyKGF1dGh6QUlCaW5kZXIpOworICAgICAgICAgICAgYXV0byBhdXRoelNlcnZpY2UgPSBJS2V5c3RvcmVBdXRob3JpemF0aW9uOjpmcm9tQmluZGVyKGF1dGh6QmluZGVyKTsKKyAgICAgICAgICAgIGlmIChhdXRoelNlcnZpY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2tSZXNwb25zZS0+cGF5bG9hZCgpLnNpemUoKSAhPSBzaXplb2YoaHdfYXV0aF90b2tlbl90KSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbmNvcnJlY3Qgc2l6ZSBvZiBBdXRoVG9rZW4gcGF5bG9hZC4iOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgaHdfYXV0aF90b2tlbl90KiBod0F1dGhUb2tlbiA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGh3X2F1dGhfdG9rZW5fdCo+KGdrUmVzcG9uc2UtPnBheWxvYWQoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgIEhhcmR3YXJlQXV0aFRva2VuIGF1dGhUb2tlbjsKKworICAgICAgICAgICAgICAgIGF1dGhUb2tlbi50aW1lc3RhbXAubWlsbGlTZWNvbmRzID0gYmV0b2g2NChod0F1dGhUb2tlbi0+dGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICBhdXRoVG9rZW4uY2hhbGxlbmdlID0gaHdBdXRoVG9rZW4tPmNoYWxsZW5nZTsKKyAgICAgICAgICAgICAgICBhdXRoVG9rZW4udXNlcklkID0gaHdBdXRoVG9rZW4tPnVzZXJfaWQ7CisgICAgICAgICAgICAgICAgYXV0aFRva2VuLmF1dGhlbnRpY2F0b3JJZCA9IGh3QXV0aFRva2VuLT5hdXRoZW50aWNhdG9yX2lkOworICAgICAgICAgICAgICAgIGF1dGhUb2tlbi5hdXRoZW50aWNhdG9yVHlwZSA9IHN0YXRpY19jYXN0PEhhcmR3YXJlQXV0aGVudGljYXRvclR5cGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgYmV0b2gzMihod0F1dGhUb2tlbi0+YXV0aGVudGljYXRvcl90eXBlKSk7CisgICAgICAgICAgICAgICAgYXV0aFRva2VuLm1hYy5hc3NpZ24oJmh3QXV0aFRva2VuLT5obWFjWzBdLCAmaHdBdXRoVG9rZW4tPmhtYWNbMzJdKTsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGF1dGh6U2VydmljZS0+YWRkQXV0aFRva2VuKGF1dGhUb2tlbik7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWx1cmUgaW4gc2VuZGluZyBBdXRoVG9rZW4gdG8gQXV0aG9yaXphdGlvblNlcnZpY2UuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGRlbGl2ZXIgYXV0aCB0b2tlbi4gVW5hYmxlIHRvIGNvbW11bmljYXRlIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleXN0b3JlLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXliZV9zdG9yZV9zaWQodXNlcklkLCBzZWN1cmVVc2VySWQpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICAgICAgbWF5YmVfc3RvcmVfc2lkKHVzZXJJZCwgc2VjdXJlVXNlcklkKTsKICAgICB9CiAKLSAgICBTdGF0dXMgZ2V0U2VjdXJlVXNlcklkKGludDMyX3QgdXNlcklkLCBpbnQ2NF90KiBzaWQpIG92ZXJyaWRlIHsKLSAgICAgICAgKnNpZCA9IHJlYWRfc2lkKHVzZXJJZCk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgU3RhdHVzIGNsZWFyU2VjdXJlVXNlcklkKGludDMyX3QgdXNlcklkKSBvdmVycmlkZSB7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICBjb25zdCBpbnQgY2FsbGluZ19waWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgY29uc3QgaW50IGNhbGxpbmdfdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oS0VZR1VBUkRfUEVSTUlTU0lPTiwgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBwZXJtaXNzaW9uIGRlbmllZCBmb3IgWyVkOiVkXSIsIF9fZnVuY19fLCBjYWxsaW5nX3BpZCwgY2FsbGluZ191aWQpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICAgICAgfQotICAgICAgICBjbGVhcl9zaWQodXNlcklkKTsKLQotICAgICAgICB1aW50MzJfdCBod191c2VySWQgPSBhZGp1c3RfdXNlcklkKHVzZXJJZCk7Ci0gICAgICAgIGlmIChhaWRsX2h3X2RldmljZSkgewotICAgICAgICAgICAgYWlkbF9od19kZXZpY2UtPmRlbGV0ZVVzZXIoaHdfdXNlcklkKTsKLSAgICAgICAgfSBlbHNlIGlmIChod19kZXZpY2UpIHsKLSAgICAgICAgICAgIGh3X2RldmljZS0+ZGVsZXRlVXNlcihod191c2VySWQsIFtdKGNvbnN0IEdhdGVrZWVwZXJSZXNwb25zZSYpIHt9KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIFN0YXR1cyByZXBvcnREZXZpY2VTZXR1cENvbXBsZXRlKCkgb3ZlcnJpZGUgewotICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICAgICAgY29uc3QgaW50IGNhbGxpbmdfcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgIGNvbnN0IGludCBjYWxsaW5nX3VpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKEtFWUdVQVJEX1BFUk1JU1NJT04sIGNhbGxpbmdfcGlkLCBjYWxsaW5nX3VpZCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogcGVybWlzc2lvbiBkZW5pZWQgZm9yIFslZDolZF0iLCBfX2Z1bmNfXywgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKTsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGVhcl9zdGF0ZV9pZl9uZWVkZWQoKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIG92ZXJyaWRlIHsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKERVTVBfUEVSTUlTU0lPTiwgcGlkLCB1aWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWlkbF9od19kZXZpY2UgPT0gbnVsbHB0ciAmJiBod19kZXZpY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgY29uc3QgY2hhciogcmVzdWx0ID0gIkRldmljZSBub3QgYXZhaWxhYmxlIjsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiByZXN1bHQgPSAiT0siOwotICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdCwgc3RybGVuKHJlc3VsdCkgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICAvLyBBSURMIGdhdGVrZWVwZXIgc2VydmljZS4KLSAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbElHYXRla2VlcGVyPiBhaWRsX2h3X2RldmljZTsKLSAgICAvLyBISURMIGdhdGVrZWVwZXIgc2VydmljZS4KLSAgICBzcDxJR2F0ZWtlZXBlcj4gaHdfZGV2aWNlOwotCi0gICAgYm9vbCBjbGVhcl9zdGF0ZV9pZl9uZWVkZWRfZG9uZTsKLSAgICBib29sIGlzX3J1bm5pbmdfZ3NpOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgICBBTE9HSSgiU3RhcnRpbmcgZ2F0ZWtlZXBlcmQuLi4iKTsKLSAgICBpZiAoYXJnYyA8IDIpIHsKLSAgICAgICAgQUxPR0UoIkEgZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkISIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGNoZGlyKGFyZ3ZbMV0pID09IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJjaGRpcjogJXM6ICVzIiwgYXJndlsxXSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkdhdGVLZWVwZXJQcm94eT4gcHJveHkgPSBuZXcgYW5kcm9pZDo6R2F0ZUtlZXBlclByb3h5KCk7Ci0gICAgYW5kcm9pZDo6c3RhdHVzX3QgcmV0ID0KLSAgICAgICAgc20tPmFkZFNlcnZpY2UoYW5kcm9pZDo6U3RyaW5nMTYoImFuZHJvaWQuc2VydmljZS5nYXRla2VlcGVyLklHYXRlS2VlcGVyU2VydmljZSIpLCBwcm94eSk7Ci0gICAgaWYgKHJldCAhPSBhbmRyb2lkOjpPSykgewotICAgICAgICBBTE9HRSgiQ291bGRuJ3QgcmVnaXN0ZXIgYmluZGVyIHNlcnZpY2UhIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFdlJ3JlIHRoZSBvbmx5IHRocmVhZCBpbiBleGlzdGVuY2UsIHNvIHdlJ3JlIGp1c3QgZ29pbmcgdG8gcHJvY2VzcwotICAgICAqIEJpbmRlciB0cmFuc2FjdGlvbiBhcyBhIHNpbmdsZS10aHJlYWRlZCBwcm9ncmFtLgotICAgICAqLwotICAgIGFuZHJvaWQ6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KKworU3RhdHVzIEdhdGVLZWVwZXJQcm94eTo6Z2V0U2VjdXJlVXNlcklkKGludDMyX3QgdXNlcklkLCBpbnQ2NF90KiBzaWQpIHsKKyAgICAqc2lkID0gcmVhZF9zaWQodXNlcklkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgR2F0ZUtlZXBlclByb3h5OjpjbGVhclNlY3VyZVVzZXJJZChpbnQzMl90IHVzZXJJZCkgeworICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBjYWxsaW5nX3BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBjYWxsaW5nX3VpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oS0VZR1VBUkRfUEVSTUlTU0lPTiwgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKSkgeworICAgICAgICBBTE9HRSgiJXM6IHBlcm1pc3Npb24gZGVuaWVkIGZvciBbJWQ6JWRdIiwgX19mdW5jX18sIGNhbGxpbmdfcGlkLCBjYWxsaW5nX3VpZCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIGNsZWFyX3NpZCh1c2VySWQpOworCisgICAgdWludDMyX3QgaHdfdXNlcklkID0gMDsKKyAgICBTdGF0dXMgcmVzdWx0ID0gYWRqdXN0X3VzZXJJZCh1c2VySWQsICZod191c2VySWQpOworICAgIGlmICghcmVzdWx0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmIChhaWRsX2h3X2RldmljZSkgeworICAgICAgICBhaWRsX2h3X2RldmljZS0+ZGVsZXRlVXNlcihod191c2VySWQpOworICAgIH0gZWxzZSBpZiAoaHdfZGV2aWNlKSB7CisgICAgICAgIGh3X2RldmljZS0+ZGVsZXRlVXNlcihod191c2VySWQsIFtdKGNvbnN0IEdhdGVrZWVwZXJSZXNwb25zZSYpIHt9KTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEdhdGVLZWVwZXJQcm94eTo6cmVwb3J0RGV2aWNlU2V0dXBDb21wbGV0ZSgpIHsKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBjb25zdCBpbnQgY2FsbGluZ19waWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgY2FsbGluZ191aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKEtFWUdVQVJEX1BFUk1JU1NJT04sIGNhbGxpbmdfcGlkLCBjYWxsaW5nX3VpZCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwZXJtaXNzaW9uIGRlbmllZCBmb3IgWyVkOiVkXSIsIF9fZnVuY19fLCBjYWxsaW5nX3BpZCwgY2FsbGluZ191aWQpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIGNsZWFyX3N0YXRlX2lmX25lZWRlZCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK3N0YXR1c190IEdhdGVLZWVwZXJQcm94eTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSB7CisgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCB1aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKERVTVBfUEVSTUlTU0lPTiwgcGlkLCB1aWQpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBpZiAoYWlkbF9od19kZXZpY2UgPT0gbnVsbHB0ciAmJiBod19kZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCBjaGFyKiByZXN1bHQgPSAiRGV2aWNlIG5vdCBhdmFpbGFibGUiOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LCBzdHJsZW4ocmVzdWx0KSArIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHJlc3VsdCA9ICJPSyI7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgMSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2dhdGVrZWVwZXJkL2dhdGVrZWVwZXJkLmggYi9nYXRla2VlcGVyZC9nYXRla2VlcGVyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjA4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXRla2VlcGVyZC9nYXRla2VlcGVyZC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2dhdGVrZWVwZXIvSUdhdGVrZWVwZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dhdGVrZWVwZXIvMS4wL0lHYXRla2VlcGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9zZXJ2aWNlL2dhdGVrZWVwZXIvQm5HYXRlS2VlcGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGdhdGVrZWVwZXIvR2F0ZUtlZXBlclJlc3BvbnNlLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdhdGVrZWVwZXI6OlYxXzA6OklHYXRla2VlcGVyOwordXNpbmcgQWlkbElHYXRla2VlcGVyID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z2F0ZWtlZXBlcjo6SUdhdGVrZWVwZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzZXJ2aWNlOjpnYXRla2VlcGVyOjpCbkdhdGVLZWVwZXJTZXJ2aWNlOwordXNpbmcgR0tSZXNwb25zZSA9IDo6YW5kcm9pZDo6c2VydmljZTo6Z2F0ZWtlZXBlcjo6R2F0ZUtlZXBlclJlc3BvbnNlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEdhdGVLZWVwZXJQcm94eSA6IHB1YmxpYyBCbkdhdGVLZWVwZXJTZXJ2aWNlIHsKKyAgcHVibGljOgorICAgIEdhdGVLZWVwZXJQcm94eSgpOworCisgICAgdmlydHVhbCB+R2F0ZUtlZXBlclByb3h5KCkge30KKworICAgIHZvaWQgc3RvcmVfc2lkKHVpbnQzMl90IHVzZXJJZCwgdWludDY0X3Qgc2lkKTsKKworICAgIHZvaWQgY2xlYXJfc3RhdGVfaWZfbmVlZGVkKCk7CisKKyAgICBib29sIG1hcmtfY29sZF9ib290KCk7CisKKyAgICB2b2lkIG1heWJlX3N0b3JlX3NpZCh1aW50MzJfdCB1c2VySWQsIHVpbnQ2NF90IHNpZCk7CisKKyAgICB1aW50NjRfdCByZWFkX3NpZCh1aW50MzJfdCB1c2VySWQpOworCisgICAgdm9pZCBjbGVhcl9zaWQodWludDMyX3QgdXNlcklkKTsKKworICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHVzZXJJZHMgYmVpbmcgcGFzc2VkIHRvIHRoZSBHYXRlS2VlcGVyIEhBTC4gSXQgZW5zdXJlcyB0aGF0CisgICAgLy8gc2VjdXJlIHN0b3JhZ2Ugc2hhcmVkIGFjcm9zcyBhIEdTSSBpbWFnZSBhbmQgYSBob3N0IGltYWdlIHdpbGwgbm90IG92ZXJsYXAuCisgICAgU3RhdHVzIGFkanVzdF91c2VySWQodWludDMyX3QgdXNlcklkLCB1aW50MzJfdCogaHdfdXNlcklkKTsKKworI2RlZmluZSBHS19FUlJPUiAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OmVycm9yKCksIFN0YXR1czo6b2soKQorCisgICAgU3RhdHVzIGVucm9sbChpbnQzMl90IHVzZXJJZCwgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4mIGN1cnJlbnRQYXNzd29yZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8dWludDhfdD4+JiBjdXJyZW50UGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGVzaXJlZFBhc3N3b3JkLCBHS1Jlc3BvbnNlKiBna1Jlc3BvbnNlKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyB2ZXJpZnkoaW50MzJfdCB1c2VySWQsIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dWludDhfdD4mIGVucm9sbGVkUGFzc3dvcmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwcm92aWRlZFBhc3N3b3JkLCBHS1Jlc3BvbnNlKiBna1Jlc3BvbnNlKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyB2ZXJpZnlDaGFsbGVuZ2UoaW50MzJfdCB1c2VySWQsIGludDY0X3QgY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGVucm9sbGVkUGFzc3dvcmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcHJvdmlkZWRQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdLUmVzcG9uc2UqIGdrUmVzcG9uc2UpIG92ZXJyaWRlOworCisgICAgU3RhdHVzIGdldFNlY3VyZVVzZXJJZChpbnQzMl90IHVzZXJJZCwgaW50NjRfdCogc2lkKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyBjbGVhclNlY3VyZVVzZXJJZChpbnQzMl90IHVzZXJJZCkgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgcmVwb3J0RGV2aWNlU2V0dXBDb21wbGV0ZSgpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIC8vIEFJREwgZ2F0ZWtlZXBlciBzZXJ2aWNlLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsSUdhdGVrZWVwZXI+IGFpZGxfaHdfZGV2aWNlOworICAgIC8vIEhJREwgZ2F0ZWtlZXBlciBzZXJ2aWNlLgorICAgIHNwPElHYXRla2VlcGVyPiBod19kZXZpY2U7CisKKyAgICBib29sIGNsZWFyX3N0YXRlX2lmX25lZWRlZF9kb25lOworICAgIGJvb2wgaXNfcnVubmluZ19nc2k7Cit9OworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2dhdGVrZWVwZXJkL21haW4uY3BwIGIvZ2F0ZWtlZXBlcmQvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxZjlkZQotLS0gL2Rldi9udWxsCisrKyBiL2dhdGVrZWVwZXJkL21haW4uY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiZ2F0ZWtlZXBlcmQuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIEFMT0dJKCJTdGFydGluZyBnYXRla2VlcGVyZC4uLiIpOworICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICBBTE9HRSgiQSBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQhIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoY2hkaXIoYXJndlsxXSkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoImNoZGlyOiAlczogJXMiLCBhcmd2WzFdLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU2VydmljZU1hbmFnZXI+IHNtID0gYW5kcm9pZDo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6R2F0ZUtlZXBlclByb3h5PiBwcm94eSA9IG5ldyBhbmRyb2lkOjpHYXRlS2VlcGVyUHJveHkoKTsKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXQgPSBzbS0+YWRkU2VydmljZSgKKyAgICAgICAgICAgIGFuZHJvaWQ6OlN0cmluZzE2KCJhbmRyb2lkLnNlcnZpY2UuZ2F0ZWtlZXBlci5JR2F0ZUtlZXBlclNlcnZpY2UiKSwgcHJveHkpOworICAgIGlmIChyZXQgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkbid0IHJlZ2lzdGVyIGJpbmRlciBzZXJ2aWNlISIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlJ3JlIHRoZSBvbmx5IHRocmVhZCBpbiBleGlzdGVuY2UsIHNvIHdlJ3JlIGp1c3QgZ29pbmcgdG8gcHJvY2VzcworICAgICAqIEJpbmRlciB0cmFuc2FjdGlvbiBhcyBhIHNpbmdsZS10aHJlYWRlZCBwcm9ncmFtLgorICAgICAqLworICAgIGFuZHJvaWQ6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9oZWFsdGhkL0FuZHJvaWQuYnAgYi9oZWFsdGhkL0FuZHJvaWQuYnAKaW5kZXggMjM1MzAzZi4uZTE1OGUwNyAxMDA2NDQKLS0tIGEvaGVhbHRoZC9BbmRyb2lkLmJwCisrKyBiL2hlYWx0aGQvQW5kcm9pZC5icApAQCAtNzYsNyArNzYsNyBAQAogICAgIGRlZmF1bHRzOiBbImxpYmJhdHRlcnltb25pdG9yX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJCYXR0ZXJ5TW9uaXRvci5jcHAiXSwKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjItbmRrIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLVYzLW5kayIsCiAgICAgXSwKICAgICB3aG9sZV9zdGF0aWNfbGliczogWwogICAgICAgICAvLyBOZWVkIHRvIHRyYW5zbGF0ZSBISURMIHRvIEFJREwgdG8gc3VwcG9ydCBsZWdhY3kgQVBJcyBpbgpAQCAtMTAwLDQ0ICsxMDAsNiBAQAogICAgIF0sCiB9CiAKLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLXNlcnZpY2VfZGVmYXVsdHMiLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDIuMC1pbXBsIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDEuMC1jb252ZXJ0IiwKLSAgICAgICAgImxpYmhlYWx0aHNlcnZpY2UiLAotICAgICAgICAibGliaGVhbHRoc3RvcmFnZWRlZmF1bHQiLAotICAgICAgICAibGliYmF0dGVyeW1vbml0b3IiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDIuMCIsCi0gICAgXSwKLX0KLQotY2NfYmluYXJ5IHsKLSAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLXNlcnZpY2UiLAotICAgIGRlZmF1bHRzOiBbImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDIuMC1zZXJ2aWNlX2RlZmF1bHRzIl0sCi0KLSAgICB2ZW5kb3I6IHRydWUsCi0gICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAotICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLXNlcnZpY2UucmMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJIZWFsdGhTZXJ2aWNlRGVmYXVsdC5jcHAiLAotICAgIF0sCi19Ci0KIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGliaGVhbHRoZF9jaGFyZ2VyX25vcHMiLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTIwMywxMiArMTY1LDEyIEBACiAgICAgZGVmYXVsdHM6IFsibGliaGVhbHRoZF9jaGFyZ2VyX3VpX2RlZmF1bHRzIl0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjItbmRrIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLVYzLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC10cmFuc2xhdGUtbmRrIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjItbmRrIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLVYzLW5kayIsCiAgICAgXSwKIH0KIApAQCAtMjgwLDcgKzI0Miw3IEBACiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgLy8gY29tbW9uCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAxLjAtY29udmVydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC1WMi1uZGsiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjMtbmRrIiwKICAgICAgICAgImxpYmJhdHRlcnltb25pdG9yIiwKICAgICAgICAgImxpYmNoYXJnZXJfc3lzcHJvcCIsCiAgICAgICAgICJsaWJoZWFsdGhkX2NoYXJnZXJfbm9wcyIsCmRpZmYgLS1naXQgYS9oZWFsdGhkL0JhdHRlcnlNb25pdG9yLmNwcCBiL2hlYWx0aGQvQmF0dGVyeU1vbml0b3IuY3BwCmluZGV4IGJkNzk1NWEuLmI4YmI1ODYgMTAwNjQ0Ci0tLSBhL2hlYWx0aGQvQmF0dGVyeU1vbml0b3IuY3BwCisrKyBiL2hlYWx0aGQvQmF0dGVyeU1vbml0b3IuY3BwCkBAIC01OSw2ICs1OSw3IEBACiB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6aGVhbHRoOjpCYXR0ZXJ5Q2hhcmdpbmdTdGF0ZTsKIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OkJhdHRlcnlIZWFsdGg7CiB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6aGVhbHRoOjpCYXR0ZXJ5SGVhbHRoRGF0YTsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OkJhdHRlcnlQYXJ0U3RhdHVzOwogdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6QmF0dGVyeVN0YXR1czsKIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OkhlYWx0aEluZm87CiAKQEAgLTIxOSw2ICsyMjAsNyBAQAogICAgICAgICAgICAgeyJXYXJtIiwgQmF0dGVyeUhlYWx0aDo6R09PRH0sCiAgICAgICAgICAgICB7IkNvb2wiLCBCYXR0ZXJ5SGVhbHRoOjpHT09EfSwKICAgICAgICAgICAgIHsiSG90IiwgQmF0dGVyeUhlYWx0aDo6T1ZFUkhFQVR9LAorICAgICAgICAgICAgeyJDYWxpYnJhdGlvbiByZXF1aXJlZCIsIEJhdHRlcnlIZWFsdGg6OklOQ09OU0lTVEVOVH0sCiAgICAgICAgICAgICB7TlVMTCwgQmF0dGVyeUhlYWx0aDo6VU5LTk9XTn0sCiAgICAgfTsKIApAQCAtMzYxLDcgKzM2Myw3IEBACiB2b2lkIEJhdHRlcnlNb25pdG9yOjp1cGRhdGVWYWx1ZXModm9pZCkgewogICAgIGluaXRIZWFsdGhJbmZvKG1IZWFsdGhJbmZvLmdldCgpKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5UHJlc2VudCA9IGdldEJvb2xlYW5GaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoKTsKICAgICBlbHNlCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5UHJlc2VudCA9IG1CYXR0ZXJ5RGV2aWNlUHJlc2VudDsKQEAgLTM3MSw0MyArMzczLDQzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aCk7CiAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlWb2x0YWdlTWlsbGl2b2x0cyA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGgpIC8gMTAwMDsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q3VycmVudE1pY3JvYW1wcyA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlGdWxsQ2hhcmdlVWFoID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5lbXB0eSgpKQogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUN5Y2xlQ291bnQgPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclVhaCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5lbXB0eSgpKQogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUN1cnJlbnRBdmVyYWdlTWljcm9hbXBzID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1NlY29uZHMgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFN0YXR1c1BhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhTdGF0dXNQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1CYXR0ZXJ5SGVhbHRoU3RhdHVzID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhTdGF0dXNQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0ZU9mSGVhbHRoUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5SGVhbHRoRGF0YS0+YmF0dGVyeVN0YXRlT2ZIZWFsdGggPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aFBhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlUGF0aC5lbXB0eSgpKQogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUhlYWx0aERhdGEtPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVNlY29uZHMgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5TWFudWZhY3R1cmluZ0RhdGVQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlIZWFsdGhEYXRhLT5iYXR0ZXJ5Rmlyc3RVc2FnZVNlY29uZHMgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Rmlyc3RVc2FnZURhdGVQYXRoKTsKIApAQCAtNDMyLDcgKzQzNCw3IEBACiAgICAgfQogCiAgICAgaWYgKHJlYWRGcm9tRmlsZShtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLCAmYnVmKSA+IDApCi0gICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5VGVjaG5vbG9neSA9IFN0cmluZzgoYnVmLmNfc3RyKCkpOworICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeVRlY2hub2xvZ3kgPSBidWY7CiAKICAgICBpZiAocmVhZEZyb21GaWxlKG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGgsICZidWYpID4gMCkKICAgICAgICAgbUhlYWx0aEluZm8tPmNoYXJnaW5nUG9saWN5ID0gZ2V0QmF0dGVyeUNoYXJnaW5nUG9saWN5KGJ1Zi5jX3N0cigpKTsKQEAgLTQ0NCwxMiArNDQ2LDEwIEBACiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFyZ2VyTmFtZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgU3RyaW5nOCBwYXRoOwotICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvb25saW5lIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOworICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvb25saW5lIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CiAgICAgICAgIGlmIChnZXRJbnRGaWVsZChwYXRoKSkgewogICAgICAgICAgICAgcGF0aC5jbGVhcigpOwotICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3R5cGUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOworICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3R5cGUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbUNoYXJnZXJOYW1lc1tpXS5jX3N0cigpKTsKICAgICAgICAgICAgIHN3aXRjaChyZWFkUG93ZXJTdXBwbHlUeXBlKHBhdGgpKSB7CiAgICAgICAgICAgICBjYXNlIEFORFJPSURfUE9XRVJfU1VQUExZX1RZUEVfQUM6CiAgICAgICAgICAgICAgICAgbUhlYWx0aEluZm8tPmNoYXJnZXJBY09ubGluZSA9IHRydWU7CkBAIC00NjYsMjYgKzQ2NiwyNCBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2lzX2RvY2siLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguc3RyaW5nKCksIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aEluZm8tPmNoYXJnZXJEb2NrT25saW5lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiJXM6IFVua25vd24gcG93ZXIgc3VwcGx5IHR5cGVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY3VycmVudF9tYXgiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOwotICAgICAgICAgICAgaW50IENoYXJnaW5nQ3VycmVudCA9Ci0gICAgICAgICAgICAgICAgICAgIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkgPyBnZXRJbnRGaWVsZChwYXRoKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgaW50IENoYXJnaW5nQ3VycmVudCA9IChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSA/IGdldEludEZpZWxkKHBhdGgpIDogMDsKIAogICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3ZvbHRhZ2VfbWF4IiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CiAKICAgICAgICAgICAgIGludCBDaGFyZ2luZ1ZvbHRhZ2UgPQotICAgICAgICAgICAgICAgIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkgPyBnZXRJbnRGaWVsZChwYXRoKSA6Ci0gICAgICAgICAgICAgICAgREVGQVVMVF9WQlVTX1ZPTFRBR0U7CisgICAgICAgICAgICAgICAgICAgIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSA/IGdldEludEZpZWxkKHBhdGgpIDogREVGQVVMVF9WQlVTX1ZPTFRBR0U7CiAKICAgICAgICAgICAgIGRvdWJsZSBwb3dlciA9ICgoZG91YmxlKUNoYXJnaW5nQ3VycmVudCAvIE1JTExJT04pICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKUNoYXJnaW5nVm9sdGFnZSAvIE1JTExJT04pOwpAQCAtNTEwLDE3ICs1MDgsMTcgQEAKICAgICAgICAgICAgICAgICAgcHJvcHMuYmF0dGVyeVN0YXR1cyk7CiAKICAgICAgICAgbGVuID0gc3RybGVuKGRtZXNnbGluZSk7Ci0gICAgICAgIGlmICghaGVhbHRoZF9jb25maWcuYmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlDdXJyZW50Tm93UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYoZG1lc2dsaW5lICsgbGVuLCBzaXplb2YoZG1lc2dsaW5lKSAtIGxlbiwgIiBjPSVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5iYXR0ZXJ5Q3VycmVudE1pY3JvYW1wcyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFoZWFsdGhkX2NvbmZpZy5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgbGVuICs9IHNucHJpbnRmKGRtZXNnbGluZSArIGxlbiwgc2l6ZW9mKGRtZXNnbGluZSkgLSBsZW4sICIgZmM9JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmJhdHRlcnlGdWxsQ2hhcmdlVWFoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghaGVhbHRoZF9jb25maWcuYmF0dGVyeUN5Y2xlQ291bnRQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlDeWNsZUNvdW50UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYoZG1lc2dsaW5lICsgbGVuLCBzaXplb2YoZG1lc2dsaW5lKSAtIGxlbiwgIiBjYz0lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuYmF0dGVyeUN5Y2xlQ291bnQpOwogICAgICAgICB9CkBAIC01NTQsNyArNTUyLDcgQEAKIAogaW50IEJhdHRlcnlNb25pdG9yOjpnZXRDaGFyZ2VTdGF0dXMoKSB7CiAgICAgQmF0dGVyeVN0YXR1cyByZXN1bHQgPSBCYXR0ZXJ5U3RhdHVzOjpVTktOT1dOOwotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmlzRW1wdHkoKSkgeworICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgYnVmOwogICAgICAgICBpZiAocmVhZEZyb21GaWxlKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aCwgJmJ1ZikgPiAwKQogICAgICAgICAgICAgcmVzdWx0ID0gZ2V0QmF0dGVyeVN0YXR1cyhidWYuY19zdHIoKSk7CkBAIC01NjUsNyArNTYzLDcgQEAKIHN0YXR1c190IEJhdHRlcnlNb25pdG9yOjpzZXRDaGFyZ2luZ1BvbGljeShpbnQgdmFsdWUpIHsKICAgICBzdGF0dXNfdCByZXQgPSBOQU1FX05PVF9GT1VORDsKICAgICBib29sIHJlc3VsdDsKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgcmVzdWx0ID0gd3JpdGVUb0ZpbGUobUhlYWx0aGRDb25maWctPmNoYXJnaW5nUG9saWN5UGF0aCwgdmFsdWUpOwogICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJzZXRDaGFyZ2luZ1BvbGljeSBmYWlsXG4iKTsKQEAgLTU3OSw3ICs1NzcsNyBAQAogCiBpbnQgQmF0dGVyeU1vbml0b3I6OmdldENoYXJnaW5nUG9saWN5KCkgewogICAgIEJhdHRlcnlDaGFyZ2luZ1BvbGljeSByZXN1bHQgPSBCYXR0ZXJ5Q2hhcmdpbmdQb2xpY3k6OkRFRkFVTFQ7Ci0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLmlzRW1wdHkoKSkgeworICAgIGlmICghbUhlYWx0aGRDb25maWctPmNoYXJnaW5nUG9saWN5UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1ZjsKICAgICAgICAgaWYgKHJlYWRGcm9tRmlsZShtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLCAmYnVmKSA+IDApCiAgICAgICAgICAgICByZXN1bHQgPSBnZXRCYXR0ZXJ5Q2hhcmdpbmdQb2xpY3koYnVmLmNfc3RyKCkpOwpAQCAtNTg5LDE3ICs1ODcsMjAgQEAKIAogaW50IEJhdHRlcnlNb25pdG9yOjpnZXRCYXR0ZXJ5SGVhbHRoRGF0YShpbnQgaWQpIHsKICAgICBpZiAoaWQgPT0gQkFUVEVSWV9QUk9QX01BTlVGQUNUVVJJTkdfREFURSkgewotICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5TWFudWZhY3R1cmluZ0RhdGVQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5TWFudWZhY3R1cmluZ0RhdGVQYXRoKTsKICAgICB9CiAgICAgaWYgKGlkID09IEJBVFRFUllfUFJPUF9GSVJTVF9VU0FHRV9EQVRFKSB7Ci0gICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Rmlyc3RVc2FnZURhdGVQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGgpOwogICAgIH0KICAgICBpZiAoaWQgPT0gQkFUVEVSWV9QUk9QX1NUQVRFX09GX0hFQUxUSCkgewotICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aFBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aFBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIHJldHVybiBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoKTsKICAgICB9CisgICAgaWYgKGlkID09IEJBVFRFUllfUFJPUF9QQVJUX1NUQVRVUykgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihCYXR0ZXJ5UGFydFN0YXR1czo6VU5TVVBQT1JURUQpOworICAgIH0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjExLDcgKzYxMiw3IEBACiAKICAgICBzd2l0Y2goaWQpIHsKICAgICBjYXNlIEJBVFRFUllfUFJPUF9DSEFSR0VfQ09VTlRFUjoKLSAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgdmFsLT52YWx1ZUludDY0ID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoKTsKICAgICAgICAgICAgIHJldCA9IE9LOwpAQCAtNjIxLDcgKzYyMiw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBCQVRURVJZX1BST1BfQ1VSUkVOVF9OT1c6Ci0gICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHZhbC0+dmFsdWVJbnQ2NCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aCk7CiAgICAgICAgICAgICByZXQgPSBPSzsKQEAgLTYzMSw3ICs2MzIsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQkFUVEVSWV9QUk9QX0NVUlJFTlRfQVZHOgotICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICB2YWwtPnZhbHVlSW50NjQgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGgpOwogICAgICAgICAgICAgcmV0ID0gT0s7CkBAIC02NDEsNyArNjQyLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEJBVFRFUllfUFJPUF9DQVBBQ0lUWToKLSAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICB2YWwtPnZhbHVlSW50NjQgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoKTsKICAgICAgICAgICAgIHJldCA9IE9LOwpAQCAtNjgzLDYgKzY4NCwxMSBAQAogICAgICAgICByZXQgPSBPSzsKICAgICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIEJBVFRFUllfUFJPUF9QQVJUX1NUQVRVUzoKKyAgICAgICAgdmFsLT52YWx1ZUludDY0ID0gZ2V0QmF0dGVyeUhlYWx0aERhdGEoQkFUVEVSWV9QUk9QX1BBUlRfU1RBVFVTKTsKKyAgICAgICAgcmV0ID0gT0s7CisgICAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNjkwLDYgKzY5NiwxMSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXR1c190IEJhdHRlcnlNb25pdG9yOjpnZXRTZXJpYWxOdW1iZXIoc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIG91dCkgeworICAgICpvdXQgPSBzdGQ6Om51bGxvcHQ7CisgICAgcmV0dXJuIE9LOworfQorCiB2b2lkIEJhdHRlcnlNb25pdG9yOjpkdW1wU3RhdGUoaW50IGZkKSB7CiAgICAgaW50IHY7CiAgICAgY2hhciB2c1sxMjhdOwpAQCAtNzA4LDM1ICs3MTksMzUgQEAKICAgICAgICAgICAgICBwcm9wcy5iYXR0ZXJ5Vm9sdGFnZU1pbGxpdm9sdHMsIHByb3BzLmJhdHRlcnlUZW1wZXJhdHVyZVRlbnRoc0NlbHNpdXMpOwogICAgIHdyaXRlKGZkLCB2cywgc3RybGVuKHZzKSk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgdiA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGgpOwogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgImN1cnJlbnQgbm93OiAlZFxuIiwgdik7CiAgICAgICAgIHdyaXRlKGZkLCB2cywgc3RybGVuKHZzKSk7CiAgICAgfQogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoLmlzRW1wdHkoKSkgeworICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgIHYgPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoKTsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJjdXJyZW50IGF2ZzogJWRcbiIsIHYpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguZW1wdHkoKSkgewogICAgICAgICB2ID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aCk7CiAgICAgICAgIHNucHJpbnRmKHZzLCBzaXplb2YodnMpLCAiY2hhcmdlIGNvdW50ZXI6ICVkXG4iLCB2KTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJjdXJyZW50IG5vdzogJWRcbiIsIHByb3BzLmJhdHRlcnlDdXJyZW50TWljcm9hbXBzKTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJjeWNsZSBjb3VudDogJWRcbiIsIHByb3BzLmJhdHRlcnlDeWNsZUNvdW50KTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJGdWxsIGNoYXJnZTogJWRcbiIsIHByb3BzLmJhdHRlcnlGdWxsQ2hhcmdlVWFoKTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CkBAIC03NzUsOCArNzg2LDcgQEAKICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9QT1dFUl9TVVBQTFlfVFlQRV9ET0NLOgogICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvb25saW5lIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lcy5hZGQoU3RyaW5nOChuYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIG1DaGFyZ2VyTmFtZXMuYWRkKFN0cmluZzgobmFtZSkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIEFORFJPSURfUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWToKQEAgLTc4NywxNjYgKzc5NywxNjggQEAKICAgICAgICAgICAgICAgICBpZiAoaXNTY29wZWRQb3dlclN1cHBseShuYW1lKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlEZXZpY2VQcmVzZW50ID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3N0YXR1cyIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvaGVhbHRoIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3ByZXNlbnQiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5UHJlc2VudFBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2NhcGFjaXR5IiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy92b2x0YWdlX25vdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVZvbHRhZ2VQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2hhcmdlX2Z1bGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2N1cnJlbnRfbm93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jeWNsZV9jb3VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2FwYWNpdHlfbGV2ZWwiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eUxldmVsUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdGltZV90b19mdWxsX25vdyIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2NoYXJnZV9mdWxsX2Rlc2lnbiIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jdXJyZW50X2F2ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2hhcmdlX2NvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZW1wZXJhdHVyZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVtcGVyYXR1cmVQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdGVtcCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlbXBlcmF0dXJlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZWNobm9sb2d5UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZWNobm9sb2d5UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3RlY2hub2xvZ3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0ZU9mSGVhbHRoUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0ZU9mSGVhbHRoUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3N0YXRlX29mX2hlYWx0aCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9oZWFsdGhfaW5kZXgiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFN0YXR1c1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoU3RhdHVzUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2hlYWx0aF9zdGF0dXMiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhTdGF0dXNQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoU3RhdHVzUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5TWFudWZhY3R1cmluZ0RhdGVQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvbWFudWZhY3R1cmluZ19kYXRlIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9maXJzdF91c2FnZV9kYXRlIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Rmlyc3RVc2FnZURhdGVQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Rmlyc3RVc2FnZURhdGVQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdTdGF0ZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1N0YXRlUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2NoYXJnaW5nX3N0YXRlIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApIG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1N0YXRlUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdTdGF0ZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2hhcmdpbmdfcG9saWN5IiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApIG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmNoYXJnaW5nUG9saWN5UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC05NTgsMTIgKzk3MCwxMCBAQAogICAgICAgICAgICAgLy8gTG9vayBmb3IgImlzX2RvY2siIGZpbGUKICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9pc19kb2NrIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLnN0cmluZygpLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgewogICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvb25saW5lIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lcy5hZGQoU3RyaW5nOChuYW1lKSk7Ci0KKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUNoYXJnZXJOYW1lcy5hZGQoU3RyaW5nOChuYW1lKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC05NzUsNDMgKzk4NSw0MyBAQAogICAgICAgICBoYy0+cGVyaW9kaWNfY2hvcmVzX2ludGVydmFsX2Zhc3QgPSAtMTsKICAgICAgICAgaGMtPnBlcmlvZGljX2Nob3Jlc19pbnRlcnZhbF9zbG93ID0gLTE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeVN0YXR1c1BhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeUhlYWx0aFBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5UHJlc2VudFBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5UHJlc2VudFBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlDYXBhY2l0eVBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5Vm9sdGFnZVBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVtcGVyYXR1cmVQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVtcGVyYXR1cmVQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlUZW1wZXJhdHVyZVBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVjaG5vbG9neVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZWNobm9sb2d5UGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5VGVjaG5vbG9neVBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5Q3VycmVudE5vd1BhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5RnVsbENoYXJnZVBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5Q3ljbGVDb3VudFBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eUxldmVsUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJiYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGggbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJiYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoLiBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0ZU9mSGVhbHRoUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImJhdHRlcnlTdGF0ZU9mSGVhbHRoUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhTdGF0dXNQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoU3RhdHVzUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJiYXR0ZXJ5SGVhbHRoU3RhdHVzUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiYmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiYmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmNoYXJnaW5nU3RhdGVQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1N0YXRlUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJjaGFyZ2luZ1N0YXRlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmNoYXJnaW5nUG9saWN5UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImNoYXJnaW5nUG9saWN5UGF0aCBub3QgZm91bmRcbiIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvaGVhbHRoZC9CYXR0ZXJ5TW9uaXRvcl92MS5jcHAgYi9oZWFsdGhkL0JhdHRlcnlNb25pdG9yX3YxLmNwcAppbmRleCBiODdjNDkzLi4yZTBjZmM5IDEwMDY0NAotLS0gYS9oZWFsdGhkL0JhdHRlcnlNb25pdG9yX3YxLmNwcAorKysgYi9oZWFsdGhkL0JhdHRlcnlNb25pdG9yX3YxLmNwcApAQCAtMzAxLDcgKzMwMSw3IEBACiB2b2lkIEJhdHRlcnlNb25pdG9yOjp1cGRhdGVWYWx1ZXModm9pZCkgewogICAgIGluaXRIZWFsdGhJbmZvKG1IZWFsdGhJbmZvLmdldCgpKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5UHJlc2VudCA9IGdldEJvb2xlYW5GaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoKTsKICAgICBlbHNlCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5UHJlc2VudCA9IG1CYXR0ZXJ5RGV2aWNlUHJlc2VudDsKQEAgLTMxMSwyOCArMzExLDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aCk7CiAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlWb2x0YWdlTWlsbGl2b2x0cyA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGgpIC8gMTAwMDsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q3VycmVudE1pY3JvYW1wcyA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlGdWxsQ2hhcmdlVWFoID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5lbXB0eSgpKQogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUN5Y2xlQ291bnQgPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclVhaCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5lbXB0eSgpKQogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUN1cnJlbnRBdmVyYWdlTWljcm9hbXBzID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1NlY29uZHMgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGgpOwogCkBAIC0zNTIsMTggKzM1MiwxNiBAQAogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUhlYWx0aCA9IGdldEJhdHRlcnlIZWFsdGgoYnVmLmNfc3RyKCkpOwogCiAgICAgaWYgKHJlYWRGcm9tRmlsZShtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLCAmYnVmKSA+IDApCi0gICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5VGVjaG5vbG9neSA9IFN0cmluZzgoYnVmLmNfc3RyKCkpOworICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeVRlY2hub2xvZ3kgPSBidWY7CiAKICAgICBkb3VibGUgTWF4UG93ZXIgPSAwOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhcmdlck5hbWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIFN0cmluZzggcGF0aDsKLSAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL29ubGluZSIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKKyAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL29ubGluZSIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBtQ2hhcmdlck5hbWVzW2ldLmNfc3RyKCkpOwogICAgICAgICBpZiAoZ2V0SW50RmllbGQocGF0aCkpIHsKICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKLSAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy90eXBlIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKKyAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy90eXBlIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CiAgICAgICAgICAgICBzd2l0Y2gocmVhZFBvd2VyU3VwcGx5VHlwZShwYXRoKSkgewogICAgICAgICAgICAgY2FzZSBBTkRST0lEX1BPV0VSX1NVUFBMWV9UWVBFX0FDOgogICAgICAgICAgICAgICAgIG1IZWFsdGhJbmZvLT5jaGFyZ2VyQWNPbmxpbmUgPSB0cnVlOwpAQCAtMzgwLDI2ICszNzgsMjQgQEAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9pc19kb2NrIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLnN0cmluZygpLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhJbmZvLT5jaGFyZ2VyRG9ja09ubGluZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIiVzOiBVbmtub3duIHBvd2VyIHN1cHBseSB0eXBlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2N1cnJlbnRfbWF4IiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKLSAgICAgICAgICAgIGludCBDaGFyZ2luZ0N1cnJlbnQgPQotICAgICAgICAgICAgICAgICAgICAoYWNjZXNzKHBhdGguc3RyaW5nKCksIFJfT0spID09IDApID8gZ2V0SW50RmllbGQocGF0aCkgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgIGludCBDaGFyZ2luZ0N1cnJlbnQgPSAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgPyBnZXRJbnRGaWVsZChwYXRoKSA6IDA7CiAKICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy92b2x0YWdlX21heCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLmNfc3RyKCkpOwogCiAgICAgICAgICAgICBpbnQgQ2hhcmdpbmdWb2x0YWdlID0KLSAgICAgICAgICAgICAgICAoYWNjZXNzKHBhdGguc3RyaW5nKCksIFJfT0spID09IDApID8gZ2V0SW50RmllbGQocGF0aCkgOgotICAgICAgICAgICAgICAgIERFRkFVTFRfVkJVU19WT0xUQUdFOworICAgICAgICAgICAgICAgICAgICAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgPyBnZXRJbnRGaWVsZChwYXRoKSA6IERFRkFVTFRfVkJVU19WT0xUQUdFOwogCiAgICAgICAgICAgICBkb3VibGUgcG93ZXIgPSAoKGRvdWJsZSlDaGFyZ2luZ0N1cnJlbnQgLyBNSUxMSU9OKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSlDaGFyZ2luZ1ZvbHRhZ2UgLyBNSUxMSU9OKTsKQEAgLTQyNCwxNyArNDIwLDE3IEBACiAgICAgICAgICAgICAgICAgIHByb3BzLmJhdHRlcnlTdGF0dXMpOwogCiAgICAgICAgIGxlbiA9IHN0cmxlbihkbWVzZ2xpbmUpOwotICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFoZWFsdGhkX2NvbmZpZy5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgbGVuICs9IHNucHJpbnRmKGRtZXNnbGluZSArIGxlbiwgc2l6ZW9mKGRtZXNnbGluZSkgLSBsZW4sICIgYz0lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuYmF0dGVyeUN1cnJlbnRNaWNyb2FtcHMpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFoZWFsdGhkX2NvbmZpZy5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghaGVhbHRoZF9jb25maWcuYmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGxlbiArPSBzbnByaW50ZihkbWVzZ2xpbmUgKyBsZW4sIHNpemVvZihkbWVzZ2xpbmUpIC0gbGVuLCAiIGZjPSVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5iYXR0ZXJ5RnVsbENoYXJnZVVhaCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFoZWFsdGhkX2NvbmZpZy5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgbGVuICs9IHNucHJpbnRmKGRtZXNnbGluZSArIGxlbiwgc2l6ZW9mKGRtZXNnbGluZSkgLSBsZW4sICIgY2M9JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmJhdHRlcnlDeWNsZUNvdW50KTsKICAgICAgICAgfQpAQCAtNDY4LDcgKzQ2NCw3IEBACiAKIGludCBCYXR0ZXJ5TW9uaXRvcjo6Z2V0Q2hhcmdlU3RhdHVzKCkgewogICAgIEJhdHRlcnlTdGF0dXMgcmVzdWx0ID0gQmF0dGVyeVN0YXR1czo6VU5LTk9XTjsKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1ZjsKICAgICAgICAgaWYgKHJlYWRGcm9tRmlsZShtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGgsICZidWYpID4gMCkKICAgICAgICAgICAgIHJlc3VsdCA9IGdldEJhdHRlcnlTdGF0dXMoYnVmLmNfc3RyKCkpOwpAQCAtNDg0LDcgKzQ4MCw3IEBACiAKICAgICBzd2l0Y2goaWQpIHsKICAgICBjYXNlIEJBVFRFUllfUFJPUF9DSEFSR0VfQ09VTlRFUjoKLSAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgdmFsLT52YWx1ZUludDY0ID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoKTsKICAgICAgICAgICAgIHJldCA9IE9LOwpAQCAtNDk0LDcgKzQ5MCw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBCQVRURVJZX1BST1BfQ1VSUkVOVF9OT1c6Ci0gICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHZhbC0+dmFsdWVJbnQ2NCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aCk7CiAgICAgICAgICAgICByZXQgPSBPSzsKQEAgLTUwNCw3ICs1MDAsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQkFUVEVSWV9QUk9QX0NVUlJFTlRfQVZHOgotICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICB2YWwtPnZhbHVlSW50NjQgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGgpOwogICAgICAgICAgICAgcmV0ID0gT0s7CkBAIC01MTQsNyArNTEwLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEJBVFRFUllfUFJPUF9DQVBBQ0lUWToKLSAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICB2YWwtPnZhbHVlSW50NjQgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoKTsKICAgICAgICAgICAgIHJldCA9IE9LOwpAQCAtNTYxLDM1ICs1NTcsMzUgQEAKICAgICAgICAgICAgICBwcm9wcy5iYXR0ZXJ5Vm9sdGFnZU1pbGxpdm9sdHMsIHByb3BzLmJhdHRlcnlUZW1wZXJhdHVyZVRlbnRoc0NlbHNpdXMpOwogICAgIHdyaXRlKGZkLCB2cywgc3RybGVuKHZzKSk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgdiA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGgpOwogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgImN1cnJlbnQgbm93OiAlZFxuIiwgdik7CiAgICAgICAgIHdyaXRlKGZkLCB2cywgc3RybGVuKHZzKSk7CiAgICAgfQogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoLmlzRW1wdHkoKSkgeworICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgIHYgPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoKTsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJjdXJyZW50IGF2ZzogJWRcbiIsIHYpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguZW1wdHkoKSkgewogICAgICAgICB2ID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aCk7CiAgICAgICAgIHNucHJpbnRmKHZzLCBzaXplb2YodnMpLCAiY2hhcmdlIGNvdW50ZXI6ICVkXG4iLCB2KTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJjdXJyZW50IG5vdzogJWRcbiIsIHByb3BzLmJhdHRlcnlDdXJyZW50TWljcm9hbXBzKTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJjeWNsZSBjb3VudDogJWRcbiIsIHByb3BzLmJhdHRlcnlDeWNsZUNvdW50KTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJGdWxsIGNoYXJnZTogJWRcbiIsIHByb3BzLmJhdHRlcnlGdWxsQ2hhcmdlVWFoKTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CkBAIC02MjgsOCArNjI0LDcgQEAKICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9QT1dFUl9TVVBQTFlfVFlQRV9ET0NLOgogICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvb25saW5lIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lcy5hZGQoU3RyaW5nOChuYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIG1DaGFyZ2VyTmFtZXMuYWRkKFN0cmluZzgobmFtZSkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIEFORFJPSURfUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWToKQEAgLTY0MCwxMjEgKzYzNSwxMTkgQEAKICAgICAgICAgICAgICAgICBpZiAoaXNTY29wZWRQb3dlclN1cHBseShuYW1lKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlEZXZpY2VQcmVzZW50ID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3N0YXR1cyIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvaGVhbHRoIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3ByZXNlbnQiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5UHJlc2VudFBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2NhcGFjaXR5IiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy92b2x0YWdlX25vdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVZvbHRhZ2VQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2hhcmdlX2Z1bGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2N1cnJlbnRfbm93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jeWNsZV9jb3VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2FwYWNpdHlfbGV2ZWwiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eUxldmVsUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdGltZV90b19mdWxsX25vdyIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2NoYXJnZV9mdWxsX2Rlc2lnbiIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jdXJyZW50X2F2ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2hhcmdlX2NvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZW1wZXJhdHVyZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVtcGVyYXR1cmVQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdGVtcCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlbXBlcmF0dXJlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZWNobm9sb2d5UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZWNobm9sb2d5UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3RlY2hub2xvZ3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc2NywxMiArNzYwLDEwIEBACiAgICAgICAgICAgICAvLyBMb29rIGZvciAiaXNfZG9jayIgZmlsZQogICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2lzX2RvY2siLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguc3RyaW5nKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9vbmxpbmUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLnN0cmluZygpLCBSX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzLmFkZChTdHJpbmc4KG5hbWUpKTsKLQorICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtQ2hhcmdlck5hbWVzLmFkZChTdHJpbmc4KG5hbWUpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTc4NCwzMSArNzc1LDMxIEBACiAgICAgICAgIGhjLT5wZXJpb2RpY19jaG9yZXNfaW50ZXJ2YWxfZmFzdCA9IC0xOwogICAgICAgICBoYy0+cGVyaW9kaWNfY2hvcmVzX2ludGVydmFsX3Nsb3cgPSAtMTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5U3RhdHVzUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5SGVhbHRoUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlQcmVzZW50UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeUNhcGFjaXR5UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVZvbHRhZ2VQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlWb2x0YWdlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZW1wZXJhdHVyZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZW1wZXJhdHVyZVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeVRlbXBlcmF0dXJlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZWNobm9sb2d5UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlUZWNobm9sb2d5UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlDdXJyZW50Tm93UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlGdWxsQ2hhcmdlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlDeWNsZUNvdW50UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eUxldmVsUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImJhdHRlcnlDYXBhY2l0eUxldmVsUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aC4gbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiYmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguIG5vdCBmb3VuZFxuIik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9oZWFsdGhkL0hlYWx0aFNlcnZpY2VEZWZhdWx0LmNwcCBiL2hlYWx0aGQvSGVhbHRoU2VydmljZURlZmF1bHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWVjYzJmLi4wMDAwMDAwCi0tLSBhL2hlYWx0aGQvSGVhbHRoU2VydmljZURlZmF1bHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxoZWFsdGgyL3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxoZWFsdGhkL2hlYWx0aGQuaD4KLQotdm9pZCBoZWFsdGhkX2JvYXJkX2luaXQoc3RydWN0IGhlYWx0aGRfY29uZmlnKikgewotICAgIC8vIEltcGxlbWVudGF0aW9uLWRlZmluZWQgaW5pdCBsb2dpYyBnb2VzIGhlcmUuCi0gICAgLy8gMS4gY29uZmlnLT5wZXJpb2RpY19jaG9yZXNfaW50ZXJ2YWxfKiB2YXJpYWJsZXMKLSAgICAvLyAyLiBjb25maWctPmJhdHRlcnkqUGF0aCB2YXJpYWJsZXMKLSAgICAvLyAzLiBjb25maWctPmVuZXJneUNvdW50ZXIuIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGVuZXJneUNvdW50ZXIgaXMgbm90IGRlZmluZWQuCi0KLSAgICAvLyB1c2UgZGVmYXVsdHMKLX0KLQotaW50IGhlYWx0aGRfYm9hcmRfYmF0dGVyeV91cGRhdGUoc3RydWN0IGFuZHJvaWQ6OkJhdHRlcnlQcm9wZXJ0aWVzKikgewotICAgIC8vIEltcGxlbWVudGF0aW9uLWRlZmluZWQgdXBkYXRlIGxvZ2ljIGdvZXMgaGVyZS4gQW4gaW1wbGVtZW50YXRpb24KLSAgICAvLyBjYW4gbWFrZSBtb2RpZmljYXRpb25zIHRvIHByb3AgYmVmb3JlIGJyb2FkY2FzdGluZyBpdCB0byBhbGwgY2FsbGJhY2tzLgotCi0gICAgLy8gcmV0dXJuIDAgdG8gbG9nIHBlcmlvZGljIHBvbGxlZCBiYXR0ZXJ5IHN0YXR1cyB0byBrZXJuZWwgbG9nCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBtYWluKCkgewotICAgIHJldHVybiBoZWFsdGhfc2VydmljZV9tYWluKCk7Ci19CmRpZmYgLS1naXQgYS9oZWFsdGhkL2FuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDIuMC1zZXJ2aWNlLnJjIGIvaGVhbHRoZC9hbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAtc2VydmljZS5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyNzcxZS4uMDAwMDAwMAotLS0gYS9oZWFsdGhkL2FuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDIuMC1zZXJ2aWNlLnJjCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zZXJ2aWNlIGhlYWx0aC1oYWwtMi0wIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDIuMC1zZXJ2aWNlCi0gICAgY2xhc3MgaGFsCi0gICAgdXNlciBzeXN0ZW0KLSAgICBncm91cCBzeXN0ZW0KLSAgICBjYXBhYmlsaXRpZXMgV0FLRV9BTEFSTSBCTE9DS19TVVNQRU5ECi0gICAgZmlsZSAvZGV2L2ttc2cgdwpkaWZmIC0tZ2l0IGEvaGVhbHRoZC9pbmNsdWRlL2hlYWx0aGQvQmF0dGVyeU1vbml0b3IuaCBiL2hlYWx0aGQvaW5jbHVkZS9oZWFsdGhkL0JhdHRlcnlNb25pdG9yLmgKaW5kZXggZTk5OThiYS4uYjMwNDU4ZCAxMDA2NDQKLS0tIGEvaGVhbHRoZC9pbmNsdWRlL2hlYWx0aGQvQmF0dGVyeU1vbml0b3IuaAorKysgYi9oZWFsdGhkL2luY2x1ZGUvaGVhbHRoZC9CYXR0ZXJ5TW9uaXRvci5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEhFQUxUSERfQkFUVEVSWU1PTklUT1JfSAogCiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgogCiAjaW5jbHVkZSA8YmF0dGVyeXNlcnZpY2UvQmF0dGVyeVNlcnZpY2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC04Niw2ICs4Nyw4IEBACiAgICAgaW50IGdldENoYXJnaW5nUG9saWN5KCk7CiAgICAgaW50IGdldEJhdHRlcnlIZWFsdGhEYXRhKGludCBpZCk7CiAKKyAgICBzdGF0dXNfdCBnZXRTZXJpYWxOdW1iZXIoc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4qIG91dCk7CisKICAgICBzdGF0aWMgdm9pZCBsb2dWYWx1ZXMoY29uc3QgYW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6VjJfMTo6SGVhbHRoSW5mbyYgaGVhbHRoX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBoZWFsdGhkX2NvbmZpZyYgaGVhbHRoZF9jb25maWcpOwogCmRpZmYgLS1naXQgYS9pbml0L0FuZHJvaWQuYnAgYi9pbml0L0FuZHJvaWQuYnAKaW5kZXggN2I1MjkwMy4uYTcyNzhkNiAxMDA2NDQKLS0tIGEvaW5pdC9BbmRyb2lkLmJwCisrKyBiL2luaXQvQW5kcm9pZC5icApAQCAtMTY2LDE2ICsxNjYsMTQgQEAKICAgICAgICAgImxpYmJvb3Rsb2FkZXJfbWVzc2FnZSIsCiAgICAgICAgICJsaWJjKytmcyIsCiAgICAgICAgICJsaWJjZ3JvdXByY19mb3JtYXQiLAotICAgICAgICAibGliZnN2ZXJpdHlfaW5pdCIsCiAgICAgICAgICJsaWJsbWtkX3V0aWxzIiwKICAgICAgICAgImxpYmx6NCIsCi0gICAgICAgICJsaWJtaW5pX2tleWN0bF9zdGF0aWMiLAorICAgICAgICAibGlienN0ZCIsCiAgICAgICAgICJsaWJtb2Rwcm9iZSIsCiAgICAgICAgICJsaWJwcm9jaW5mbyIsCiAgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJwcm9wZXJ0eWluZm9zZXJpYWxpemVyIiwKICAgICAgICAgImxpYnByb3BlcnR5aW5mb3BhcnNlciIsCi0gICAgICAgICJsaWJzaWduaW5ndXRpbHMiLAogICAgICAgICAibGlic25hcHNob3RfY293IiwKICAgICAgICAgImxpYnNuYXBzaG90X2luaXQiLAogICAgICAgICAibGlieG1sMiIsCkBAIC0xODQsMTQgKzE4MiwxMiBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJleHQ0X3V0aWxzIiwKICAgICAgICAgImxpYmZzX21nciIsCiAgICAgICAgICJsaWJnc2kiLAogICAgICAgICAibGliaGlkbC1nZW4tdXRpbHMiLAotICAgICAgICAibGlia2V5dXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmxvZ3dyYXAiLAogICAgICAgICAibGlibHAiLApAQCAtMjAwLDcgKzE5Niw3IEBACiAgICAgICAgICJsaWJzZWxpbnV4IiwKICAgICAgICAgImxpYnVud2luZHN0YWNrIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYnppcGFyY2hpdmUiLAorICAgICAgICAibGlidmVuZG9yc3VwcG9ydCIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWyJiaW9uaWNfbGliY19wbGF0Zm9ybV9oZWFkZXJzIl0sCiAgICAgYm9vdHN0cmFwOiB0cnVlLApAQCAtMjEzLDggKzIwOSw4IEBACiAgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCiB9CiAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliaW5pdCIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmluaXRfZGVmYXVsdHMiLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICBkZWZhdWx0czogWwogICAgICAgICAiaW5pdF9kZWZhdWx0cyIsCkBAIC0yMjcsNyArMjIzLDYgQEAKICAgICBdLAogICAgIHdob2xlX3N0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJjYXAiLAotICAgICAgICAibGliY29tLmFuZHJvaWQuc3lzcHJvcC5hcGV4IiwKICAgICAgICAgImxpYmNvbS5hbmRyb2lkLnN5c3Byb3AuaW5pdCIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWyJib290aW1nX2hlYWRlcnMiXSwKQEAgLTI1MSwxMCArMjQ2LDE3IEBACiAgICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgIH0sCi0gICAgdmlzaWJpbGl0eTogWwotICAgICAgICAiLy9zeXN0ZW0vYXBleC9hcGV4ZCIsCi0gICAgICAgICIvL2ZyYW1ld29ya3MvbmF0aXZlL2NtZHMvaW5zdGFsbGQiLAotICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliaW5pdCIsCisgICAgZGVmYXVsdHM6IFsibGliaW5pdF9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmluaXQubWljcm9kcm9pZCIsCisgICAgZGVmYXVsdHM6IFsibGliaW5pdF9kZWZhdWx0cyJdLAorICAgIGNmbGFnczogWyItRE1JQ1JPRFJPSUQ9MSJdLAogfQogCiBwaG9ueSB7CkBAIC0yNjQsMTIgKzI2NiwxMSBAQAogICAgIF0sCiB9CiAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImluaXRfc2Vjb25kX3N0YWdlIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiaW5pdF9zZWNvbmRfc3RhZ2VfZGVmYXVsdHMiLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICBzdGVtOiAiaW5pdCIsCiAgICAgZGVmYXVsdHM6IFsiaW5pdF9kZWZhdWx0cyJdLAotICAgIHN0YXRpY19saWJzOiBbImxpYmluaXQiXSwKICAgICBzcmNzOiBbIm1haW4uY3BwIl0sCiAgICAgc3ltbGlua3M6IFsidWV2ZW50ZCJdLAogICAgIHRhcmdldDogewpAQCAtMzAzLDkgKzMwNCwyNCBAQAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKICAgICB9LAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJpbml0X3NlY29uZF9zdGFnZSIsCisgICAgZGVmYXVsdHM6IFsiaW5pdF9zZWNvbmRfc3RhZ2VfZGVmYXVsdHMiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJpbml0Il0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImluaXRfc2Vjb25kX3N0YWdlLm1pY3JvZHJvaWQiLAorICAgIGRlZmF1bHRzOiBbImluaXRfc2Vjb25kX3N0YWdlX2RlZmF1bHRzIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliaW5pdC5taWNyb2Ryb2lkIl0sCisgICAgY2ZsYWdzOiBbIi1ETUlDUk9EUk9JRD0xIl0sCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAogICAgIHZpc2liaWxpdHk6IFsiLy9wYWNrYWdlcy9tb2R1bGVzL1ZpcnR1YWxpemF0aW9uL21pY3JvZHJvaWQiXSwKIH0KIAorCiBzb29uZ19jb25maWdfbW9kdWxlX3R5cGUgewogICAgIG5hbWU6ICJpbml0X2ZpcnN0X3N0YWdlX2NjX2RlZmF1bHRzIiwKICAgICBtb2R1bGVfdHlwZTogImNjX2RlZmF1bHRzIiwKQEAgLTMyMywxMiArMzM5LDggQEAKICAgICAgICAgICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKICAgICAgICAgfSwKICAgICB9LAotfQogCi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJpbml0X2ZpcnN0X3N0YWdlIiwKICAgICBzdGVtOiAiaW5pdCIsCi0gICAgZGVmYXVsdHM6IFsiaW5pdF9maXJzdF9zdGFnZV9kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWwogICAgICAgICAiYmxvY2tfZGV2X2luaXRpYWxpemVyLmNwcCIsCkBAIC0zNzAsNiArMzgyLDcgQEAKICAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCiAgICAgICAgICJsaWJsejQiLAorICAgICAgICAibGlienN0ZCIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9pbml0IiwKICAgICAgICAgInVwZGF0ZV9tZXRhZGF0YS1wcm90b3MiLAogICAgICAgICAibGlicHJvY2luZm8iLApAQCAtNDQxLDYgKzQ1NCwxOCBAQAogICAgIGluc3RhbGxfaW5fcm9vdDogdHJ1ZSwKIH0KIAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiaW5pdF9maXJzdF9zdGFnZSIsCisgICAgZGVmYXVsdHM6IFsiaW5pdF9maXJzdF9zdGFnZV9kZWZhdWx0cyJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJpbml0X2ZpcnN0X3N0YWdlLm1pY3JvZHJvaWQiLAorICAgIGRlZmF1bHRzOiBbImluaXRfZmlyc3Rfc3RhZ2VfZGVmYXVsdHMiXSwKKyAgICBjZmxhZ3M6IFsiLURNSUNST0RST0lEPTEiXSwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKIHBob255IHsKICAgICBuYW1lOiAiaW5pdF9zeXN0ZW0iLAogICAgIHJlcXVpcmVkOiBbImluaXRfc2Vjb25kX3N0YWdlIl0sCkBAIC01MDcsNiArNTMyLDcgQEAKICAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJmc19tZ3IiLAogICAgICAgICAibGliaGlkbC1nZW4tdXRpbHMiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9pbml0L1JFQURNRS5tZCBiL2luaXQvUkVBRE1FLm1kCmluZGV4IDZiZGZmNGEuLjExYzRlMWMgMTAwNjQ0Ci0tLSBhL2luaXQvUkVBRE1FLm1kCisrKyBiL2luaXQvUkVBRE1FLm1kCkBAIC0zNDQsMTEgKzM0NCwxNCBAQAogICBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggdGhlIGBleGVjX3N0YXJ0YCBidWlsdGluIGZvciBhbnkgbXVzdC1oYXZlIGNoZWNrcyBkdXJpbmcgYm9vdC4KIAogYHJlc3RhcnRfcGVyaW9kIDxzZWNvbmRzPmAKLT4gSWYgYSBub24tb25lc2hvdCBzZXJ2aWNlIGV4aXRzLCBpdCB3aWxsIGJlIHJlc3RhcnRlZCBhdCBpdHMgc3RhcnQgdGltZSBwbHVzCi0gIHRoaXMgcGVyaW9kLiBJdCBkZWZhdWx0cyB0byA1cyB0byByYXRlIGxpbWl0IGNyYXNoaW5nIHNlcnZpY2VzLgotICBUaGlzIGNhbiBiZSBpbmNyZWFzZWQgZm9yIHNlcnZpY2VzIHRoYXQgYXJlIG1lYW50IHRvIHJ1biBwZXJpb2RpY2FsbHkuIEZvcgotICBleGFtcGxlLCBpdCBtYXkgYmUgc2V0IHRvIDM2MDAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc2VydmljZSBzaG91bGQgcnVuIGV2ZXJ5IGhvdXIKLSAgb3IgODY0MDAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc2VydmljZSBzaG91bGQgcnVuIGV2ZXJ5IGRheS4KKz4gSWYgYSBub24tb25lc2hvdCBzZXJ2aWNlIGV4aXRzLCBpdCB3aWxsIGJlIHJlc3RhcnRlZCBhdCBpdHMgcHJldmlvdXMgc3RhcnQgdGltZSBwbHVzIHRoaXMgcGVyaW9kLgorICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgcGVyaW9kaWMgc2VydmljZXMgdG9nZXRoZXIgd2l0aCB0aGUKKyAgYHRpbWVvdXRfcGVyaW9kYCBjb21tYW5kIGJlbG93LiBGb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHNldCB0byAzNjAwIHRvIGluZGljYXRlIHRoYXQgdGhlIHNlcnZpY2UKKyAgc2hvdWxkIHJ1biBldmVyeSBob3VyIG9yIDg2NDAwIHRvIGluZGljYXRlIHRoYXQgdGhlIHNlcnZpY2Ugc2hvdWxkIHJ1biBldmVyeSBkYXkuIFRoaXMgY2FuIGJlIHNldAorICB0byBhIHZhbHVlIHNob3J0ZXIgdGhhbiA1cyBmb3IgZXhhbXBsZSAwLCBidXQgdGhlIG1pbmltdW0gNXMgZGVsYXkgaXMgZW5mb3JjZWQgaWYgdGhlIHJlc3RhcnQgd2FzCisgIGR1ZSB0byBhIGNyYXNoLiBUaGlzIGlzIHRvIHJhdGUgbGltaXQgcGVyc2lzdGVudGFsbHkgY3Jhc2hpbmcgc2VydmljZXMuIEluIG90aGVyIHdvcmRzLAorICBgPHNlY29uZHM+YCBzbWFsbGVyIHRoYW4gNSBpcyByZXNwZWN0ZWQgb25seSB3aGVuIHRoZSBzZXJ2aWNlIGV4aXRzIGRlbGl2ZXJhdGVseSBhbmQgc3VjY2Vzc2Z1bGx5CisgIChpLmUuIGJ5IGNhbGxpbmcgZXhpdCgwKSkuCiAKIGBybGltaXQgPHJlc291cmNlPiA8Y3VyPiA8bWF4PmAKID4gVGhpcyBhcHBsaWVzIHRoZSBnaXZlbiBybGltaXQgdG8gdGhlIHNlcnZpY2UuIHJsaW1pdHMgYXJlIGluaGVyaXRlZCBieSBjaGlsZApAQCAtNjcxLDExICs2NzQsMTIgQEAKICAgX29wdGlvbnNfIGluY2x1ZGUgImJhcnJpZXI9MSIsICJub2F1dG9cX2RhXF9hbGxvYyIsICJkaXNjYXJkIiwgLi4uIGFzCiAgIGEgY29tbWEgc2VwYXJhdGVkIHN0cmluZywgZS5nLiBiYXJyaWVyPTEsbm9hdXRvXF9kYVxfYWxsb2MKIAotYHBlcmZvcm1fYXBleF9jb25maWdgCitgcGVyZm9ybV9hcGV4X2NvbmZpZyBbLS1ib290c3RyYXBdYAogPiBQZXJmb3JtcyB0YXNrcyBhZnRlciBBUEVYZXMgYXJlIG1vdW50ZWQuIEZvciBleGFtcGxlLCBjcmVhdGVzIGRhdGEgZGlyZWN0b3JpZXMKICAgZm9yIHRoZSBtb3VudGVkIEFQRVhlcywgcGFyc2VzIGNvbmZpZyBmaWxlKHMpIGZyb20gdGhlbSwgYW5kIHVwZGF0ZXMgbGlua2VyCiAgIGNvbmZpZ3VyYXRpb25zLiBJbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgb25jZSB3aGVuIGFwZXhkIG5vdGlmaWVzIHRoZSBtb3VudAogICBldmVudCBieSBzZXR0aW5nIGBhcGV4ZC5zdGF0dXNgIHRvIHJlYWR5LgorICBVc2UgLS1ib290c3RyYXAgd2hlbiBpbnZva2luZyBpbiB0aGUgYm9vdHN0cmFwIG1vdW50IG5hbWVzcGFjZS4KIAogYHJlc3RhcnQgWy0tb25seS1pZi1ydW5uaW5nXSA8c2VydmljZT5gCiA+IFN0b3BzIGFuZCByZXN0YXJ0cyBhIHJ1bm5pbmcgc2VydmljZSwgZG9lcyBub3RoaW5nIGlmIHRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseQpkaWZmIC0tZ2l0IGEvaW5pdC9URVNUX01BUFBJTkcgYi9pbml0L1RFU1RfTUFQUElORwppbmRleCA0MDJiNTAxLi4zNmNhMzc5IDEwMDY0NAotLS0gYS9pbml0L1RFU1RfTUFQUElORworKysgYi9pbml0L1RFU1RfTUFQUElORwpAQCAtOCwxNCArOCw2IEBACiAgICAgfSwKICAgICB7CiAgICAgICAibmFtZSI6ICJNaWNyb2Ryb2lkSG9zdFRlc3RDYXNlcyIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogIkN0c1NlY3VyaXR5SG9zdFRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLnNlY3VyaXR5LmN0cy5TZWFtZW5kY0hvc3RUZXN0IgotICAgICAgICB9Ci0gICAgICBdCiAgICAgfQogICBdLAogICAiaHdhc2FuLXByZXN1Ym1pdCI6IFsKQEAgLTI3LDE0ICsxOSw2IEBACiAgICAgfSwKICAgICB7CiAgICAgICAibmFtZSI6ICJNaWNyb2Ryb2lkSG9zdFRlc3RDYXNlcyIKLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogIkN0c1NlY3VyaXR5SG9zdFRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLnNlY3VyaXR5LmN0cy5TZWFtZW5kY0hvc3RUZXN0IgotICAgICAgICB9Ci0gICAgICBdCiAgICAgfQogICBdCiB9CmRpZmYgLS1naXQgYS9pbml0L2FwZXhfaW5pdF91dGlsLmNwcCBiL2luaXQvYXBleF9pbml0X3V0aWwuY3BwCmluZGV4IGM4MThmOGYuLjZkMTdmMzYgMTAwNjQ0Ci0tLSBhL2luaXQvYXBleF9pbml0X3V0aWwuY3BwCisrKyBiL2luaXQvYXBleF9pbml0X3V0aWwuY3BwCkBAIC0xNiwxMyArMTYsMTUgQEAKIAogI2luY2x1ZGUgImFwZXhfaW5pdF91dGlsLmgiCiAKKyNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxnbG9iLmg+CiAKKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KIAogI2luY2x1ZGUgImFjdGlvbl9tYW5hZ2VyLmgiCkBAIC0zNCwxMCArMzYsMTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKIAotc3RhdGljIFJlc3VsdDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IENvbGxlY3RBcGV4Q29uZmlncyhjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9uYW1lKSB7CitzdGF0aWMgUmVzdWx0PHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gQ29sbGVjdFJjU2NyaXB0c0Zyb21BcGV4KAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9uYW1lLCBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHNraXBfYXBleGVzKSB7CiAgICAgZ2xvYl90IGdsb2JfcmVzdWx0OwotICAgIHN0ZDo6c3RyaW5nIGdsb2JfcGF0dGVybiA9IGFwZXhfbmFtZS5lbXB0eSgpID8KLSAgICAgICAgICAgICIvYXBleC8qL2V0Yy8qcmMiIDogIi9hcGV4LyIgKyBhcGV4X25hbWUgKyAiL2V0Yy8qcmMiOworICAgIC8vIFBhdHRlcm4gdXNlcyAiKnJjIiBpbnN0ZWFkIG9mICIucmMiIGJlY2F1c2UgQVBFWGVzIGNhbiBoYXZlIHZlcnNpb25lZCBSQyBmaWxlcworICAgIC8vIGxpa2UgZm9vLjM0cmMuCisgICAgc3RkOjpzdHJpbmcgZ2xvYl9wYXR0ZXJuID0KKyAgICAgICAgICAgIGFwZXhfbmFtZS5lbXB0eSgpID8gIi9hcGV4LyovZXRjLypyYyIgOiAiL2FwZXgvIiArIGFwZXhfbmFtZSArICIvZXRjLypyYyI7CiAKICAgICBjb25zdCBpbnQgcmV0ID0gZ2xvYihnbG9iX3BhdHRlcm4uY19zdHIoKSwgR0xPQl9NQVJLLCBudWxscHRyLCAmZ2xvYl9yZXN1bHQpOwogICAgIGlmIChyZXQgIT0gMCAmJiByZXQgIT0gR0xPQl9OT01BVENIKSB7CkBAIC00NywxNSArNTIsMjggQEAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uZmlnczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdsb2JfcmVzdWx0LmdsX3BhdGhjOyBpKyspIHsKICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGdsb2JfcmVzdWx0LmdsX3BhdGh2W2ldOwotICAgICAgICAvLyBGaWx0ZXItb3V0IC9hcGV4LzxuYW1lPkA8dmVyPiBwYXRocy4gVGhlIHBhdGhzIGFyZSBiaW5kLW1vdW50ZWQgdG8KLSAgICAgICAgLy8gL2FwZXgvPG5hbWU+IHBhdGhzLCBzbyB1bmxlc3Mgd2UgZmlsdGVyIHRoZW0gb3V0LCB3ZSB3aWxsIHBhcnNlIHRoZQotICAgICAgICAvLyBzYW1lIGZpbGUgdHdpY2UuCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRocyA9IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KHBhdGgsICIvIik7Ci0gICAgICAgIGlmIChwYXRocy5zaXplKCkgPj0gMyAmJiBwYXRoc1syXS5maW5kKCdAJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKworICAgICAgICAvLyBGaWx0ZXIgb3V0IGRpcmVjdG9yaWVzCisgICAgICAgIGlmIChwYXRoLmJhY2soKSA9PSAnLycpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIC8vIEZpbHRlciBkaXJlY3RvcmllcwotICAgICAgICBpZiAocGF0aC5iYWNrKCkgPT0gJy8nKSB7CisKKyAgICAgICAgLy8gR2V0IGFwZXggbmFtZSBmcm9tIHBhdGguCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRocyA9IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KHBhdGgsICIvIik7CisgICAgICAgIGlmIChwYXRocy5zaXplKCkgPCAzKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9uYW1lID0gcGF0aHNbMl07CisKKyAgICAgICAgLy8gRmlsdGVyIG91dCAvYXBleC88bmFtZT5APHZlcj4gcGF0aHMuIFRoZSBwYXRocyBhcmUgYmluZC1tb3VudGVkIHRvCisgICAgICAgIC8vIC9hcGV4LzxuYW1lPiBwYXRocywgc28gdW5sZXNzIHdlIGZpbHRlciB0aGVtIG91dCwgd2Ugd2lsbCBwYXJzZSB0aGUKKyAgICAgICAgLy8gc2FtZSBmaWxlIHR3aWNlLgorICAgICAgICBpZiAoYXBleF9uYW1lLmZpbmQoJ0AnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWx0ZXIgb3V0IHNraXBfc2V0IGFwZXhlcworICAgICAgICBpZiAoc2tpcF9hcGV4ZXMuY291bnQoYXBleF9uYW1lKSA+IDApIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGNvbmZpZ3MucHVzaF9iYWNrKHBhdGgpOwpAQCAtNjQsMTEgKzgyLDQxIEBACiAgICAgcmV0dXJuIGNvbmZpZ3M7CiB9CiAKLXN0YXRpYyBSZXN1bHQ8dm9pZD4gUGFyc2VDb25maWdzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29uZmlncykgeworc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEdldEFwZXhMaXN0RnJvbShjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9kaXIpIHsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gYXBleF9saXN0OworICAgIGF1dG8gZGlycCA9IHN0ZDo6dW5pcXVlX3B0cjxESVIsIGludCAoKikoRElSKik+KG9wZW5kaXIoYXBleF9kaXIuY19zdHIoKSksIGNsb3NlZGlyKTsKKyAgICBpZiAoIWRpcnApIHsKKyAgICAgICAgcmV0dXJuIGFwZXhfbGlzdDsKKyAgICB9CisgICAgc3RydWN0IGRpcmVudCogZW50cnk7CisgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlycC5nZXQoKSkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGVudHJ5LT5kX3R5cGUgIT0gRFRfRElSKSBjb250aW51ZTsKKworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKKyAgICAgICAgaWYgKG5hbWVbMF0gPT0gJy4nKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHN0cmNocihuYW1lLCAnQCcpICE9IG51bGxwdHIpIGNvbnRpbnVlOworICAgICAgICBpZiAoc3RyY21wKG5hbWUsICJzaGFyZWRsaWJzIikgPT0gMCkgY29udGludWU7CisgICAgICAgIGFwZXhfbGlzdC5pbnNlcnQobmFtZSk7CisgICAgfQorICAgIHJldHVybiBhcGV4X2xpc3Q7Cit9CisKK3N0YXRpYyBSZXN1bHQ8dm9pZD4gUGFyc2VSY1NjcmlwdHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBmaWxlcykgeworICAgIGlmIChmaWxlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgLy8gQVBFWGVzIGNhbiBoYXZlIHZlcnNpb25lZCBSQyBmaWxlcy4gVGhlc2Ugc2hvdWxkIGJlIGZpbHRlcmVkIGJhc2VkIG9uCisgICAgLy8gU0RLIHZlcnNpb24uCisgICAgYXV0byBmaWx0ZXJlZCA9IEZpbHRlclZlcnNpb25lZENvbmZpZ3MoCisgICAgICAgICAgICBmaWxlcywgYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInJvLmJ1aWxkLnZlcnNpb24uc2RrIiwgSU5UX01BWCkpOworICAgIGlmIChmaWx0ZXJlZC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKICAgICBQYXJzZXIgcGFyc2VyID0KICAgICAgICAgICAgIENyZWF0ZUFwZXhDb25maWdQYXJzZXIoQWN0aW9uTWFuYWdlcjo6R2V0SW5zdGFuY2UoKSwgU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkpOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBjIDogY29uZmlncykgeworICAgIGZvciAoY29uc3QgYXV0byYgYyA6IGZpbHRlcmVkKSB7CiAgICAgICAgIGF1dG8gcmVzdWx0ID0gcGFyc2VyLlBhcnNlQ29uZmlnRmlsZShjKTsKICAgICAgICAgLy8gV2Ugc2hvdWxkIGhhbmRsZSBvdGhlciBjb25maWcgZmlsZXMgZXZlbiB3aGVuIHRoZXJlJ3MgYW4gZXJyb3IuCiAgICAgICAgIGlmICghcmVzdWx0Lm9rKCkpIHsKQEAgLTgxLDE2ICsxMjksMjEgQEAKICAgICByZXR1cm4ge307CiB9CiAKLVJlc3VsdDx2b2lkPiBQYXJzZUFwZXhDb25maWdzKGNvbnN0IHN0ZDo6c3RyaW5nJiBhcGV4X25hbWUpIHsKLSAgICBhdXRvIGNvbmZpZ3MgPSBPUl9SRVRVUk4oQ29sbGVjdEFwZXhDb25maWdzKGFwZXhfbmFtZSkpOworUmVzdWx0PHZvaWQ+IFBhcnNlUmNTY3JpcHRzRnJvbUFwZXgoY29uc3Qgc3RkOjpzdHJpbmcmIGFwZXhfbmFtZSkgeworICAgIGF1dG8gY29uZmlncyA9IE9SX1JFVFVSTihDb2xsZWN0UmNTY3JpcHRzRnJvbUFwZXgoYXBleF9uYW1lLCAvKnNraXBfYXBleGVzPSove30pKTsKKyAgICByZXR1cm4gUGFyc2VSY1NjcmlwdHMoY29uZmlncyk7Cit9CiAKLSAgICBpZiAoY29uZmlncy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB7fTsKK1Jlc3VsdDx2b2lkPiBQYXJzZVJjU2NyaXB0c0Zyb21BbGxBcGV4ZXMoYm9vbCBib290c3RyYXApIHsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gc2tpcF9hcGV4ZXM7CisgICAgaWYgKCFib290c3RyYXApIHsKKyAgICAgICAgLy8gSW4gY2FzZSB3ZSBhbHJlYWR5IGxvYWRlZCBjb25maWcgZmlsZXMgZnJvbSBib290c3RyYXAgQVBFWGVzLCB3ZSBuZWVkIHRvIGF2b2lkIGxvYWRpbmcKKyAgICAgICAgLy8gdGhlbSBhZ2Fpbi4gV2UgY2FuIGdldCB0aGUgbGlzdCBvZiBib290c3RyYXAgQVBFWGVzIGJ5IHNjYW5uaW5nIC9ib290c3RyYXAtYXBleCBhbmQKKyAgICAgICAgLy8gc2tpcCB0aGVtIGluIENvbGxlY3RSY1NjcmlwdHNGcm9tQXBleC4KKyAgICAgICAgc2tpcF9hcGV4ZXMgPSBHZXRBcGV4TGlzdEZyb20oIi9ib290c3RyYXAtYXBleCIpOwogICAgIH0KLQotICAgIGF1dG8gZmlsdGVyZWRfY29uZmlncyA9IEZpbHRlclZlcnNpb25lZENvbmZpZ3MoY29uZmlncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJyby5idWlsZC52ZXJzaW9uLnNkayIsIElOVF9NQVgpKTsKLSAgICByZXR1cm4gUGFyc2VDb25maWdzKGZpbHRlcmVkX2NvbmZpZ3MpOworICAgIGF1dG8gY29uZmlncyA9IE9SX1JFVFVSTihDb2xsZWN0UmNTY3JpcHRzRnJvbUFwZXgoLyphcGV4X25hbWU9Ki8iIiwgc2tpcF9hcGV4ZXMpKTsKKyAgICByZXR1cm4gUGFyc2VSY1NjcmlwdHMoY29uZmlncyk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbml0CmRpZmYgLS1naXQgYS9pbml0L2FwZXhfaW5pdF91dGlsLmggYi9pbml0L2FwZXhfaW5pdF91dGlsLmgKaW5kZXggNDNmOGFkNS4uNzVkZmVlMSAxMDA2NDQKLS0tIGEvaW5pdC9hcGV4X2luaXRfdXRpbC5oCisrKyBiL2luaXQvYXBleF9pbml0X3V0aWwuaApAQCAtMTYsNiArMTYsNyBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCkBAIC0yNCw5ICsyNSwxNCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCi0vLyBQYXJzZSBhbGwgY29uZmlnIGZpbGVzIGZvciBhIGdpdmVuIGFwZXguCi0vLyBJZiBhcGV4IG5hbWUgaXMgZW1wdHkoIiIpLCBjb25maWcgZmlsZXMgZm9yIGFsbCBhcGV4ZXMgd2lsbCBiZSBwYXJzZWQuCi1SZXN1bHQ8dm9pZD4gUGFyc2VBcGV4Q29uZmlncyhjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9uYW1lKTsKKy8vIFNjYW5zIGFwZXhfZGlyICgvYXBleCkgdG8gZ2V0IHRoZSBsaXN0IG9mIGFjdGl2ZSBBUEVYZXMuCitzdGQ6OnNldDxzdGQ6OnN0cmluZz4gR2V0QXBleExpc3RGcm9tKGNvbnN0IHN0ZDo6c3RyaW5nJiBhcGV4X2Rpcik7CisKKy8vIFBhcnNlIGFsbCBSQyBzY3JpcHRzIGZvciBhIGdpdmVuIGFwZXguCitSZXN1bHQ8dm9pZD4gUGFyc2VSY1NjcmlwdHNGcm9tQXBleChjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9uYW1lKTsKKworLy8gUGFyc2UgYWxsIFJDIHNjcmlwdHMgZm9yIGFsbCBhcGV4ZXMgdW5kZXIgL2FwZXguCitSZXN1bHQ8dm9pZD4gUGFyc2VSY1NjcmlwdHNGcm9tQWxsQXBleGVzKGJvb2wgYm9vdHN0cmFwKTsKIAogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L2J1aWx0aW5zLmNwcCBiL2luaXQvYnVpbHRpbnMuY3BwCmluZGV4IGJjMjM5NzIuLjYwNmVhOGMgMTAwNjQ0Ci0tLSBhL2luaXQvYnVpbHRpbnMuY3BwCisrKyBiL2luaXQvYnVpbHRpbnMuY3BwCkBAIC02MCw2ICs2MCw4IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfcmVib290Lmg+CiAjaW5jbHVkZSA8ZnNfbWdyLmg+CiAjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CisjaW5jbHVkZSA8bGliZG0vZG0uaD4KKyNpbmNsdWRlIDxsaWJkbS9sb29wX2NvbnRyb2wuaD4KICNpbmNsdWRlIDxsaWJnc2kvbGliZ3NpLmg+CiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CkBAIC00NzMsOCArNDc1LDYgQEAKICAgICB7IDAsICAgICAgICAgICAgMCB9LAogfTsKIAotI2RlZmluZSBEQVRBX01OVF9QT0lOVCAiL2RhdGEiCi0KIC8qIG1vdW50IDx0eXBlPiA8ZGV2aWNlPiA8cGF0aD4gPGZsYWdzIC4uLj4gPG9wdGlvbnM+ICovCiBzdGF0aWMgUmVzdWx0PHZvaWQ+IGRvX21vdW50KGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKICAgICBjb25zdCBjaGFyKiBvcHRpb25zID0gbnVsbHB0cjsKQEAgLTUwNiwyOSArNTA2LDI5IEBACiAKICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChzb3VyY2UsICJsb29wQCIpKSB7CiAgICAgICAgIGludCBtb2RlID0gKGZsYWdzICYgTVNfUkRPTkxZKSA/IE9fUkRPTkxZIDogT19SRFdSOwotICAgICAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oc291cmNlICsgNSwgbW9kZSB8IE9fQ0xPRVhFQykpKTsKLSAgICAgICAgaWYgKGZkIDwgMCkgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAib3BlbigiIDw8IHNvdXJjZSArIDUgPDwgIiwgIiA8PCBtb2RlIDw8ICIpIGZhaWxlZCI7CisgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfcGF0aCA9IHNvdXJjZSArIHN0cmxlbigibG9vcEAiKTsKIAotICAgICAgICBmb3IgKHNpemVfdCBuID0gMDs7IG4rKykgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIvZGV2L2Jsb2NrL2xvb3AlenUiLCBuKTsKLSAgICAgICAgICAgIHVuaXF1ZV9mZCBsb29wKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHRtcC5jX3N0cigpLCBtb2RlIHwgT19DTE9FWEVDKSkpOwotICAgICAgICAgICAgaWYgKGxvb3AgPCAwKSByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJvcGVuKCIgPDwgdG1wIDw8ICIsICIgPDwgbW9kZSA8PCAiKSBmYWlsZWQiOwotCi0gICAgICAgICAgICBsb29wX2luZm8gaW5mbzsKLSAgICAgICAgICAgIC8qIGlmIGl0IGlzIGEgYmxhbmsgbG9vcCBkZXZpY2UgKi8KLSAgICAgICAgICAgIGlmIChpb2N0bChsb29wLmdldCgpLCBMT09QX0dFVF9TVEFUVVMsICZpbmZvKSA8IDAgJiYgZXJybm8gPT0gRU5YSU8pIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBpdCBiZWNvbWVzIG91ciBsb29wIGRldmljZSAqLwotICAgICAgICAgICAgICAgIGlmIChpb2N0bChsb29wLmdldCgpLCBMT09QX1NFVF9GRCwgZmQuZ2V0KCkpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vdW50KHRtcC5jX3N0cigpLCB0YXJnZXQsIHN5c3RlbSwgZmxhZ3MsIG9wdGlvbnMpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGwobG9vcC5nZXQoKSwgTE9PUF9DTFJfRkQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAibW91bnQoKSBmYWlsZWQiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIE9wZW4gc291cmNlIGZpbGUKKyAgICAgICAgaWYgKHdhaXQpIHsKKyAgICAgICAgICAgIHdhaXRfZm9yX2ZpbGUoZmlsZV9wYXRoLCBrQ29tbWFuZFJldHJ5VGltZW91dCk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAib3V0IG9mIGxvb3BiYWNrIGRldmljZXMiOworICAgICAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oZmlsZV9wYXRoLCBtb2RlIHwgT19DTE9FWEVDKSkpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJvcGVuKCIgPDwgZmlsZV9wYXRoIDw8ICIsICIgPDwgbW9kZSA8PCAiKSBmYWlsZWQiOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsb2NhdGUgbG9vcCBkZXZpY2UgYW5kIGF0dGFjaCBpdCB0byBmaWxlX3BhdGguCisgICAgICAgIGFuZHJvaWQ6OmRtOjpMb29wQ29udHJvbCBsb29wX2NvbnRyb2w7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxvb3BfZGV2aWNlOworICAgICAgICBpZiAoIWxvb3BfY29udHJvbC5BdHRhY2goZmQuZ2V0KCksIDVzLCAmbG9vcF9kZXZpY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJsb29wX2NvbnRyb2wuQXR0YWNoICIgPDwgZmlsZV9wYXRoIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb3VudChsb29wX2RldmljZS5jX3N0cigpLCB0YXJnZXQsIHN5c3RlbSwgZmxhZ3MsIG9wdGlvbnMpIDwgMCkgeworICAgICAgICAgICAgbG9vcF9jb250cm9sLkRldGFjaChsb29wX2RldmljZSk7CisgICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJtb3VudCgpIGZhaWxlZCI7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAod2FpdCkKICAgICAgICAgICAgIHdhaXRfZm9yX2ZpbGUoc291cmNlLCBrQ29tbWFuZFJldHJ5VGltZW91dCk7CkBAIC01NzUsNyArNTc1LDcgQEAKICAqCiAgKiByZXR1cm4gY29kZSBpcyBwcm9jZXNzZWQgYmFzZWQgb24gaW5wdXQgY29kZQogICovCi1zdGF0aWMgUmVzdWx0PHZvaWQ+IHF1ZXVlX2ZzX2V2ZW50KGludCBjb2RlLCBib29sIHVzZXJkYXRhX3JlbW91bnQpIHsKK3N0YXRpYyBSZXN1bHQ8dm9pZD4gcXVldWVfZnNfZXZlbnQoaW50IGNvZGUpIHsKICAgICBpZiAoY29kZSA9PSBGU19NR1JfTU5UQUxMX0RFVl9OT1RfRU5DUllQVEFCTEUpIHsKICAgICAgICAgU2V0UHJvcGVydHkoInJvLmNyeXB0by5zdGF0ZSIsICJ1bnN1cHBvcnRlZCIpOwogICAgICAgICBBY3Rpb25NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLlF1ZXVlRXZlbnRUcmlnZ2VyKCJub25lbmNyeXB0ZWQiKTsKQEAgLTU4OSwzMCArNTg5LDkgQEAKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG9wdGlvbnMgPSB7Ii0td2lwZV9kYXRhIiwgIi0tcmVhc29uPWZzX21ncl9tb3VudF9hbGwiIH07CiAgICAgICAgIHJldHVybiByZWJvb3RfaW50b19yZWNvdmVyeShvcHRpb25zKTsKICAgICAgICAgLyogSWYgcmVib290IHdvcmtlZCwgdGhlcmUgaXMgbm8gcmV0dXJuLiAqLwotICAgIH0gZWxzZSBpZiAoY29kZSA9PSBGU19NR1JfTU5UQUxMX0RFVl9GSUxFX0VOQ1JZUFRFRCkgewotICAgICAgICBpZiAoIUZzY3J5cHRJbnN0YWxsS2V5cmluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRnNjcnlwdEluc3RhbGxLZXlyaW5nKCkgZmFpbGVkIjsKLSAgICAgICAgfQotICAgICAgICBTZXRQcm9wZXJ0eSgicm8uY3J5cHRvLnN0YXRlIiwgImVuY3J5cHRlZCIpOwotCi0gICAgICAgIC8vIEFsdGhvdWdoIGVuY3J5cHRlZCwgd2UgaGF2ZSBkZXZpY2Uga2V5LCBzbyB3ZSBkbyBub3QgbmVlZCB0bwotICAgICAgICAvLyBkbyBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSB0aGUgbm9uZW5jcnlwdGVkIGNhc2UuCi0gICAgICAgIEFjdGlvbk1hbmFnZXI6OkdldEluc3RhbmNlKCkuUXVldWVFdmVudFRyaWdnZXIoIm5vbmVuY3J5cHRlZCIpOwotICAgICAgICByZXR1cm4ge307Ci0gICAgfSBlbHNlIGlmIChjb2RlID09IEZTX01HUl9NTlRBTExfREVWX0lTX01FVEFEQVRBX0VOQ1JZUFRFRCkgewotICAgICAgICBpZiAoIUZzY3J5cHRJbnN0YWxsS2V5cmluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRnNjcnlwdEluc3RhbGxLZXlyaW5nKCkgZmFpbGVkIjsKLSAgICAgICAgfQotICAgICAgICBTZXRQcm9wZXJ0eSgicm8uY3J5cHRvLnN0YXRlIiwgImVuY3J5cHRlZCIpOwotCi0gICAgICAgIC8vIEFsdGhvdWdoIGVuY3J5cHRlZCwgdm9sZCBoYXMgYWxyZWFkeSBzZXQgdGhlIGRldmljZSB1cCwgc28gd2UgZG8gbm90IG5lZWQgdG8KLSAgICAgICAgLy8gZG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gdGhlIG5vbmVuY3J5cHRlZCBjYXNlLgotICAgICAgICBBY3Rpb25NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLlF1ZXVlRXZlbnRUcmlnZ2VyKCJub25lbmNyeXB0ZWQiKTsKLSAgICAgICAgcmV0dXJuIHt9OwotICAgIH0gZWxzZSBpZiAoY29kZSA9PSBGU19NR1JfTU5UQUxMX0RFVl9ORUVEU19NRVRBREFUQV9FTkNSWVBUSU9OKSB7Ci0gICAgICAgIGlmICghRnNjcnlwdEluc3RhbGxLZXlyaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJGc2NyeXB0SW5zdGFsbEtleXJpbmcoKSBmYWlsZWQiOwotICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjb2RlID09IEZTX01HUl9NTlRBTExfREVWX0ZJTEVfRU5DUllQVEVEIHx8CisgICAgICAgICAgICAgICBjb2RlID09IEZTX01HUl9NTlRBTExfREVWX0lTX01FVEFEQVRBX0VOQ1JZUFRFRCB8fAorICAgICAgICAgICAgICAgY29kZSA9PSBGU19NR1JfTU5UQUxMX0RFVl9ORUVEU19NRVRBREFUQV9FTkNSWVBUSU9OKSB7CiAgICAgICAgIFNldFByb3BlcnR5KCJyby5jcnlwdG8uc3RhdGUiLCAiZW5jcnlwdGVkIik7CiAKICAgICAgICAgLy8gQWx0aG91Z2ggZW5jcnlwdGVkLCB2b2xkIGhhcyBhbHJlYWR5IHNldCB0aGUgZGV2aWNlIHVwLCBzbyB3ZSBkbyBub3QgbmVlZCB0bwpAQCAtNjgxLDcgKzY2MCw3IEBACiAgICAgaWYgKHF1ZXVlX2V2ZW50KSB7CiAgICAgICAgIC8qIHF1ZXVlX2ZzX2V2ZW50IHdpbGwgcXVldWUgZXZlbnQgYmFzZWQgb24gbW91bnRfZnN0YWIgcmV0dXJuIGNvZGUKICAgICAgICAgICogYW5kIHJldHVybiBwcm9jZXNzZWQgcmV0dXJuIGNvZGUqLwotICAgICAgICBhdXRvIHF1ZXVlX2ZzX3Jlc3VsdCA9IHF1ZXVlX2ZzX2V2ZW50KG1vdW50X2ZzdGFiX3Jlc3VsdC5jb2RlLCBmYWxzZSk7CisgICAgICAgIGF1dG8gcXVldWVfZnNfcmVzdWx0ID0gcXVldWVfZnNfZXZlbnQobW91bnRfZnN0YWJfcmVzdWx0LmNvZGUpOwogICAgICAgICBpZiAoIXF1ZXVlX2ZzX3Jlc3VsdC5vaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAicXVldWVfZnNfZXZlbnQoKSBmYWlsZWQ6ICIgPDwgcXVldWVfZnNfcmVzdWx0LmVycm9yKCk7CiAgICAgICAgIH0KQEAgLTc2Miw2ICs3NDEsNyBAQAogc3RhdGljIFJlc3VsdDx2b2lkPiBkb19zdGFydChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CiAgICAgU2VydmljZSogc3ZjID0gU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuRmluZFNlcnZpY2UoYXJnc1sxXSk7CiAgICAgaWYgKCFzdmMpIHJldHVybiBFcnJvcigpIDw8ICJzZXJ2aWNlICIgPDwgYXJnc1sxXSA8PCAiIG5vdCBmb3VuZCI7CisgICAgZXJybm8gPSAwOwogICAgIGlmIChhdXRvIHJlc3VsdCA9IHN2Yy0+U3RhcnQoKTsgIXJlc3VsdC5vaygpKSB7CiAgICAgICAgIHJldHVybiBFcnJvcklnbm9yZUVub2VudCgpIDw8ICJDb3VsZCBub3Qgc3RhcnQgc2VydmljZTogIiA8PCByZXN1bHQuZXJyb3IoKTsKICAgICB9CkBAIC0xMjE1LDcgKzExOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL21ldGFkYXRhL3VzZXJzcGFjZXJlYm9vdC9tb3VudF9pbmZvLnR4dCIpOwogICAgICAgICB0cmlnZ2VyX3NodXRkb3duKCJyZWJvb3QsbW91bnRfdXNlcmRhdGFfZmFpbGVkIik7CiAgICAgfQotICAgIGlmIChhdXRvIHJlc3VsdCA9IHF1ZXVlX2ZzX2V2ZW50KGluaXRpYWxfbW91bnRfZnN0YWJfcmV0dXJuX2NvZGUsIHRydWUpOyAhcmVzdWx0Lm9rKCkpIHsKKyAgICBpZiAoYXV0byByZXN1bHQgPSBxdWV1ZV9mc19ldmVudChpbml0aWFsX21vdW50X2ZzdGFiX3JldHVybl9jb2RlKTsgIXJlc3VsdC5vaygpKSB7CiAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJxdWV1ZV9mc19ldmVudCgpIGZhaWxlZDogIiA8PCByZXN1bHQuZXJyb3IoKTsKICAgICB9CiAgICAgcmV0dXJuIHt9OwpAQCAtMTI4NSwzNyArMTI2NSwzMyBAQAogLyoKICAqIENyZWF0ZXMgYSBkaXJlY3RvcnkgdW5kZXIgL2RhdGEvbWlzYy9hcGV4ZGF0YS8gZm9yIGVhY2ggQVBFWC4KICAqLwotc3RhdGljIFJlc3VsdDx2b2lkPiBjcmVhdGVfYXBleF9kYXRhX2RpcnMoKSB7Ci0gICAgYXV0byBkaXJwID0gc3RkOjp1bmlxdWVfcHRyPERJUiwgaW50ICgqKShESVIqKT4ob3BlbmRpcigiL2FwZXgiKSwgY2xvc2VkaXIpOwotICAgIGlmICghZGlycCkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJVbmFibGUgdG8gb3BlbiBhcGV4IGRpcmVjdG9yeSI7Ci0gICAgfQotICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OwotICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcnAuZ2V0KCkpKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChlbnRyeS0+ZF90eXBlICE9IERUX0RJUikgY29udGludWU7Ci0KLSAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7Ci0gICAgICAgIC8vIHNraXAgYW55IHN0YXJ0aW5nIHdpdGggIi4iCi0gICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgY29udGludWU7Ci0KLSAgICAgICAgaWYgKHN0cmNocihuYW1lLCAnQCcpICE9IG51bGxwdHIpIGNvbnRpbnVlOwotCi0gICAgICAgIGF1dG8gcGF0aCA9ICIvZGF0YS9taXNjL2FwZXhkYXRhLyIgKyBzdGQ6OnN0cmluZyhuYW1lKTsKK3N0YXRpYyB2b2lkIGNyZWF0ZV9hcGV4X2RhdGFfZGlycygpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBHZXRBcGV4TGlzdEZyb20oIi9hcGV4IikpIHsKKyAgICAgICAgYXV0byBwYXRoID0gIi9kYXRhL21pc2MvYXBleGRhdGEvIiArIG5hbWU7CiAgICAgICAgIGF1dG8gb3B0aW9ucyA9IE1rZGlyT3B0aW9uc3twYXRoLCAwNzcxLCBBSURfUk9PVCwgQUlEX1NZU1RFTSwgRnNjcnlwdEFjdGlvbjo6a05vbmUsICJyZWYifTsKLSAgICAgICAgbWFrZV9kaXJfd2l0aF9vcHRpb25zKG9wdGlvbnMpOworICAgICAgICBhdXRvIHJlc3VsdCA9IG1ha2VfZGlyX3dpdGhfb3B0aW9ucyhvcHRpb25zKTsKKyAgICAgICAgaWYgKCFyZXN1bHQub2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCByZXN1bHQuZXJyb3IoKTsKKyAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4ge307CiB9CiAKIHN0YXRpYyBSZXN1bHQ8dm9pZD4gZG9fcGVyZm9ybV9hcGV4X2NvbmZpZyhjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7Ci0gICAgYXV0byBjcmVhdGVfZGlycyA9IGNyZWF0ZV9hcGV4X2RhdGFfZGlycygpOwotICAgIGlmICghY3JlYXRlX2RpcnMub2soKSkgewotICAgICAgICByZXR1cm4gY3JlYXRlX2RpcnMuZXJyb3IoKTsKKyAgICBib29sIGJvb3RzdHJhcCA9IGZhbHNlOworICAgIGlmIChhcmdzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGlmIChhcmdzWzFdICE9ICItLWJvb3RzdHJhcCIpIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmV4cGVjdGVkIGFyZ3VtZW50OiAiIDw8IGFyZ3NbMV07CisgICAgICAgIH0KKyAgICAgICAgYm9vdHN0cmFwID0gdHJ1ZTsKICAgICB9Ci0gICAgYXV0byBwYXJzZV9jb25maWdzID0gUGFyc2VBcGV4Q29uZmlncygvKmFwZXhfbmFtZT0qLyIiKTsKLSAgICBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5NYXJrU2VydmljZXNVcGRhdGUoKTsKLSAgICBpZiAoIXBhcnNlX2NvbmZpZ3Mub2soKSkgewotICAgICAgICByZXR1cm4gcGFyc2VfY29uZmlncy5lcnJvcigpOworCisgICAgaWYgKCFib290c3RyYXApIHsKKyAgICAgICAgY3JlYXRlX2FwZXhfZGF0YV9kaXJzKCk7CisgICAgfQorCisgICAgYXV0byBwYXJzZV9yZXN1bHQgPSBQYXJzZVJjU2NyaXB0c0Zyb21BbGxBcGV4ZXMoYm9vdHN0cmFwKTsKKyAgICBpZiAoIXBhcnNlX3Jlc3VsdC5vaygpKSB7CisgICAgICAgIHJldHVybiBwYXJzZV9yZXN1bHQuZXJyb3IoKTsKICAgICB9CiAKICAgICBhdXRvIHVwZGF0ZV9saW5rZXJfY29uZmlnID0gZG9fdXBkYXRlX2xpbmtlcl9jb25maWcoYXJncyk7CkBAIC0xMzIzLDYgKzEyOTksOSBAQAogICAgICAgICByZXR1cm4gdXBkYXRlX2xpbmtlcl9jb25maWcuZXJyb3IoKTsKICAgICB9CiAKKyAgICBpZiAoIWJvb3RzdHJhcCkgeworICAgICAgICBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5TdGFydERlbGF5ZWRTZXJ2aWNlcygpOworICAgIH0KICAgICByZXR1cm4ge307CiB9CiAKQEAgLTEzNzcsNyArMTM1Niw3IEBACiAgICAgICAgIC8vIG1vdW50IGFuZCB1bW91bnQgYXJlIHJ1biBpbiB0aGUgc2FtZSBjb250ZXh0IGFzIG1vdW50X2FsbCBmb3Igc3ltbWV0cnkuCiAgICAgICAgIHsibW91bnRfYWxsIiwgICAgICAgICAgICAgICB7MCwgICAgIGtNYXgsIHtmYWxzZSwgIGRvX21vdW50X2FsbH19fSwKICAgICAgICAgeyJtb3VudCIsICAgICAgICAgICAgICAgICAgIHszLCAgICAga01heCwge2ZhbHNlLCAgZG9fbW91bnR9fX0sCi0gICAgICAgIHsicGVyZm9ybV9hcGV4X2NvbmZpZyIsICAgICB7MCwgICAgIDAsICAgIHtmYWxzZSwgIGRvX3BlcmZvcm1fYXBleF9jb25maWd9fX0sCisgICAgICAgIHsicGVyZm9ybV9hcGV4X2NvbmZpZyIsICAgICB7MCwgICAgIDEsICAgIHtmYWxzZSwgIGRvX3BlcmZvcm1fYXBleF9jb25maWd9fX0sCiAgICAgICAgIHsidW1vdW50IiwgICAgICAgICAgICAgICAgICB7MSwgICAgIDEsICAgIHtmYWxzZSwgIGRvX3Vtb3VudH19fSwKICAgICAgICAgeyJ1bW91bnRfYWxsIiwgICAgICAgICAgICAgIHswLCAgICAgMSwgICAge2ZhbHNlLCAgZG9fdW1vdW50X2FsbH19fSwKICAgICAgICAgeyJ1cGRhdGVfbGlua2VyX2NvbmZpZyIsICAgIHswLCAgICAgMCwgICAge2ZhbHNlLCAgZG9fdXBkYXRlX2xpbmtlcl9jb25maWd9fX0sCmRpZmYgLS1naXQgYS9pbml0L2NhcGFiaWxpdGllcy5jcHAgYi9pbml0L2NhcGFiaWxpdGllcy5jcHAKaW5kZXggYWI2ZmYwMy4uMGUyY2QyYSAxMDA2NDQKLS0tIGEvaW5pdC9jYXBhYmlsaXRpZXMuY3BwCisrKyBiL2luaXQvY2FwYWJpbGl0aWVzLmNwcApAQCAtNjYsMTggKzY2LDEyIEBACiAgICAgICAgIENBUF9NQVBfRU5UUlkoV0FLRV9BTEFSTSksCiAgICAgICAgIENBUF9NQVBfRU5UUlkoQkxPQ0tfU1VTUEVORCksCiAgICAgICAgIENBUF9NQVBfRU5UUlkoQVVESVRfUkVBRCksCi0jaWYgZGVmaW5lZChfX0JJT05JQ19fKQogICAgICAgICBDQVBfTUFQX0VOVFJZKFBFUkZNT04pLAogICAgICAgICBDQVBfTUFQX0VOVFJZKEJQRiksCiAgICAgICAgIENBUF9NQVBfRU5UUlkoQ0hFQ0tQT0lOVF9SRVNUT1JFKSwKLSNlbmRpZgogfTsKIAotI2lmIGRlZmluZWQoX19CSU9OSUNfXykKIHN0YXRpY19hc3NlcnQoQ0FQX0xBU1RfQ0FQID09IENBUF9DSEVDS1BPSU5UX1JFU1RPUkUsICJDQVBfTEFTVF9DQVAgaXMgbm90IENBUF9DSEVDS1BPSU5UX1JFU1RPUkUiKTsKLSNlbHNlCi1zdGF0aWNfYXNzZXJ0KENBUF9MQVNUX0NBUCA9PSBDQVBfQVVESVRfUkVBRCwgIkNBUF9MQVNUX0NBUCBpcyBub3QgQ0FQX0FVRElUX1JFQUQiKTsKLSNlbmRpZgogCiBzdGF0aWMgYm9vbCBDb21wdXRlQ2FwQW1iaWVudFN1cHBvcnRlZCgpIHsKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQpkaWZmIC0tZ2l0IGEvaW5pdC9jYXBhYmlsaXRpZXMuaCBiL2luaXQvY2FwYWJpbGl0aWVzLmgKaW5kZXggODkxZTBhYy4uZmM4MGM5OCAxMDA2NDQKLS0tIGEvaW5pdC9jYXBhYmlsaXRpZXMuaAorKysgYi9pbml0L2NhcGFiaWxpdGllcy5oCkBAIC0yMSwxNyArMjEsNiBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9fKQotI2lmbmRlZiBDQVBfQkxPQ0tfU1VTUEVORAotI2RlZmluZSBDQVBfQkxPQ0tfU1VTUEVORCAzNgotI2VuZGlmCi0jaWZuZGVmIENBUF9BVURJVF9SRUFECi0jZGVmaW5lIENBUF9BVURJVF9SRUFEIDM3Ci0jZW5kaWYKLSN1bmRlZiBDQVBfTEFTVF9DQVAKLSNkZWZpbmUgQ0FQX0xBU1RfQ0FQIENBUF9BVURJVF9SRUFECi0jZW5kaWYKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCmRpZmYgLS1naXQgYS9pbml0L2RldmljZXMuY3BwIGIvaW5pdC9kZXZpY2VzLmNwcAppbmRleCBkMjlmZmQ2Li5lNzY3ODZhIDEwMDY0NAotLS0gYS9pbml0L2RldmljZXMuY3BwCisrKyBiL2luaXQvZGV2aWNlcy5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorI2luY2x1ZGUgPGZzX21nci5oPgogI2luY2x1ZGUgPGxpYmRtL2RtLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CkBAIC0yMDMsOCArMjA0LDggQEAKICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbWFwLmVtcGxhY2VfYmFjayhtYXBfcGllY2VzWzBdLCBtYXBfcGllY2VzWzFdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKLSAgICAgICAgSW1wb3J0S2VybmVsQ21kbGluZShwYXJzZXIpOwotICAgICAgICBJbXBvcnRCb290Y29uZmlnKHBhcnNlcik7CisgICAgICAgIGFuZHJvaWQ6OmZzX21ncjo6SW1wb3J0S2VybmVsQ21kbGluZShwYXJzZXIpOworICAgICAgICBhbmRyb2lkOjpmc19tZ3I6OkltcG9ydEJvb3Rjb25maWcocGFyc2VyKTsKICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbl9tYXA7CiAgICAgfSgpOwogCkBAIC01NjgsNiArNTY5LDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAodWV2ZW50LnN1YnN5c3RlbSA9PSAibWlzYyIgJiYgU3RhcnRzV2l0aCh1ZXZlbnQuZGV2aWNlX25hbWUsICJkbS11c2VyLyIpKSB7CiAgICAgICAgIGRldnBhdGggPSAiL2Rldi9kbS11c2VyLyIgKyB1ZXZlbnQuZGV2aWNlX25hbWUuc3Vic3RyKDgpOworICAgIH0gZWxzZSBpZiAodWV2ZW50LnN1YnN5c3RlbSA9PSAibWlzYyIgJiYgdWV2ZW50LmRldmljZV9uYW1lID09ICJ2ZmlvL3ZmaW8iKSB7CisgICAgICAgIGRldnBhdGggPSAiL2Rldi8iICsgdWV2ZW50LmRldmljZV9uYW1lOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRldnBhdGggPSAiL2Rldi8iICsgQmFzZW5hbWUodWV2ZW50LnBhdGgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2luaXQvZmlybXdhcmVfaGFuZGxlci5jcHAgYi9pbml0L2Zpcm13YXJlX2hhbmRsZXIuY3BwCmluZGV4IGI5ZmE1OGMuLjNjMDEyZmUgMTAwNjQ0Ci0tLSBhL2luaXQvZmlybXdhcmVfaGFuZGxlci5jcHAKKysrIGIvaW5pdC9maXJtd2FyZV9oYW5kbGVyLmNwcApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc2NvcGVndWFyZC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgpAQCAtNDMsNiArNDQsNyBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6VGltZXI7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpUcmltOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5OwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtODIsNiArODQsMzMgQEAKICAgICByZXR1cm4gYWNjZXNzKCIvZGV2Ly5ib290aW5nIiwgRl9PSykgPT0gMDsKIH0KIAorc3RhdGljIGJvb2wgSXNBcGV4QWN0aXZhdGVkKCkgeworICAgIHN0YXRpYyBib29sIGFwZXhfYWN0aXZhdGVkID0gW10oKSB7CisgICAgICAgIC8vIFdhaXQgZm9yIGNvbS5hbmRyb2lkLnJ1bnRpbWUuYXBleCBhY3RpdmF0aW9uCisgICAgICAgIC8vIFByb3BlcnR5IG5hbWUgYW5kIHZhbHVlIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggc3lzdGVtL2FwZXhkL2FwZXgvYXBleF9jb25zdGFudHMuaAorICAgICAgICAvLyA2MHMgaXMgdGhlIGRlZmF1bHQgZmlybXdhcmUgc3lzZnMgZmFsbGJhY2sgdGltZW91dC4gKC9zeXMvY2xhc3MvZmlybXdhcmUvdGltZW91dCkKKyAgICAgICAgaWYgKCFXYWl0Rm9yUHJvcGVydHkoImFwZXhkLnN0YXR1cyIsICJhY3RpdmF0ZWQiLCA2MHMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJBcGV4ZCBhY3RpdmF0aW9uIHdhaXQgdGltZW91dCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSgpOworCisgICAgcmV0dXJuIGFwZXhfYWN0aXZhdGVkOworfQorCitzdGF0aWMgYm9vbCBOZWVkc1JlcnVuRXh0ZXJuYWxIYW5kbGVyKCkgeworICAgIHN0YXRpYyBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAgIC8vIFJlcnVuIGV4dGVybmFsIGhhbmRsZXIgb25seSBvbiB0aGUgZmlyc3QgdHJ5IGFuZCB3aGVuIGFwZXggaXMgYWN0aXZhdGVkCisgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBJc0FwZXhBY3RpdmF0ZWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmlyc3Q7Cit9CisKIEV4dGVybmFsRmlybXdhcmVIYW5kbGVyOjpFeHRlcm5hbEZpcm13YXJlSGFuZGxlcihzdGQ6OnN0cmluZyBkZXZwYXRoLCB1aWRfdCB1aWQsIGdpZF90IGdpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBoYW5kbGVyX3BhdGgpCiAgICAgOiBkZXZwYXRoKHN0ZDo6bW92ZShkZXZwYXRoKSksIHVpZCh1aWQpLCBnaWQoZ2lkKSwgaGFuZGxlcl9wYXRoKHN0ZDo6bW92ZShoYW5kbGVyX3BhdGgpKSB7CkBAIC0yMTAsNiArMjM5LDExIEBACiAKICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gUnVuRXh0ZXJuYWxIYW5kbGVyKGV4dGVybmFsX2hhbmRsZXIuaGFuZGxlcl9wYXRoLCBleHRlcm5hbF9oYW5kbGVyLnVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX2hhbmRsZXIuZ2lkLCB1ZXZlbnQpOworICAgICAgICAgICAgaWYgKCFyZXN1bHQub2soKSAmJiBOZWVkc1JlcnVuRXh0ZXJuYWxIYW5kbGVyKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlcyA9IFJ1bkV4dGVybmFsSGFuZGxlcihleHRlcm5hbF9oYW5kbGVyLmhhbmRsZXJfcGF0aCwgZXh0ZXJuYWxfaGFuZGxlci51aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfaGFuZGxlci5naWQsIHVldmVudCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RkOjptb3ZlKHJlcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXJlc3VsdC5vaygpKSB7CiAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVXNpbmcgZGVmYXVsdCBmaXJtd2FyZTsgRXh0ZXJuYWwgZmlybXdhcmUgaGFuZGxlciBmYWlsZWQ6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdC5lcnJvcigpOwpkaWZmIC0tZ2l0IGEvaW5pdC9maXJzdF9zdGFnZV9pbml0LmNwcCBiL2luaXQvZmlyc3Rfc3RhZ2VfaW5pdC5jcHAKaW5kZXggMTA3ZTk5YS4uYzRkMGY3NSAxMDA2NDQKLS0tIGEvaW5pdC9maXJzdF9zdGFnZV9pbml0LmNwcAorKysgYi9pbml0L2ZpcnN0X3N0YWdlX2luaXQuY3BwCkBAIC0zMCwxMSArMzAsMTMgQEAKICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8ZmlsZXN5c3RlbT4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyZWFkPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPG1vZHByb2JlL21vZHByb2JlLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKQEAgLTU4LDEwICs2MCwxNiBAQAogCiBuYW1lc3BhY2UgewogCitlbnVtIGNsYXNzIEJvb3RNb2RlIHsKKyAgICBOT1JNQUxfTU9ERSwKKyAgICBSRUNPVkVSWV9NT0RFLAorICAgIENIQVJHRVJfTU9ERSwKK307CisKIHZvaWQgRnJlZVJhbWRpc2soRElSKiBkaXIsIGRldl90IGRldikgewogICAgIGludCBkZmQgPSBkaXJmZChkaXIpOwogCi0gICAgZGlyZW50KiBkZTsKKyAgICBkaXJlbnQqIGRlID0gbnVsbHB0cjsKICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBudWxscHRyKSB7CiAgICAgICAgIGlmIChkZS0+ZF9uYW1lID09ICIuInMgfHwgZGUtPmRfbmFtZSA9PSAiLi4icykgewogICAgICAgICAgICAgY29udGludWU7CkBAIC03MCw3ICs3OCw3IEBACiAgICAgICAgIGJvb2wgaXNfZGlyID0gZmFsc2U7CiAKICAgICAgICAgaWYgKGRlLT5kX3R5cGUgPT0gRFRfRElSIHx8IGRlLT5kX3R5cGUgPT0gRFRfVU5LTk9XTikgewotICAgICAgICAgICAgc3RydWN0IHN0YXQgaW5mbzsKKyAgICAgICAgICAgIHN0cnVjdCBzdGF0IGluZm8ge307CiAgICAgICAgICAgICBpZiAoZnN0YXRhdChkZmQsIGRlLT5kX25hbWUsICZpbmZvLCBBVF9TWU1MSU5LX05PRk9MTE9XKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0xNDcsMTUgKzE1NSw1MyBAQAogICAgICAgICBDb3B5KHNuYXB1c2VyZCwgZHN0KTsKICAgICB9CiB9CisKK3N0ZDo6c3RyaW5nIEdldFBhZ2VTaXplU3VmZml4KCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRV9TSVpFKTsKKyAgICBpZiAocGFnZV9zaXplIDw9IDQwOTYpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCJfJXp1ayIsIHBhZ2Vfc2l6ZSAvIDEwMjQpOworfQorCitjb25zdGV4cHIgYm9vbCBFbmRzV2l0aChjb25zdCBzdGQ6OnN0cmluZ192aWV3IHN0ciwgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBzdWZmaXgpIHsKKyAgICByZXR1cm4gc3RyLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgpICYmCisgICAgICAgICAgIDAgPT0gc3RyLmNvbXBhcmUoc3RyLnNpemUoKSAtIHN1ZmZpeC5zaXplKCksIHN1ZmZpeC5zaXplKCksIHN1ZmZpeCk7Cit9CisKK2NvbnN0ZXhwciBzdGQ6OnN0cmluZ192aWV3IEdldFBhZ2VTaXplU3VmZml4KHN0ZDo6c3RyaW5nX3ZpZXcgZGlybmFtZSkgeworICAgIGlmIChFbmRzV2l0aChkaXJuYW1lLCAiXzE2ayIpKSB7CisgICAgICAgIHJldHVybiAiXzE2ayI7CisgICAgfQorICAgIGlmIChFbmRzV2l0aChkaXJuYW1lLCAiXzY0ayIpKSB7CisgICAgICAgIHJldHVybiAiXzY0ayI7CisgICAgfQorICAgIHJldHVybiAiIjsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKLXN0ZDo6c3RyaW5nIEdldE1vZHVsZUxvYWRMaXN0KGJvb2wgcmVjb3ZlcnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJfcGF0aCkgewotICAgIGF1dG8gbW9kdWxlX2xvYWRfZmlsZSA9ICJtb2R1bGVzLmxvYWQiOwotICAgIGlmIChyZWNvdmVyeSkgewotICAgICAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdDsKLSAgICAgICAgc3RkOjpzdHJpbmcgcmVjb3ZlcnlfbG9hZF9wYXRoID0gZGlyX3BhdGggKyAiL21vZHVsZXMubG9hZC5yZWNvdmVyeSI7Ci0gICAgICAgIGlmICghc3RhdChyZWNvdmVyeV9sb2FkX3BhdGguY19zdHIoKSwgJmZpbGVTdGF0KSkgeworc3RkOjpzdHJpbmcgR2V0TW9kdWxlTG9hZExpc3QoQm9vdE1vZGUgYm9vdF9tb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgZGlyX3BhdGgpIHsKKyAgICBzdGQ6OnN0cmluZyBtb2R1bGVfbG9hZF9maWxlOworCisgICAgc3dpdGNoIChib290X21vZGUpIHsKKyAgICAgICAgY2FzZSBCb290TW9kZTo6Tk9STUFMX01PREU6CisgICAgICAgICAgICBtb2R1bGVfbG9hZF9maWxlID0gIm1vZHVsZXMubG9hZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCb290TW9kZTo6UkVDT1ZFUllfTU9ERToKICAgICAgICAgICAgIG1vZHVsZV9sb2FkX2ZpbGUgPSAibW9kdWxlcy5sb2FkLnJlY292ZXJ5IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJvb3RNb2RlOjpDSEFSR0VSX01PREU6CisgICAgICAgICAgICBtb2R1bGVfbG9hZF9maWxlID0gIm1vZHVsZXMubG9hZC5jaGFyZ2VyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtb2R1bGVfbG9hZF9maWxlICE9ICJtb2R1bGVzLmxvYWQiKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0IHt9OworICAgICAgICBzdGQ6OnN0cmluZyBsb2FkX3BhdGggPSBkaXJfcGF0aCArICIvIiArIG1vZHVsZV9sb2FkX2ZpbGU7CisgICAgICAgIC8vIEZhbGwgYmFjayB0byBtb2R1bGVzLmxvYWQgaWYgdGhlIG90aGVyIGZpbGVzIGFyZW4ndCBhY2Nlc3NpYmxlCisgICAgICAgIGlmIChzdGF0KGxvYWRfcGF0aC5jX3N0cigpLCAmZmlsZVN0YXQpKSB7CisgICAgICAgICAgICBtb2R1bGVfbG9hZF9maWxlID0gIm1vZHVsZXMubG9hZCI7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2MywxMiArMjA5LDEzIEBACiB9CiAKICNkZWZpbmUgTU9EVUxFX0JBU0VfRElSICIvbGliL21vZHVsZXMiCi1ib29sIExvYWRLZXJuZWxNb2R1bGVzKGJvb2wgcmVjb3ZlcnksIGJvb2wgd2FudF9jb25zb2xlLCBib29sIHdhbnRfcGFyYWxsZWwsIGludCYgbW9kdWxlc19sb2FkZWQpIHsKLSAgICBzdHJ1Y3QgdXRzbmFtZSB1dHM7Citib29sIExvYWRLZXJuZWxNb2R1bGVzKEJvb3RNb2RlIGJvb3RfbW9kZSwgYm9vbCB3YW50X2NvbnNvbGUsIGJvb2wgd2FudF9wYXJhbGxlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50JiBtb2R1bGVzX2xvYWRlZCkgeworICAgIHN0cnVjdCB1dHNuYW1lIHV0cyB7fTsKICAgICBpZiAodW5hbWUoJnV0cykpIHsKICAgICAgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGdldCBrZXJuZWwgdmVyc2lvbi4iOwogICAgIH0KLSAgICBpbnQgbWFqb3IsIG1pbm9yOworICAgIGludCBtYWpvciA9IDAsIG1pbm9yID0gMDsKICAgICBpZiAoc3NjYW5mKHV0cy5yZWxlYXNlLCAiJWQuJWQiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgewogICAgICAgICBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gcGFyc2Uga2VybmVsIHZlcnNpb24gIiA8PCB1dHMucmVsZWFzZTsKICAgICB9CkBAIC0xNzgsMTMgKzIyNSwzMCBAQAogICAgICAgICBMT0coSU5GTykgPDwgIlVuYWJsZSB0byBvcGVuIC9saWIvbW9kdWxlcywgc2tpcHBpbmcgbW9kdWxlIGxvYWRpbmcuIjsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIGRpcmVudCogZW50cnk7CisgICAgZGlyZW50KiBlbnRyeSA9IG51bGxwdHI7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZV9kaXJzOworICAgIGNvbnN0IGF1dG8gcGFnZV9zaXplX3N1ZmZpeCA9IEdldFBhZ2VTaXplU3VmZml4KCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmVsZWFzZV9zcGVjaWZpY19tb2R1bGVfZGlyID0gdXRzLnJlbGVhc2UgKyBwYWdlX3NpemVfc3VmZml4OwogICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGJhc2VfZGlyLmdldCgpKSkpIHsKICAgICAgICAgaWYgKGVudHJ5LT5kX3R5cGUgIT0gRFRfRElSKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpbnQgZGlyX21ham9yLCBkaXJfbWlub3I7CisgICAgICAgIGlmIChlbnRyeS0+ZF9uYW1lID09IHJlbGVhc2Vfc3BlY2lmaWNfbW9kdWxlX2RpcikgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJSZWxlYXNlIHNwZWNpZmljIGtlcm5lbCBtb2R1bGUgZGlyICIgPDwgcmVsZWFzZV9zcGVjaWZpY19tb2R1bGVfZGlyCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3VuZCwgbG9hZGluZyBtb2R1bGVzIGZyb20gaGVyZSB3aXRoIG5vIGZhbGxiYWNrcy4iOworICAgICAgICAgICAgbW9kdWxlX2RpcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1vZHVsZV9kaXJzLmVtcGxhY2VfYmFjayhlbnRyeS0+ZF9uYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIElzIGEgZGlyZWN0b3J5IGRvZXMgbm90IGhhdmUgcGFnZSBzaXplIHN1ZmZpeCwgaXQgZG9lcyBub3QgbWVhbiB0aGlzIGRpcmVjdG9yeSBpcyBmb3IgNEsKKyAgICAgICAgLy8ga2VybmVscy4gQ2VydGFpbiAxNksga2VybmVsIGJ1aWxkcyBwdXQgYWxsIG1vZHVsZXMgaW4gL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAgd2l0aG91dCBhbnkKKyAgICAgICAgLy8gc3VmZml4LiBUaGVyZWZvcmUsIG9ubHkgaWdub3JlIGEgZGlyZWN0b3J5IGlmIGl0IGhhcyBfMTZrL182NGsgc3VmZml4IGFuZCB0aGUgc3VmZml4IGRvZXMKKyAgICAgICAgLy8gbm90IG1hdGNoIHN5c3RlbSBwYWdlIHNpemUuCisgICAgICAgIGNvbnN0IGF1dG8gZGlyX3BhZ2Vfc2l6ZV9zdWZmaXggPSBHZXRQYWdlU2l6ZVN1ZmZpeChlbnRyeS0+ZF9uYW1lKTsKKyAgICAgICAgaWYgKCFkaXJfcGFnZV9zaXplX3N1ZmZpeC5lbXB0eSgpICYmIGRpcl9wYWdlX3NpemVfc3VmZml4ICE9IHBhZ2Vfc2l6ZV9zdWZmaXgpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBkaXJfbWFqb3IgPSAwLCBkaXJfbWlub3IgPSAwOwogICAgICAgICBpZiAoc3NjYW5mKGVudHJ5LT5kX25hbWUsICIlZC4lZCIsICZkaXJfbWFqb3IsICZkaXJfbWlub3IpICE9IDIgfHwgZGlyX21ham9yICE9IG1ham9yIHx8CiAgICAgICAgICAgICBkaXJfbWlub3IgIT0gbWlub3IpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjAzLDI0ICsyNjcsNTEgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZV9kaXIgOiBtb2R1bGVfZGlycykgewogICAgICAgICBzdGQ6OnN0cmluZyBkaXJfcGF0aCA9IE1PRFVMRV9CQVNFX0RJUiAiLyI7CiAgICAgICAgIGRpcl9wYXRoLmFwcGVuZChtb2R1bGVfZGlyKTsKLSAgICAgICAgTW9kcHJvYmUgbSh7ZGlyX3BhdGh9LCBHZXRNb2R1bGVMb2FkTGlzdChyZWNvdmVyeSwgZGlyX3BhdGgpKTsKKyAgICAgICAgTW9kcHJvYmUgbSh7ZGlyX3BhdGh9LCBHZXRNb2R1bGVMb2FkTGlzdChib290X21vZGUsIGRpcl9wYXRoKSk7CiAgICAgICAgIGJvb2wgcmV0dmFsID0gbS5Mb2FkTGlzdGVkTW9kdWxlcyghd2FudF9jb25zb2xlKTsKICAgICAgICAgbW9kdWxlc19sb2FkZWQgPSBtLkdldE1vZHVsZUNvdW50KCk7CiAgICAgICAgIGlmIChtb2R1bGVzX2xvYWRlZCA+IDApIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiTG9hZGVkICIgPDwgbW9kdWxlc19sb2FkZWQgPDwgIiBtb2R1bGVzIGZyb20gIiA8PCBkaXJfcGF0aDsKICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBNb2Rwcm9iZSBtKHtNT0RVTEVfQkFTRV9ESVJ9LCBHZXRNb2R1bGVMb2FkTGlzdChyZWNvdmVyeSwgTU9EVUxFX0JBU0VfRElSKSk7CisgICAgTW9kcHJvYmUgbSh7TU9EVUxFX0JBU0VfRElSfSwgR2V0TW9kdWxlTG9hZExpc3QoYm9vdF9tb2RlLCBNT0RVTEVfQkFTRV9ESVIpKTsKICAgICBib29sIHJldHZhbCA9ICh3YW50X3BhcmFsbGVsKSA/IG0uTG9hZE1vZHVsZXNQYXJhbGxlbChzdGQ6OnRocmVhZDo6aGFyZHdhcmVfY29uY3VycmVuY3koKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG0uTG9hZExpc3RlZE1vZHVsZXMoIXdhbnRfY29uc29sZSk7CiAgICAgbW9kdWxlc19sb2FkZWQgPSBtLkdldE1vZHVsZUNvdW50KCk7CiAgICAgaWYgKG1vZHVsZXNfbG9hZGVkID4gMCkgeworICAgICAgICBMT0coSU5GTykgPDwgIkxvYWRlZCAiIDw8IG1vZHVsZXNfbG9hZGVkIDw8ICIgbW9kdWxlcyBmcm9tICIgPDwgTU9EVUxFX0JBU0VfRElSOwogICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wgSXNDaGFyZ2VyTW9kZShjb25zdCBzdGQ6OnN0cmluZyYgY21kbGluZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcpIHsKKyAgICByZXR1cm4gYm9vdGNvbmZpZy5maW5kKCJhbmRyb2lkYm9vdC5tb2RlID0gXCJjaGFyZ2VyXCIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyB8fAorICAgICAgICAgICAgY21kbGluZS5maW5kKCJhbmRyb2lkYm9vdC5tb2RlPWNoYXJnZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKK30KKworc3RhdGljIEJvb3RNb2RlIEdldEJvb3RNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lLCBjb25zdCBzdGQ6OnN0cmluZyYgYm9vdGNvbmZpZykKK3sKKyAgICBpZiAoSXNDaGFyZ2VyTW9kZShjbWRsaW5lLCBib290Y29uZmlnKSkKKyAgICAgICAgcmV0dXJuIEJvb3RNb2RlOjpDSEFSR0VSX01PREU7CisgICAgZWxzZSBpZiAoSXNSZWNvdmVyeU1vZGUoKSAmJiAhRm9yY2VOb3JtYWxCb290KGNtZGxpbmUsIGJvb3Rjb25maWcpKQorICAgICAgICByZXR1cm4gQm9vdE1vZGU6OlJFQ09WRVJZX01PREU7CisKKyAgICByZXR1cm4gQm9vdE1vZGU6Ok5PUk1BTF9NT0RFOworfQorCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEZpcnN0U3RhZ2VNb3VudD4gQ3JlYXRlRmlyc3RTdGFnZU1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lKSB7CisgICAgYXV0byByZXQgPSBGaXJzdFN0YWdlTW91bnQ6OkNyZWF0ZShjbWRsaW5lKTsKKyAgICBpZiAocmV0Lm9rKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZSgqcmV0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEZpcnN0U3RhZ2VNb3VudCA6ICIgPDwgcmV0LmVycm9yKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK30KKwogaW50IEZpcnN0U3RhZ2VNYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICAgIGlmIChSRUJPT1RfQk9PVExPQURFUl9PTl9QQU5JQykgewogICAgICAgICBJbnN0YWxsUmVib290U2lnbmFsSGFuZGxlcnMoKTsKQEAgLTMxMSwxMiArNDAyLDI0IEBACiAKICAgICBMT0coSU5GTykgPDwgImluaXQgZmlyc3Qgc3RhZ2Ugc3RhcnRlZCEiOwogCisgICAgLy8gV2Ugb25seSBhbGxvdyAvdmVuZG9yIHBhcnRpdGlvbiBpbiBkZWJ1Z2dhYmxlIE1pY3JvZHJvZCB1bnRpbCBpdCBpcyB2ZXJpZmllZCBkdXJpbmcgYm9vdC4KKyAgICAvLyBUT0RPKGIvMjg1ODU1NDM2KTogcmVtb3ZlIHRoaXMgY2hlY2suCisgICAgaWYgKElzTWljcm9kcm9pZCgpKSB7CisgICAgICAgIGJvb2wgbW91bnRfdmVuZG9yID0KKyAgICAgICAgICAgICAgICBjbWRsaW5lLmZpbmQoImFuZHJvaWRib290Lm1pY3JvZHJvaWQubW91bnRfdmVuZG9yPTEiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgYm9vbCBkZWJ1Z2dhYmxlID0KKyAgICAgICAgICAgICAgICBib290Y29uZmlnLmZpbmQoImFuZHJvaWRib290Lm1pY3JvZHJvaWQuZGVidWdnYWJsZSA9IFwiMVwiIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgIGlmIChtb3VudF92ZW5kb3IgJiYgIWRlYnVnZ2FibGUpIHsKKyAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkF0dGVtcHRlZCB0byBtb3VudCAvdmVuZG9yIHBhcnRpdGlvbiBmb3Igbm9uLWRlYnVnZ2FibGUgTWljcm9kcm9pZCBWTSI7CisgICAgICAgIH0KKyAgICB9CisKICAgICBhdXRvIG9sZF9yb290X2RpciA9IHN0ZDo6dW5pcXVlX3B0cjxESVIsIGRlY2x0eXBlKCZjbG9zZWRpcik+e29wZW5kaXIoIi8iKSwgY2xvc2VkaXJ9OwogICAgIGlmICghb2xkX3Jvb3RfZGlyKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3Qgb3BlbmRpcihcIi9cIiksIG5vdCBmcmVlaW5nIHJhbWRpc2siOwogICAgIH0KIAotICAgIHN0cnVjdCBzdGF0IG9sZF9yb290X2luZm87CisgICAgc3RydWN0IHN0YXQgb2xkX3Jvb3RfaW5mbyB7fTsKICAgICBpZiAoc3RhdCgiLyIsICZvbGRfcm9vdF9pbmZvKSAhPSAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3Qgc3RhdChcIi9cIiksIG5vdCBmcmVlaW5nIHJhbWRpc2siOwogICAgICAgICBvbGRfcm9vdF9kaXIucmVzZXQoKTsKQEAgLTMyOCw3ICs0MzEsOCBAQAogCiAgICAgYm9vdF9jbG9jazo6dGltZV9wb2ludCBtb2R1bGVfc3RhcnRfdGltZSA9IGJvb3RfY2xvY2s6Om5vdygpOwogICAgIGludCBtb2R1bGVfY291bnQgPSAwOwotICAgIGlmICghTG9hZEtlcm5lbE1vZHVsZXMoSXNSZWNvdmVyeU1vZGUoKSAmJiAhRm9yY2VOb3JtYWxCb290KGNtZGxpbmUsIGJvb3Rjb25maWcpLCB3YW50X2NvbnNvbGUsCisgICAgQm9vdE1vZGUgYm9vdF9tb2RlID0gR2V0Qm9vdE1vZGUoY21kbGluZSwgYm9vdGNvbmZpZyk7CisgICAgaWYgKCFMb2FkS2VybmVsTW9kdWxlcyhib290X21vZGUsIHdhbnRfY29uc29sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRfcGFyYWxsZWwsIG1vZHVsZV9jb3VudCkpIHsKICAgICAgICAgaWYgKHdhbnRfY29uc29sZSAhPSBGaXJzdFN0YWdlQ29uc29sZVBhcmFtOjpESVNBQkxFRCkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGxvYWQga2VybmVsIG1vZHVsZXMsIHN0YXJ0aW5nIGNvbnNvbGUiOwpAQCAtMzQ0LDEyICs0NDgsMTcgQEAKICAgICAgICAgICAgICAgICAgIDw8IG1vZHVsZV9lbGFwc2VfdGltZS5jb3VudCgpIDw8ICIgbXMiOwogICAgIH0KIAorICAgIHN0ZDo6dW5pcXVlX3B0cjxGaXJzdFN0YWdlTW91bnQ+IGZzbTsKKwogICAgIGJvb2wgY3JlYXRlZF9kZXZpY2VzID0gZmFsc2U7CiAgICAgaWYgKHdhbnRfY29uc29sZSA9PSBGaXJzdFN0YWdlQ29uc29sZVBhcmFtOjpDT05TT0xFX09OX0ZBSUxVUkUpIHsKICAgICAgICAgaWYgKCFJc1JlY292ZXJ5TW9kZSgpKSB7Ci0gICAgICAgICAgICBjcmVhdGVkX2RldmljZXMgPSBEb0NyZWF0ZURldmljZXMoKTsKLSAgICAgICAgICAgIGlmICghY3JlYXRlZF9kZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugbm9kZXMgZWFybHkiOworICAgICAgICAgICAgZnNtID0gQ3JlYXRlRmlyc3RTdGFnZU1vdW50KGNtZGxpbmUpOworICAgICAgICAgICAgaWYgKGZzbSkgeworICAgICAgICAgICAgICAgIGNyZWF0ZWRfZGV2aWNlcyA9IGZzbS0+RG9DcmVhdGVEZXZpY2VzKCk7CisgICAgICAgICAgICAgICAgaWYgKCFjcmVhdGVkX2RldmljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugbm9kZXMgZWFybHkiOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBTdGFydENvbnNvbGUoY21kbGluZSk7CkBAIC00MDAsMTEgKzUwOSwyNiBAQAogICAgICAgICBTd2l0Y2hSb290KCIvZmlyc3Rfc3RhZ2VfcmFtZGlzayIpOwogICAgIH0KIAotICAgIGlmICghRG9GaXJzdFN0YWdlTW91bnQoIWNyZWF0ZWRfZGV2aWNlcykpIHsKLSAgICAgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIG1vdW50IHJlcXVpcmVkIHBhcnRpdGlvbnMgZWFybHkgLi4uIjsKKyAgICBpZiAoSXNSZWNvdmVyeU1vZGUoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIkZpcnN0IHN0YWdlIG1vdW50IHNraXBwZWQgKHJlY292ZXJ5IG1vZGUpIjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWZzbSkgeworICAgICAgICAgICAgZnNtID0gQ3JlYXRlRmlyc3RTdGFnZU1vdW50KGNtZGxpbmUpOworICAgICAgICB9CisgICAgICAgIGlmICghZnNtKSB7CisgICAgICAgICAgICBMT0coRkFUQUwpIDw8ICJGaXJzdFN0YWdlTW91bnQgbm90IGF2YWlsYWJsZSI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNyZWF0ZWRfZGV2aWNlcyAmJiAhZnNtLT5Eb0NyZWF0ZURldmljZXMoKSkgeworICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2VzIHJlcXVpcmVkIGZvciBmaXJzdCBzdGFnZSBtb3VudCI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZzbS0+RG9GaXJzdFN0YWdlTW91bnQoKSkgeworICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIG1vdW50IHJlcXVpcmVkIHBhcnRpdGlvbnMgZWFybHkgLi4uIjsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHN0cnVjdCBzdGF0IG5ld19yb290X2luZm87CisgICAgc3RydWN0IHN0YXQgbmV3X3Jvb3RfaW5mbyB7fTsKICAgICBpZiAoc3RhdCgiLyIsICZuZXdfcm9vdF9pbmZvKSAhPSAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3Qgc3RhdChcIi9cIiksIG5vdCBmcmVlaW5nIHJhbWRpc2siOwogICAgICAgICBvbGRfcm9vdF9kaXIucmVzZXQoKTsKZGlmZiAtLWdpdCBhL2luaXQvZmlyc3Rfc3RhZ2VfbW91bnQuY3BwIGIvaW5pdC9maXJzdF9zdGFnZV9tb3VudC5jcHAKaW5kZXggMDdjZTQ1OC4uYzBiOTI4MSAxMDA2NDQKLS0tIGEvaW5pdC9maXJzdF9zdGFnZV9tb3VudC5jcHAKKysrIGIvaW5pdC9maXJzdF9zdGFnZV9tb3VudC5jcHAKQEAgLTc2LDIxICs3NiwyMSBAQAogCiAvLyBDbGFzcyBEZWNsYXJhdGlvbnMKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLQotY2xhc3MgRmlyc3RTdGFnZU1vdW50IHsKK2NsYXNzIEZpcnN0U3RhZ2VNb3VudFZCb290VjIgOiBwdWJsaWMgRmlyc3RTdGFnZU1vdW50IHsKICAgcHVibGljOgotICAgIEZpcnN0U3RhZ2VNb3VudChGc3RhYiBmc3RhYik7Ci0gICAgdmlydHVhbCB+Rmlyc3RTdGFnZU1vdW50KCkgPSBkZWZhdWx0OworICAgIGZyaWVuZCB2b2lkIFNldEluaXRBdmJWZXJzaW9uSW5SZWNvdmVyeSgpOwogCi0gICAgLy8gVGhlIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIEZpcnN0U3RhZ2VNb3VudFZCb290VjIgaW5zdGFuY2UuCi0gICAgc3RhdGljIFJlc3VsdDxzdGQ6OnVuaXF1ZV9wdHI8Rmlyc3RTdGFnZU1vdW50Pj4gQ3JlYXRlKCk7Ci0gICAgYm9vbCBEb0NyZWF0ZURldmljZXMoKTsgICAgLy8gQ3JlYXRlcyBkZXZpY2VzIGFuZCBsb2dpY2FsIHBhcnRpdGlvbnMgZnJvbSBzdG9yYWdlIGRldmljZXMKLSAgICBib29sIERvRmlyc3RTdGFnZU1vdW50KCk7ICAvLyBNb3VudHMgZnN0YWIgZW50cmllcyByZWFkIGZyb20gZGV2aWNlIHRyZWUuCisgICAgRmlyc3RTdGFnZU1vdW50VkJvb3RWMihGc3RhYiBmc3RhYik7CisgICAgdmlydHVhbCB+Rmlyc3RTdGFnZU1vdW50VkJvb3RWMigpID0gZGVmYXVsdDsKKworICAgIGJvb2wgRG9DcmVhdGVEZXZpY2VzKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBEb0ZpcnN0U3RhZ2VNb3VudCgpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CiAgICAgYm9vbCBJbml0RGV2aWNlcygpOwotCi0gIHByb3RlY3RlZDoKICAgICBib29sIEluaXRSZXF1aXJlZERldmljZXMoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGRldmljZXMpOwogICAgIGJvb2wgQ3JlYXRlTG9naWNhbFBhcnRpdGlvbnMoKTsKLSAgICBib29sIENyZWF0ZVNuYXBzaG90UGFydGl0aW9ucyhhbmRyb2lkOjpzbmFwc2hvdDo6U25hcHNob3RNYW5hZ2VyKiBzbSk7CisgICAgYm9vbCBDcmVhdGVTbmFwc2hvdFBhcnRpdGlvbnMoU25hcHNob3RNYW5hZ2VyKiBzbSk7CiAgICAgYm9vbCBNb3VudFBhcnRpdGlvbihjb25zdCBGc3RhYjo6aXRlcmF0b3ImIGJlZ2luLCBib29sIGVyYXNlX3NhbWVfbW91bnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgRnN0YWI6Oml0ZXJhdG9yKiBlbmQgPSBudWxscHRyKTsKIApAQCAtMTA2LDkgKzEwNiwxMCBAQAogICAgIC8vIHJldm9jYXRpb24gY2hlY2sgYnkgRFNVIGluc3RhbGxhdGlvbiBzZXJ2aWNlLgogICAgIHZvaWQgQ29weURzdUF2YktleXMoKTsKIAotICAgIC8vIFB1cmUgdmlydHVhbCBmdW5jdGlvbnMuCi0gICAgdmlydHVhbCBib29sIEdldERtVmVyaXR5RGV2aWNlcyhzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGRldmljZXMpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgU2V0VXBEbVZlcml0eShGc3RhYkVudHJ5KiBmc3RhYl9lbnRyeSkgPSAwOworICAgIGJvb2wgR2V0RG1WZXJpdHlEZXZpY2VzKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZGV2aWNlcyk7CisgICAgYm9vbCBTZXRVcERtVmVyaXR5KEZzdGFiRW50cnkqIGZzdGFiX2VudHJ5KTsKKworICAgIGJvb2wgSW5pdEF2YkhhbmRsZSgpOwogCiAgICAgYm9vbCBuZWVkX2RtX3Zlcml0eV87CiAgICAgYm9vbCBkc3Vfbm90X29uX3VzZXJkYXRhXyA9IGZhbHNlOwpAQCAtMTIyLDE5ICsxMjMsNiBAQAogICAgIC8vIFJlYWRzIGFsbCBBVkIga2V5cyBiZWZvcmUgY2hyb290IGludG8gL3N5c3RlbSwgYXMgdGhleSBtaWdodCBiZSB1c2VkCiAgICAgLy8gbGF0ZXIgd2hlbiBtb3VudGluZyBvdGhlciBwYXJ0aXRpb25zLCBlLmcuLCAvdmVuZG9yIGFuZCAvcHJvZHVjdC4KICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBwcmVsb2FkX2F2Yl9rZXlfYmxvYnNfOwotfTsKLQotY2xhc3MgRmlyc3RTdGFnZU1vdW50VkJvb3RWMiA6IHB1YmxpYyBGaXJzdFN0YWdlTW91bnQgewotICBwdWJsaWM6Ci0gICAgZnJpZW5kIHZvaWQgU2V0SW5pdEF2YlZlcnNpb25JblJlY292ZXJ5KCk7Ci0KLSAgICBGaXJzdFN0YWdlTW91bnRWQm9vdFYyKEZzdGFiIGZzdGFiKTsKLSAgICB+Rmlyc3RTdGFnZU1vdW50VkJvb3RWMigpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgYm9vbCBHZXREbVZlcml0eURldmljZXMoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBkZXZpY2VzKSBvdmVycmlkZTsKLSAgICBib29sIFNldFVwRG1WZXJpdHkoRnN0YWJFbnRyeSogZnN0YWJfZW50cnkpIG92ZXJyaWRlOwotICAgIGJvb2wgSW5pdEF2YkhhbmRsZSgpOwogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZibWV0YV9wYXJ0aXRpb25zXzsKICAgICBBdmJVbmlxdWVQdHIgYXZiX2hhbmRsZV87CkBAIC0xNTAsNyArMTM4LDcgQEAKICAgICByZXR1cm4gaXNfYW5kcm9pZF9kdF92YWx1ZV9leHBlY3RlZCgidmJtZXRhL2NvbXBhdGlibGUiLCAiYW5kcm9pZCx2Ym1ldGEiKTsKIH0KIAotc3RhdGljIFJlc3VsdDxGc3RhYj4gUmVhZEZpcnN0U3RhZ2VGc3RhYigpIHsKK3N0YXRpYyBSZXN1bHQ8RnN0YWI+IFJlYWRGaXJzdFN0YWdlRnN0YWJBbmRyb2lkKCkgewogICAgIEZzdGFiIGZzdGFiOwogICAgIGlmICghUmVhZEZzdGFiRnJvbUR0KCZmc3RhYikpIHsKICAgICAgICAgaWYgKFJlYWREZWZhdWx0RnN0YWIoJmZzdGFiKSkgewpAQCAtMTY2LDYgKzE1NCwyNCBAQAogICAgIHJldHVybiBmc3RhYjsKIH0KIAorLy8gTm90ZTogdGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiB0byBhdm9pZCBibG9ja2luZyBkZXZzIHRoYXQgZGVwZW5kIG9uIC92ZW5kb3IgcGFydGl0aW9uIGluCisvLyBNaWNyb2Ryb2lkLiBGb3IgdGhlIHByb3BlciBzb2x1dGlvbiB0aGUgL3ZlbmRvciBmc3RhYiBzaG91bGQgcHJvYmFibHkgYmUgZGVmaW5lZCBpbiB0aGUgRFQuCisvLyBUT0RPKGIvMjg1ODU1NDMwKTogcmVmYWN0b3IgdGhpcworLy8gVE9ETyhiLzI4NTg1NTQzNik6IHZlcmlmeSBrZXkgbWljcm9kcm9pZC12ZW5kb3Igd2FzIHNpZ25lZCB3aXRoLgorLy8gVE9ETyhiLzI4NTg1NTQzNik6IHNob3VsZCBiZSBtb3VudGVkIG9uIHRvcCBvZiBkbS12ZXJpdHkgZGV2aWNlLgorc3RhdGljIFJlc3VsdDxGc3RhYj4gUmVhZEZpcnN0U3RhZ2VGc3RhYk1pY3JvZHJvaWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUpIHsKKyAgICBGc3RhYiBmc3RhYjsKKyAgICBpZiAoIVJlYWREZWZhdWx0RnN0YWIoJmZzdGFiKSkgeworICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiZmFpbGVkIHRvIHJlYWQgZnN0YWIiOworICAgIH0KKyAgICBpZiAoY21kbGluZS5maW5kKCJhbmRyb2lkYm9vdC5taWNyb2Ryb2lkLm1vdW50X3ZlbmRvcj0xIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gV2Ugd2VyZW4ndCBhc2tlZCB0byBtb3VudCAvdmVuZG9yIHBhcnRpdGlvbiwgZmlsdGVyIGl0IG91dCBmcm9tIHRoZSBmc3RhYi4KKyAgICAgICAgYXV0byBwcmVkaWNhdGUgPSBbXShjb25zdCBhdXRvJiBlbnRyeSkgeyByZXR1cm4gZW50cnkubW91bnRfcG9pbnQgPT0gIi92ZW5kb3IiOyB9OworICAgICAgICBmc3RhYi5lcmFzZShzdGQ6OnJlbW92ZV9pZihmc3RhYi5iZWdpbigpLCBmc3RhYi5lbmQoKSwgcHJlZGljYXRlKSwgZnN0YWIuZW5kKCkpOworICAgIH0KKyAgICByZXR1cm4gZnN0YWI7Cit9CisKIHN0YXRpYyBib29sIEdldFJvb3RFbnRyeShGc3RhYkVudHJ5KiByb290X2VudHJ5KSB7CiAgICAgRnN0YWIgcHJvY19tb3VudHM7CiAgICAgaWYgKCFSZWFkRnN0YWJGcm9tRmlsZSgiL3Byb2MvbW91bnRzIiwgJnByb2NfbW91bnRzKSkgewpAQCAtMjE4LDE0ICsyMjQsMTMgQEAKICAgICByZXR1cm4gcm9sbGJhY2tlZDsKIH0KIAotLy8gQ2xhc3MgRGVmaW5pdGlvbnMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tCi1GaXJzdFN0YWdlTW91bnQ6OkZpcnN0U3RhZ2VNb3VudChGc3RhYiBmc3RhYikgOiBuZWVkX2RtX3Zlcml0eV8oZmFsc2UpLCBmc3RhYl8oc3RkOjptb3ZlKGZzdGFiKSkgewotICAgIHN1cGVyX3BhcnRpdGlvbl9uYW1lXyA9IGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoKTsKLX0KLQotUmVzdWx0PHN0ZDo6dW5pcXVlX3B0cjxGaXJzdFN0YWdlTW91bnQ+PiBGaXJzdFN0YWdlTW91bnQ6OkNyZWF0ZSgpIHsKLSAgICBhdXRvIGZzdGFiID0gUmVhZEZpcnN0U3RhZ2VGc3RhYigpOworUmVzdWx0PHN0ZDo6dW5pcXVlX3B0cjxGaXJzdFN0YWdlTW91bnQ+PiBGaXJzdFN0YWdlTW91bnQ6OkNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYgY21kbGluZSkgeworICAgIFJlc3VsdDxGc3RhYj4gZnN0YWI7CisgICAgaWYgKElzTWljcm9kcm9pZCgpKSB7CisgICAgICAgIGZzdGFiID0gUmVhZEZpcnN0U3RhZ2VGc3RhYk1pY3JvZHJvaWQoY21kbGluZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnN0YWIgPSBSZWFkRmlyc3RTdGFnZUZzdGFiQW5kcm9pZCgpOworICAgIH0KICAgICBpZiAoIWZzdGFiLm9rKCkpIHsKICAgICAgICAgcmV0dXJuIGZzdGFiLmVycm9yKCk7CiAgICAgfQpAQCAtMjMzLDcgKzIzOCw3IEBACiAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rmlyc3RTdGFnZU1vdW50VkJvb3RWMj4oc3RkOjptb3ZlKCpmc3RhYikpOwogfQogCi1ib29sIEZpcnN0U3RhZ2VNb3VudDo6RG9DcmVhdGVEZXZpY2VzKCkgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpEb0NyZWF0ZURldmljZXMoKSB7CiAgICAgaWYgKCFJbml0RGV2aWNlcygpKSByZXR1cm4gZmFsc2U7CiAKICAgICAvLyBNb3VudCAvbWV0YWRhdGEgYmVmb3JlIGNyZWF0aW5nIGxvZ2ljYWwgcGFydGl0aW9ucywgc2luY2Ugd2UgbmVlZCB0bwpAQCAtMjU1LDcgKzI2MCw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpEb0ZpcnN0U3RhZ2VNb3VudCgpIHsKK2Jvb2wgRmlyc3RTdGFnZU1vdW50VkJvb3RWMjo6RG9GaXJzdFN0YWdlTW91bnQoKSB7CiAgICAgaWYgKCFJc0RtTGluZWFyRW5hYmxlZCgpICYmIGZzdGFiXy5lbXB0eSgpKSB7CiAgICAgICAgIC8vIE5vdGhpbmcgdG8gbW91bnQuCiAgICAgICAgIExPRyhJTkZPKSA8PCAiRmlyc3Qgc3RhZ2UgbW91bnQgc2tpcHBlZCAobWlzc2luZy9pbmNvbXBhdGlibGUvZW1wdHkgZnN0YWIgaW4gZGV2aWNlIHRyZWUpIjsKQEAgLTI2Nyw3ICsyNzIsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEZpcnN0U3RhZ2VNb3VudDo6SW5pdERldmljZXMoKSB7Citib29sIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OkluaXREZXZpY2VzKCkgewogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VzOwogICAgIEdldFN1cGVyRGV2aWNlTmFtZSgmZGV2aWNlcyk7CiAKQEAgLTI4OCwxNCArMjkzLDE0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpJc0RtTGluZWFyRW5hYmxlZCgpIHsKK2Jvb2wgRmlyc3RTdGFnZU1vdW50VkJvb3RWMjo6SXNEbUxpbmVhckVuYWJsZWQoKSB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGZzdGFiXykgewogICAgICAgICBpZiAoZW50cnkuZnNfbWdyX2ZsYWdzLmxvZ2ljYWwpIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgRmlyc3RTdGFnZU1vdW50OjpHZXRTdXBlckRldmljZU5hbWUoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBkZXZpY2VzKSB7Cit2b2lkIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OkdldFN1cGVyRGV2aWNlTmFtZShzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGRldmljZXMpIHsKICAgICAvLyBBZGQgYW55IGFkZGl0aW9uYWwgZGV2aWNlcyByZXF1aXJlZCBmb3IgZG0tbGluZWFyIG1hcHBpbmdzLgogICAgIGlmICghSXNEbUxpbmVhckVuYWJsZWQoKSkgewogICAgICAgICByZXR1cm47CkBAIC0zMDcsNyArMzEyLDcgQEAKIC8vIENyZWF0ZXMgZGV2aWNlcyB3aXRoIHVldmVudC0+cGFydGl0aW9uX25hbWUgbWF0Y2hpbmcgb25lcyBpbiB0aGUgZ2l2ZW4gc2V0LgogLy8gRm91bmQgcGFydGl0aW9ucyB3aWxsIHRoZW4gYmUgcmVtb3ZlZCBmcm9tIGl0IGZvciB0aGUgc3Vic2VxdWVudCBtZW1iZXIKIC8vIGZ1bmN0aW9uIHRvIGNoZWNrIHdoaWNoIGRldmljZXMgYXJlIE5PVCBjcmVhdGVkLgotYm9vbCBGaXJzdFN0YWdlTW91bnQ6OkluaXRSZXF1aXJlZERldmljZXMoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGRldmljZXMpIHsKK2Jvb2wgRmlyc3RTdGFnZU1vdW50VkJvb3RWMjo6SW5pdFJlcXVpcmVkRGV2aWNlcyhzdGQ6OnNldDxzdGQ6OnN0cmluZz4gZGV2aWNlcykgewogICAgIGlmICghYmxvY2tfZGV2X2luaXRfLkluaXREZXZpY2VNYXBwZXIoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMzE3LDcgKzMyMiw4IEBACiAgICAgcmV0dXJuIGJsb2NrX2Rldl9pbml0Xy5Jbml0RGV2aWNlcyhzdGQ6Om1vdmUoZGV2aWNlcykpOwogfQogCi1ib29sIEZpcnN0U3RhZ2VNb3VudDo6SW5pdERtTGluZWFyQmFja2luZ0RldmljZXMoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpMcE1ldGFkYXRhJiBtZXRhZGF0YSkgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpJbml0RG1MaW5lYXJCYWNraW5nRGV2aWNlcygKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpMcE1ldGFkYXRhJiBtZXRhZGF0YSkgewogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VzOwogCiAgICAgYXV0byBwYXJ0aXRpb25fbmFtZXMgPSBhbmRyb2lkOjpmc19tZ3I6OkdldEJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZXMobWV0YWRhdGEpOwpAQCAtMzM0LDcgKzM0MCw3IEBACiAgICAgcmV0dXJuIEluaXRSZXF1aXJlZERldmljZXMoc3RkOjptb3ZlKGRldmljZXMpKTsKIH0KIAotYm9vbCBGaXJzdFN0YWdlTW91bnQ6OkNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25zKCkgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpDcmVhdGVMb2dpY2FsUGFydGl0aW9ucygpIHsKICAgICBpZiAoIUlzRG1MaW5lYXJFbmFibGVkKCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMzY1LDcgKzM3MSw3IEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvbnMoKm1ldGFkYXRhLmdldCgpLCBzdXBlcl9wYXRoXyk7CiB9CiAKLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpDcmVhdGVTbmFwc2hvdFBhcnRpdGlvbnMoU25hcHNob3RNYW5hZ2VyKiBzbSkgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpDcmVhdGVTbmFwc2hvdFBhcnRpdGlvbnMoU25hcHNob3RNYW5hZ2VyKiBzbSkgewogICAgIC8vIFdoZW4gQ09XIGltYWdlcyBhcmUgcHJlc2VudCBmb3Igc25hcHNob3RzLCB0aGV5IGFyZSBzdG9yZWQgb24KICAgICAvLyB0aGUgZGF0YSBwYXJ0aXRpb24uCiAgICAgaWYgKCFJbml0UmVxdWlyZWREZXZpY2VzKHsidXNlcmRhdGEifSkpIHsKQEAgLTQwMCw4ICs0MDYsOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEZpcnN0U3RhZ2VNb3VudDo6TW91bnRQYXJ0aXRpb24oY29uc3QgRnN0YWI6Oml0ZXJhdG9yJiBiZWdpbiwgYm9vbCBlcmFzZV9zYW1lX21vdW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGc3RhYjo6aXRlcmF0b3IqIGVuZCkgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpNb3VudFBhcnRpdGlvbihjb25zdCBGc3RhYjo6aXRlcmF0b3ImIGJlZ2luLCBib29sIGVyYXNlX3NhbWVfbW91bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGc3RhYjo6aXRlcmF0b3IqIGVuZCkgewogICAgIC8vIFNldHMgZW5kIHRvIGJlZ2luICsgMSwgc28gd2UgY2FuIGp1c3QgcmV0dXJuIG9uIGZhaWx1cmUgYmVsb3cuCiAgICAgaWYgKGVuZCkgewogICAgICAgICAqZW5kID0gYmVnaW4gKyAxOwpAQCAtNDQ1LDcgKzQ1MSw3IEBACiAgICAgcmV0dXJuIG1vdW50ZWQ7CiB9CiAKLXZvaWQgRmlyc3RTdGFnZU1vdW50OjpQcmVsb2FkQXZiS2V5cygpIHsKK3ZvaWQgRmlyc3RTdGFnZU1vdW50VkJvb3RWMjo6UHJlbG9hZEF2YktleXMoKSB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGZzdGFiXykgewogICAgICAgICAvLyBObyBuZWVkIHRvIGNhY2hlIHRoZSBrZXkgY29udGVudCBpZiBpdCdzIGVtcHR5LCBvciBpcyBhbHJlYWR5IGNhY2hlZC4KICAgICAgICAgaWYgKGVudHJ5LmF2Yl9rZXlzLmVtcHR5KCkgfHwgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzXy5jb3VudChlbnRyeS5hdmJfa2V5cykpIHsKQEAgLTQ5Miw3ICs0OTgsNyBAQAogLy8gSWYgc3lzdGVtIGlzIGluIHRoZSBmc3RhYiB0aGVuIHdlJ3JlIG5vdCBhIHN5c3RlbS1hcy1yb290IGRldmljZSwgYW5kIGluCiAvLyB0aGlzIGNhc2UsIHdlIG1vdW50IHN5c3RlbSBmaXJzdCB0aGVuIHBpdm90IHRvIGl0LiAgRnJvbSB0aGF0IHBvaW50IG9uLAogLy8gd2UgYXJlIGVmZmVjdGl2ZWx5IGlkZW50aWNhbCB0byBhIHN5c3RlbS1hcy1yb290IGRldmljZS4KLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpUcnlTd2l0Y2hTeXN0ZW1Bc1Jvb3QoKSB7Citib29sIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OlRyeVN3aXRjaFN5c3RlbUFzUm9vdCgpIHsKICAgICBVc2VEc3VJZlByZXNlbnQoKTsKICAgICAvLyBQcmVsb2FkaW5nIGFsbCBBVkIga2V5cyBmcm9tIHRoZSByYW1kaXNrIGJlZm9yZSBzd2l0Y2hpbmcgcm9vdCB0byAvc3lzdGVtLgogICAgIFByZWxvYWRBdmJLZXlzKCk7CkBAIC01MjEsNyArNTI3LDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaXJzdFN0YWdlTW91bnQ6Ok1vdW50UGFydGl0aW9ucygpIHsKK2Jvb2wgRmlyc3RTdGFnZU1vdW50VkJvb3RWMjo6TW91bnRQYXJ0aXRpb25zKCkgewogICAgIGlmICghVHJ5U3dpdGNoU3lzdGVtQXNSb290KCkpIHJldHVybiBmYWxzZTsKIAogICAgIGlmICghU2tpcE1vdW50aW5nUGFydGl0aW9ucygmZnN0YWJfLCB0cnVlIC8qIHZlcmJvc2UgKi8pKSByZXR1cm4gZmFsc2U7CkBAIC02MDQsNyArNjEwLDcgQEAKIC8vIGNvcHkgZmlsZXMgdG8gL21ldGFkYXRhIGlzIE5PVCBmYXRhbCwgYmVjYXVzZSBpdCBpcyBhdXhpbGlhcnkgdG8gcGVyZm9ybQogLy8gcHVibGljIGtleSBtYXRjaGluZyBiZWZvcmUgYm9vdGluZyBpbnRvIERTVSBpbWFnZXMgb24gbmV4dCBib290LiBUaGUgYWN0dWFsCiAvLyBwdWJsaWMga2V5IG1hdGNoaW5nIHdpbGwgc3RpbGwgYmUgZG9uZSBvbiBuZXh0IGJvb3QgdG8gRFNVLgotdm9pZCBGaXJzdFN0YWdlTW91bnQ6OkNvcHlEc3VBdmJLZXlzKCkgewordm9pZCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpDb3B5RHN1QXZiS2V5cygpIHsKICAgICBzdGQ6OmVycm9yX2NvZGUgZWM7CiAgICAgLy8gUmVtb3ZpbmcgZXhpc3Rpbmcga2V5cyBpbiBnc2k6OmtEc3VBdmJLZXlEaXIgYXMgdGhleSBtaWdodCBiZSBzdGFsZS4KICAgICBzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZV9hbGwoZ3NpOjprRHN1QXZiS2V5RGlyLCBlYyk7CkBAIC02MjAsNyArNjI2LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgRmlyc3RTdGFnZU1vdW50OjpVc2VEc3VJZlByZXNlbnQoKSB7Cit2b2lkIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OlVzZURzdUlmUHJlc2VudCgpIHsKICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKIAogICAgIGlmICghYW5kcm9pZDo6Z3NpOjpDYW5Cb290SW50b0dzaSgmZXJyb3IpKSB7CkBAIC02NTcsMTAgKzY2MywxMCBAQAogICAgIFRyYW5zZm9ybUZzdGFiRm9yRHN1KCZmc3RhYl8sIGFjdGl2ZV9kc3UsIGRzdV9wYXJ0aXRpb25zKTsKIH0KIAotLy8gRmlyc3QgcmV0cmlldmUgYW55IHZibWV0YSBwYXJ0aXRpb25zIGZyb20gZGV2aWNlIHRyZWUgKGxlZ2FjeSkgdGhlbiByZWFkIHRocm91Z2ggdGhlIGZzdGFiCi0vLyBmb3IgYW55IGZ1cnRoZXIgdmJtZXRhIHBhcnRpdGlvbnMuCiBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpGaXJzdFN0YWdlTW91bnRWQm9vdFYyKEZzdGFiIGZzdGFiKQotICAgIDogRmlyc3RTdGFnZU1vdW50KHN0ZDo6bW92ZShmc3RhYikpLCBhdmJfaGFuZGxlXyhudWxscHRyKSB7CisgICAgOiBuZWVkX2RtX3Zlcml0eV8oZmFsc2UpLCBmc3RhYl8oc3RkOjptb3ZlKGZzdGFiKSksIGF2Yl9oYW5kbGVfKG51bGxwdHIpIHsKKyAgICBzdXBlcl9wYXJ0aXRpb25fbmFtZV8gPSBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKCk7CisKICAgICBzdGQ6OnN0cmluZyBkZXZpY2VfdHJlZV92Ym1ldGFfcGFydHM7CiAgICAgcmVhZF9hbmRyb2lkX2R0X2ZpbGUoInZibWV0YS9wYXJ0cyIsICZkZXZpY2VfdHJlZV92Ym1ldGFfcGFydHMpOwogCkBAIC03MjYsNiArNzMyLDE1IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgSXNIYXNodHJlZURpc2FibGVkKGNvbnN0IEF2YkhhbmRsZSYgdmJtZXRhLCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQpIHsKKyAgICBpZiAodmJtZXRhLnN0YXR1cygpID09IEF2YkhhbmRsZVN0YXR1czo6a0hhc2h0cmVlRGlzYWJsZWQgfHwKKyAgICAgICAgdmJtZXRhLnN0YXR1cygpID09IEF2YkhhbmRsZVN0YXR1czo6a1ZlcmlmaWNhdGlvbkRpc2FibGVkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRvcC1sZXZlbCB2Ym1ldGEgaXMgZGlzYWJsZWQsIHNraXAgSGFzaHRyZWUgc2V0dXAgZm9yICIgPDwgbW91bnRfcG9pbnQ7CisgICAgICAgIHJldHVybiB0cnVlOyAgLy8gUmV0dXJucyB0cnVlIHRvIG1vdW50IHRoZSBwYXJ0aXRpb24gZGlyZWN0bHkuCisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpTZXRVcERtVmVyaXR5KEZzdGFiRW50cnkqIGZzdGFiX2VudHJ5KSB7CiAgICAgQXZiSGFzaHRyZWVSZXN1bHQgaGFzaHRyZWVfcmVzdWx0OwogCkBAIC03MzQsMzQgKzc0OSw0NiBAQAogICAgIGlmICghZnN0YWJfZW50cnktPmF2Yl9rZXlzLmVtcHR5KCkpIHsKICAgICAgICAgaWYgKCFJbml0QXZiSGFuZGxlKCkpIHJldHVybiBmYWxzZTsKICAgICAgICAgLy8gQ2hlY2tzIGlmIGhhc2h0cmVlIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIHRoZSB0b3AtbGV2ZWwgL3ZibWV0YS4KLSAgICAgICAgaWYgKGF2Yl9oYW5kbGVfLT5zdGF0dXMoKSA9PSBBdmJIYW5kbGVTdGF0dXM6OmtIYXNodHJlZURpc2FibGVkIHx8Ci0gICAgICAgICAgICBhdmJfaGFuZGxlXy0+c3RhdHVzKCkgPT0gQXZiSGFuZGxlU3RhdHVzOjprVmVyaWZpY2F0aW9uRGlzYWJsZWQpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRvcC1sZXZlbCB2Ym1ldGEgaXMgZGlzYWJsZWQsIHNraXAgSGFzaHRyZWUgc2V0dXAgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZnN0YWJfZW50cnktPm1vdW50X3BvaW50OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBSZXR1cm5zIHRydWUgdG8gbW91bnQgdGhlIHBhcnRpdGlvbiBkaXJlY3RseS4KKyAgICAgICAgaWYgKElzSGFzaHRyZWVEaXNhYmxlZCgqYXZiX2hhbmRsZV8sIGZzdGFiX2VudHJ5LT5tb3VudF9wb2ludCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gYXZiX3N0YW5kYWxvbmVfaGFuZGxlID0gQXZiSGFuZGxlOjpMb2FkQW5kVmVyaWZ5VmJtZXRhKAorICAgICAgICAgICAgICAgICpmc3RhYl9lbnRyeSwgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzX1tmc3RhYl9lbnRyeS0+YXZiX2tleXNdKTsKKyAgICAgICAgaWYgKCFhdmJfc3RhbmRhbG9uZV9oYW5kbGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBsb2FkIG9mZmxpbmUgdmJtZXRhIGZvciAiIDw8IGZzdGFiX2VudHJ5LT5tb3VudF9wb2ludDsKKyAgICAgICAgICAgIC8vIEZhbGxiYWNrcyB0byBidWlsdC1pbiBoYXNodHJlZSBpZiBmc19tZ3JfZmxhZ3MuYXZiIGlzIHNldC4KKyAgICAgICAgICAgIGlmICghZnN0YWJfZW50cnktPmZzX21ncl9mbGFncy5hdmIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRmFsbGJhY2sgdG8gYnVpbHQtaW4gaGFzaHRyZWUgZm9yICIgPDwgZnN0YWJfZW50cnktPm1vdW50X3BvaW50OworICAgICAgICAgICAgaGFzaHRyZWVfcmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgYXZiX2hhbmRsZV8tPlNldFVwQXZiSGFzaHRyZWUoZnN0YWJfZW50cnksIGZhbHNlIC8qIHdhaXRfZm9yX3Zlcml0eV9kZXYgKi8pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXV0byBhdmJfc3RhbmRhbG9uZV9oYW5kbGUgPSBBdmJIYW5kbGU6OkxvYWRBbmRWZXJpZnlWYm1ldGEoCi0gICAgICAgICAgICAgICAgICAgICpmc3RhYl9lbnRyeSwgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzX1tmc3RhYl9lbnRyeS0+YXZiX2tleXNdKTsKLSAgICAgICAgICAgIGlmICghYXZiX3N0YW5kYWxvbmVfaGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGxvYWQgb2ZmbGluZSB2Ym1ldGEgZm9yICIgPDwgZnN0YWJfZW50cnktPm1vdW50X3BvaW50OwotICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrcyB0byBidWlsdC1pbiBoYXNodHJlZSBpZiBmc19tZ3JfZmxhZ3MuYXZiIGlzIHNldC4KLSAgICAgICAgICAgICAgICBpZiAoIWZzdGFiX2VudHJ5LT5mc19tZ3JfZmxhZ3MuYXZiKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGYWxsYmFjayB0byBidWlsdC1pbiBoYXNodHJlZSBmb3IgIiA8PCBmc3RhYl9lbnRyeS0+bW91bnRfcG9pbnQ7Ci0gICAgICAgICAgICAgICAgaGFzaHRyZWVfcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF2Yl9oYW5kbGVfLT5TZXRVcEF2Ykhhc2h0cmVlKGZzdGFiX2VudHJ5LCBmYWxzZSAvKiB3YWl0X2Zvcl92ZXJpdHlfZGV2ICovKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0cyB1cCBoYXNodHJlZSB2aWEgdGhlIHN0YW5kYWxvbmUgaGFuZGxlLgotICAgICAgICAgICAgICAgIGlmIChJc1N0YW5kYWxvbmVJbWFnZVJvbGxiYWNrKCphdmJfaGFuZGxlXywgKmF2Yl9zdGFuZGFsb25lX2hhbmRsZSwgKmZzdGFiX2VudHJ5KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhc2h0cmVlX3Jlc3VsdCA9IGF2Yl9zdGFuZGFsb25lX2hhbmRsZS0+U2V0VXBBdmJIYXNodHJlZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzdGFiX2VudHJ5LCBmYWxzZSAvKiB3YWl0X2Zvcl92ZXJpdHlfZGV2ICovKTsKKyAgICAgICAgICAgIC8vIFNldHMgdXAgaGFzaHRyZWUgdmlhIHRoZSBzdGFuZGFsb25lIGhhbmRsZS4KKyAgICAgICAgICAgIGlmIChJc1N0YW5kYWxvbmVJbWFnZVJvbGxiYWNrKCphdmJfaGFuZGxlXywgKmF2Yl9zdGFuZGFsb25lX2hhbmRsZSwgKmZzdGFiX2VudHJ5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc2h0cmVlX3Jlc3VsdCA9IGF2Yl9zdGFuZGFsb25lX2hhbmRsZS0+U2V0VXBBdmJIYXNodHJlZSgKKyAgICAgICAgICAgICAgICAgICAgZnN0YWJfZW50cnksIGZhbHNlIC8qIHdhaXRfZm9yX3Zlcml0eV9kZXYgKi8pOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChmc3RhYl9lbnRyeS0+ZnNfbWdyX2ZsYWdzLmF2YikgewogICAgICAgICBpZiAoIUluaXRBdmJIYW5kbGUoKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICBoYXNodHJlZV9yZXN1bHQgPQogICAgICAgICAgICAgICAgIGF2Yl9oYW5kbGVfLT5TZXRVcEF2Ykhhc2h0cmVlKGZzdGFiX2VudHJ5LCBmYWxzZSAvKiB3YWl0X2Zvcl92ZXJpdHlfZGV2ICovKTsKKyAgICB9IGVsc2UgaWYgKCFmc3RhYl9lbnRyeS0+YXZiX2hhc2h0cmVlX2RpZ2VzdC5lbXB0eSgpKSB7CisgICAgICAgIC8vIFdoZW4gZnN0YWJfZW50cnkgaGFzIG5laXRoZXIgYXZiX2tleXMgbm9yIGF2YiBmbGFnLCB0cnkgdXNpbmcKKyAgICAgICAgLy8gYXZiX2hhc2h0cmVlX2RpZ2VzdC4KKyAgICAgICAgaWYgKCFJbml0QXZiSGFuZGxlKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQ2hlY2tzIGlmIGhhc2h0cmVlIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIHRoZSB0b3AtbGV2ZWwgL3ZibWV0YS4KKyAgICAgICAgaWYgKElzSGFzaHRyZWVEaXNhYmxlZCgqYXZiX2hhbmRsZV8sIGZzdGFiX2VudHJ5LT5tb3VudF9wb2ludCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gYXZiX3N0YW5kYWxvbmVfaGFuZGxlID0gQXZiSGFuZGxlOjpMb2FkQW5kVmVyaWZ5VmJtZXRhKCpmc3RhYl9lbnRyeSk7CisgICAgICAgIGlmICghYXZiX3N0YW5kYWxvbmVfaGFuZGxlKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbG9hZCB2Ym1ldGEgYmFzZWQgb24gaGFzaHRyZWUgZGVzY3JpcHRvciByb290IGRpZ2VzdCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBmc3RhYl9lbnRyeS0+bW91bnRfcG9pbnQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGFzaHRyZWVfcmVzdWx0ID0gYXZiX3N0YW5kYWxvbmVfaGFuZGxlLT5TZXRVcEF2Ykhhc2h0cmVlKGZzdGFiX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogd2FpdF9mb3JfdmVyaXR5X2RldiAqLyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBObyBuZWVkIEFWQiwgcmV0dXJucyB0cnVlIHRvIG1vdW50IHRoZSBwYXJ0aXRpb24gZGlyZWN0bHkuCiAgICAgfQpAQCAtNzkzLDQ2ICs4MjAsMTMgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLy8gUHVibGljIGZ1bmN0aW9ucwotLy8gLS0tLS0tLS0tLS0tLS0tLQotLy8gQ3JlYXRlcyBkZXZpY2VzIGFuZCBsb2dpY2FsIHBhcnRpdGlvbnMgZnJvbSBzdG9yYWdlIGRldmljZXMKLWJvb2wgRG9DcmVhdGVEZXZpY2VzKCkgewotICAgIGF1dG8gZnNtID0gRmlyc3RTdGFnZU1vdW50OjpDcmVhdGUoKTsKLSAgICBpZiAoIWZzbS5vaygpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgRmlyc3RTdGFnZU1vdW50OiAiIDw8IGZzbS5lcnJvcigpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiAoKmZzbSktPkRvQ3JlYXRlRGV2aWNlcygpOwotfQotCi0vLyBNb3VudHMgcGFydGl0aW9ucyBzcGVjaWZpZWQgYnkgZnN0YWIgaW4gZGV2aWNlIHRyZWUuCi1ib29sIERvRmlyc3RTdGFnZU1vdW50KGJvb2wgY3JlYXRlX2RldmljZXMpIHsKLSAgICAvLyBTa2lwcyBmaXJzdCBzdGFnZSBtb3VudCBpZiB3ZSdyZSBpbiByZWNvdmVyeSBtb2RlLgotICAgIGlmIChJc1JlY292ZXJ5TW9kZSgpKSB7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiRmlyc3Qgc3RhZ2UgbW91bnQgc2tpcHBlZCAocmVjb3ZlcnkgbW9kZSkiOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBhdXRvIGZzbSA9IEZpcnN0U3RhZ2VNb3VudDo6Q3JlYXRlKCk7Ci0gICAgaWYgKCFmc20ub2soKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEZpcnN0U3RhZ2VNb3VudCAiIDw8IGZzbS5lcnJvcigpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGNyZWF0ZV9kZXZpY2VzKSB7Ci0gICAgICAgIGlmICghKCpmc20pLT5Eb0NyZWF0ZURldmljZXMoKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiAoKmZzbSktPkRvRmlyc3RTdGFnZU1vdW50KCk7Ci19Ci0KIHZvaWQgU2V0SW5pdEF2YlZlcnNpb25JblJlY292ZXJ5KCkgewogICAgIGlmICghSXNSZWNvdmVyeU1vZGUoKSkgewogICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwZWQgc2V0dGluZyBJTklUX0FWQl9WRVJTSU9OIChub3QgaW4gcmVjb3ZlcnkgbW9kZSkiOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYXV0byBmc3RhYiA9IFJlYWRGaXJzdFN0YWdlRnN0YWIoKTsKKyAgICBhdXRvIGZzdGFiID0gUmVhZEZpcnN0U3RhZ2VGc3RhYkFuZHJvaWQoKTsKICAgICBpZiAoIWZzdGFiLm9rKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCBmc3RhYi5lcnJvcigpOwogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9pbml0L2ZpcnN0X3N0YWdlX21vdW50LmggYi9pbml0L2ZpcnN0X3N0YWdlX21vdW50LmgKaW5kZXggMmY0ZTY2My4uNTQ1MDFkOCAxMDA2NDQKLS0tIGEvaW5pdC9maXJzdF9zdGFnZV9tb3VudC5oCisrKyBiL2luaXQvZmlyc3Rfc3RhZ2VfbW91bnQuaApAQCAtMTYsMTEgKzE2LDI4IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAicmVzdWx0LmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKIAotYm9vbCBEb0NyZWF0ZURldmljZXMoKTsKLWJvb2wgRG9GaXJzdFN0YWdlTW91bnQoYm9vbCBjcmVhdGVfZGV2aWNlcyk7CitjbGFzcyBGaXJzdFN0YWdlTW91bnQgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+Rmlyc3RTdGFnZU1vdW50KCkgPSBkZWZhdWx0OworCisgICAgLy8gVGhlIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIEZpcnN0U3RhZ2VNb3VudCBpbnN0YW5jZS4KKyAgICBzdGF0aWMgUmVzdWx0PHN0ZDo6dW5pcXVlX3B0cjxGaXJzdFN0YWdlTW91bnQ+PiBDcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUpOworICAgIC8vIENyZWF0ZXMgZGV2aWNlcyBhbmQgbG9naWNhbCBwYXJ0aXRpb25zIGZyb20gc3RvcmFnZSBkZXZpY2VzCisgICAgdmlydHVhbCBib29sIERvQ3JlYXRlRGV2aWNlcygpID0gMDsKKyAgICAvLyBNb3VudHMgZnN0YWIgZW50cmllcyByZWFkIGZyb20gZGV2aWNlIHRyZWUuCisgICAgdmlydHVhbCBib29sIERvRmlyc3RTdGFnZU1vdW50KCkgPSAwOworCisgIHByb3RlY3RlZDoKKyAgICBGaXJzdFN0YWdlTW91bnQoKSA9IGRlZmF1bHQ7Cit9OworCiB2b2lkIFNldEluaXRBdmJWZXJzaW9uSW5SZWNvdmVyeSgpOwogCiB9ICAvLyBuYW1lc3BhY2UgaW5pdApkaWZmIC0tZ2l0IGEvaW5pdC9mc2NyeXB0X2luaXRfZXh0ZW5zaW9ucy5jcHAgYi9pbml0L2ZzY3J5cHRfaW5pdF9leHRlbnNpb25zLmNwcAppbmRleCBmYmQ4MTg5Li42YTU2MWU1IDEwMDY0NAotLS0gYS9pbml0L2ZzY3J5cHRfaW5pdF9leHRlbnNpb25zLmNwcAorKysgYi9pbml0L2ZzY3J5cHRfaW5pdF9leHRlbnNpb25zLmNwcApAQCAtMzQsMjggKzM0LDEyIEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgogI2luY2x1ZGUgPGZzY3J5cHQvZnNjcnlwdC5oPgotI2luY2x1ZGUgPGtleXV0aWxzLmg+CiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAKICNkZWZpbmUgVEFHICJmc2NyeXB0IgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZnNjcnlwdDsKIAotYm9vbCBGc2NyeXB0SW5zdGFsbEtleXJpbmcoKSB7Ci0gICAgaWYgKGtleWN0bF9zZWFyY2goS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAia2V5cmluZyIsICJmc2NyeXB0IiwgMCkgIT0gLTEpIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJLZXlyaW5nIGlzIGFscmVhZHkgY3JlYXRlZCI7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBrZXlfc2VyaWFsX3QgZGV2aWNlX2tleXJpbmcgPSBhZGRfa2V5KCJrZXlyaW5nIiwgImZzY3J5cHQiLCAwLCAwLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwotCi0gICAgaWYgKGRldmljZV9rZXlyaW5nID09IC0xKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGtleXJpbmciOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCAiS2V5cmluZyBjcmVhdGVkIHdpdGggaWQgIiA8PCBkZXZpY2Vfa2V5cmluZyA8PCAiIGluIHByb2Nlc3MgIiA8PCBnZXRwaWQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQogLy8gVE9ETyhiLzEzOTM3ODYwMSk6IHVzZSBhIHNpbmdsZSBjZW50cmFsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMuCiBzdGF0aWMgdm9pZCBkZWxldGVfZGlyX2NvbnRlbnRzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXIpIHsKICAgICBjaGFyKiBjb25zdCBwYXRoc1syXSA9IHtjb25zdF9jYXN0PGNoYXIqPihkaXIuY19zdHIoKSksIG51bGxwdHJ9OwpkaWZmIC0tZ2l0IGEvaW5pdC9mc2NyeXB0X2luaXRfZXh0ZW5zaW9ucy5oIGIvaW5pdC9mc2NyeXB0X2luaXRfZXh0ZW5zaW9ucy5oCmluZGV4IGQzNTdiYjIuLjVlMDI2OWEgMTAwNjQ0Ci0tLSBhL2luaXQvZnNjcnlwdF9pbml0X2V4dGVuc2lvbnMuaAorKysgYi9pbml0L2ZzY3J5cHRfaW5pdF9leHRlbnNpb25zLmgKQEAgLTI1LDYgKzI1LDUgQEAKICAgICBrRGVsZXRlSWZOZWNlc3NhcnksCiB9OwogCi1ib29sIEZzY3J5cHRJbnN0YWxsS2V5cmluZygpOwogYm9vbCBGc2NyeXB0U2V0RGlyZWN0b3J5UG9saWN5KGNvbnN0IHN0ZDo6c3RyaW5nJiByZWZfYmFzZW5hbWUsIEZzY3J5cHRBY3Rpb24gYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXIpOwpkaWZmIC0tZ2l0IGEvaW5pdC9mdXp6ZXIvQW5kcm9pZC5icCBiL2luaXQvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggYzIxYTE5Ni4uOTkxNjI0NiAxMDA2NDQKLS0tIGEvaW5pdC9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9pbml0L2Z1enplci9BbmRyb2lkLmJwCkBAIC0xOCw3ICsxOCw3IEBACiB9CiAKIGNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGliaW5pdF9kZWZhdWx0cyIsCisgICAgbmFtZTogImxpYmluaXRfZnV6emVyX2RlZmF1bHRzIiwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliYysrZnMiLAogICAgICAgICAibGlibG1rZF91dGlscyIsCkBAIC0zMiw3ICszMiw2IEBACiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmZzX21nciIsCiAgICAgICAgICJsaWJoaWRsLWdlbi11dGlscyIsCi0gICAgICAgICJsaWJrZXl1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKICAgICAgICAgImxpYnNlbGludXgiLApAQCAtNTMsNyArNTIsNyBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliaGlkbG1ldGFkYXRhIixdLAogICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJsaWJpbml0X2RlZmF1bHRzIiwKKyAgICAgICAgImxpYmluaXRfZnV6emVyX2RlZmF1bHRzIiwKICAgICBdLAogfQogCkBAIC02Miw3ICs2MSw3IEBACiAgICAgc3JjczogWwogICAgICAgICAiaW5pdF9wcm9wZXJ0eV9mdXp6ZXIuY3BwIiwKICAgICBdLAotICAgIGRlZmF1bHRzOiBbImxpYmluaXRfZGVmYXVsdHMiXSwKKyAgICBkZWZhdWx0czogWyJsaWJpbml0X2Z1enplcl9kZWZhdWx0cyJdLAogfQogCiBjY19mdXp6IHsKQEAgLTcxLDYgKzcwLDYgQEAKICAgICAgICAgImluaXRfdWV2ZW50SGFuZGxlcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJsaWJpbml0X2RlZmF1bHRzIiwKKyAgICAgICAgImxpYmluaXRfZnV6emVyX2RlZmF1bHRzIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuY3BwIGIvaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuY3BwCmluZGV4IGYwNzA3NzYuLjY2MjE4NWMgMTAwNjQ0Ci0tLSBhL2luaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmNwcAorKysgYi9pbml0L2hvc3RfaW5pdF92ZXJpZmllci5jcHAKQEAgLTEwOCw5ICsxMDgsOSBAQAogICAgIHN0YXRpYyBwYXNzd2Qgc3RhdGljX3Bhc3N3ZCA9IHsKICAgICAgICAgLnB3X25hbWUgPSBzdGF0aWNfbmFtZSwKICAgICAgICAgLnB3X2RpciA9IHN0YXRpY19kaXIsCi0gICAgICAgIC5wd19zaGVsbCA9IHN0YXRpY19zaGVsbCwKICAgICAgICAgLnB3X3VpZCA9IDAsCiAgICAgICAgIC5wd19naWQgPSAwLAorICAgICAgICAucHdfc2hlbGwgPSBzdGF0aWNfc2hlbGwsCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgYW5kcm9pZF9pZF9jb3VudDsgKytuKSB7CmRpZmYgLS1naXQgYS9pbml0L2luaXQuY3BwIGIvaW5pdC9pbml0LmNwcAppbmRleCBiZTFlYmVlLi4xOWU5MDlmIDEwMDY0NAotLS0gYS9pbml0L2luaXQuY3BwCisrKyBiL2luaXQvaW5pdC5jcHAKQEAgLTU0LDcgKzU0LDYgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8ZnNfYXZiL2ZzX2F2Yi5oPgogI2luY2x1ZGUgPGZzX21ncl92ZW5kb3Jfb3ZlcmxheS5oPgotI2luY2x1ZGUgPGtleXV0aWxzLmg+CiAjaW5jbHVkZSA8bGliYXZiL2xpYmF2Yi5oPgogI2luY2x1ZGUgPGxpYmdzaS9saWJnc2kuaD4KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9zbmFwc2hvdC5oPgpAQCAtMTA4LDYgKzEwNyw3IEBACiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpUaW1lcjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlRyaW07Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiB1c2luZyBhbmRyb2lkOjpmc19tZ3I6OkF2YkhhbmRsZTsKIHVzaW5nIGFuZHJvaWQ6OnNuYXBzaG90OjpTbmFwc2hvdE1hbmFnZXI7CiAKQEAgLTExNiw3ICsxMTYsNyBAQAogCiBzdGF0aWMgaW50IHByb3BlcnR5X3RyaWdnZXJzX2VuYWJsZWQgPSAwOwogCi1zdGF0aWMgaW50IHNpZ25hbF9mZCA9IC0xOworc3RhdGljIGludCBzaWd0ZXJtX2ZkID0gLTE7CiBzdGF0aWMgaW50IHByb3BlcnR5X2ZkID0gLTE7CiAKIHN0cnVjdCBQZW5kaW5nQ29udHJvbE1lc3NhZ2UgewpAQCAtNDg3LDcgKzQ4Nyw3IEBACiB9CiAKIHN0YXRpYyBSZXN1bHQ8dm9pZD4gRG9Mb2FkQXBleChjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9uYW1lKSB7Ci0gICAgaWYgKGF1dG8gcmVzdWx0ID0gUGFyc2VBcGV4Q29uZmlncyhhcGV4X25hbWUpOyAhcmVzdWx0Lm9rKCkpIHsKKyAgICBpZiAoYXV0byByZXN1bHQgPSBQYXJzZVJjU2NyaXB0c0Zyb21BcGV4KGFwZXhfbmFtZSk7ICFyZXN1bHQub2soKSkgewogICAgICAgICByZXR1cm4gcmVzdWx0LmVycm9yKCk7CiAgICAgfQogCkBAIC03MTMsOCArNzEzLDkgQEAKICAgICBIYW5kbGVQb3dlcmN0bE1lc3NhZ2UoInNodXRkb3duLGNvbnRhaW5lciIpOwogfQogCi1zdGF0aWMgdm9pZCBIYW5kbGVTaWduYWxGZCgpIHsKK3N0YXRpYyB2b2lkIEhhbmRsZVNpZ25hbEZkKGludCBzaWduYWwpIHsKICAgICBzaWduYWxmZF9zaWdpbmZvIHNpZ2luZm87CisgICAgY29uc3QgaW50IHNpZ25hbF9mZCA9IHNpZ25hbCA9PSBTSUdDSExEID8gU2VydmljZTo6R2V0U2lnY2hsZEZkKCkgOiBzaWd0ZXJtX2ZkOwogICAgIHNzaXplX3QgYnl0ZXNfcmVhZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKHNpZ25hbF9mZCwgJnNpZ2luZm8sIHNpemVvZihzaWdpbmZvKSkpOwogICAgIGlmIChieXRlc19yZWFkICE9IHNpemVvZihzaWdpbmZvKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgc2lnaW5mbyBmcm9tIHNpZ25hbF9mZCI7CkBAIC03NDgsNDAgKzc0OSw1MSBAQAogICAgIH0KIH0KIAorc3RhdGljIFJlc3VsdDx2b2lkPiBSZWdpc3RlclNpZ25hbEZkKEVwb2xsKiBlcG9sbCwgaW50IHNpZ25hbCwgaW50IGZkKSB7CisgICAgcmV0dXJuIGVwb2xsLT5SZWdpc3RlckhhbmRsZXIoCisgICAgICAgICAgICBmZCwgW3NpZ25hbF0oKSB7IEhhbmRsZVNpZ25hbEZkKHNpZ25hbCk7IH0sIEVQT0xMSU4gfCBFUE9MTFBSSSk7Cit9CisKK3N0YXRpYyBSZXN1bHQ8aW50PiBDcmVhdGVBbmRSZWdpc3RlclNpZ25hbEZkKEVwb2xsKiBlcG9sbCwgaW50IHNpZ25hbCkgeworICAgIHNpZ3NldF90IG1hc2s7CisgICAgc2lnZW1wdHlzZXQoJm1hc2spOworICAgIHNpZ2FkZHNldCgmbWFzaywgc2lnbmFsKTsKKyAgICBpZiAoc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgbnVsbHB0cikgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiZmFpbGVkIHRvIGJsb2NrIHNpZ25hbCAiIDw8IHNpZ25hbDsKKyAgICB9CisKKyAgICB1bmlxdWVfZmQgc2lnbmFsX2ZkKHNpZ25hbGZkKC0xLCAmbWFzaywgU0ZEX0NMT0VYRUMpKTsKKyAgICBpZiAoc2lnbmFsX2ZkLmdldCgpIDwgMCkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIHNpZ25hbGZkIGZvciBzaWduYWwgIiA8PCBzaWduYWw7CisgICAgfQorICAgIE9SX1JFVFVSTihSZWdpc3RlclNpZ25hbEZkKGVwb2xsLCBzaWduYWwsIHNpZ25hbF9mZC5nZXQoKSkpOworCisgICAgcmV0dXJuIHNpZ25hbF9mZC5yZWxlYXNlKCk7Cit9CisKIHN0YXRpYyB2b2lkIEluc3RhbGxTaWduYWxGZEhhbmRsZXIoRXBvbGwqIGVwb2xsKSB7CiAgICAgLy8gQXBwbHlpbmcgU0FfTk9DTERTVE9QIHRvIGEgZGVmYXVsdGVkIFNJR0NITEQgaGFuZGxlciBwcmV2ZW50cyB0aGUgc2lnbmFsZmQgZnJvbSByZWNlaXZpbmcKICAgICAvLyBTSUdDSExEIHdoZW4gYSBjaGlsZCBwcm9jZXNzIHN0b3BzIG9yIGNvbnRpbnVlcyAoYi83Nzg2NzY4MCNjb21tZW50OSkuCi0gICAgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiBhY3QgeyAuc2FfaGFuZGxlciA9IFNJR19ERkwsIC5zYV9mbGFncyA9IFNBX05PQ0xEU1RPUCB9OworICAgIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gYWN0IHsgLnNhX2ZsYWdzID0gU0FfTk9DTERTVE9QLCAuc2FfaGFuZGxlciA9IFNJR19ERkwgfTsKICAgICBzaWdhY3Rpb24oU0lHQ0hMRCwgJmFjdCwgbnVsbHB0cik7CiAKLSAgICBzaWdzZXRfdCBtYXNrOwotICAgIHNpZ2VtcHR5c2V0KCZtYXNrKTsKLSAgICBzaWdhZGRzZXQoJm1hc2ssIFNJR0NITEQpOwotCi0gICAgaWYgKCFJc1JlYm9vdENhcGFibGUoKSkgewotICAgICAgICAvLyBJZiBpbml0IGRvZXMgbm90IGhhdmUgdGhlIENBUF9TWVNfQk9PVCBjYXBhYmlsaXR5LCBpdCBpcyBydW5uaW5nIGluIGEgY29udGFpbmVyLgotICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHJlY2VpdmluZyBTSUdURVJNIHdpbGwgY2F1c2UgdGhlIHN5c3RlbSB0byBzaHV0IGRvd24uCi0gICAgICAgIHNpZ2FkZHNldCgmbWFzaywgU0lHVEVSTSk7Ci0gICAgfQotCi0gICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJm1hc2ssIG51bGxwdHIpID09IC0xKSB7Ci0gICAgICAgIFBMT0coRkFUQUwpIDw8ICJmYWlsZWQgdG8gYmxvY2sgc2lnbmFscyI7Ci0gICAgfQotCiAgICAgLy8gUmVnaXN0ZXIgYSBoYW5kbGVyIHRvIHVuYmxvY2sgc2lnbmFscyBpbiB0aGUgY2hpbGQgcHJvY2Vzc2VzLgogICAgIGNvbnN0IGludCByZXN1bHQgPSBwdGhyZWFkX2F0Zm9yayhudWxscHRyLCBudWxscHRyLCAmVW5ibG9ja1NpZ25hbHMpOwogICAgIGlmIChyZXN1bHQgIT0gMCkgewogICAgICAgICBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgYSBmb3JrIGhhbmRsZXI6ICIgPDwgc3RyZXJyb3IocmVzdWx0KTsKICAgICB9CiAKLSAgICBzaWduYWxfZmQgPSBzaWduYWxmZCgtMSwgJm1hc2ssIFNGRF9DTE9FWEVDKTsKLSAgICBpZiAoc2lnbmFsX2ZkID09IC0xKSB7Ci0gICAgICAgIFBMT0coRkFUQUwpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIHNpZ25hbGZkIjsKKyAgICBSZXN1bHQ8dm9pZD4gY3NfcmVzdWx0ID0gUmVnaXN0ZXJTaWduYWxGZChlcG9sbCwgU0lHQ0hMRCwgU2VydmljZTo6R2V0U2lnY2hsZEZkKCkpOworICAgIGlmICghY3NfcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgUExPRyhGQVRBTCkgPDwgY3NfcmVzdWx0LmVycm9yKCk7CiAgICAgfQogCi0gICAgY29uc3RleHByIGludCBmbGFncyA9IEVQT0xMSU4gfCBFUE9MTFBSSTsKLSAgICBpZiAoYXV0byByZXN1bHQgPSBlcG9sbC0+UmVnaXN0ZXJIYW5kbGVyKHNpZ25hbF9mZCwgSGFuZGxlU2lnbmFsRmQsIGZsYWdzKTsgIXJlc3VsdC5vaygpKSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgaWYgKCFJc1JlYm9vdENhcGFibGUoKSkgeworICAgICAgICBSZXN1bHQ8aW50PiBjc19yZXN1bHQgPSBDcmVhdGVBbmRSZWdpc3RlclNpZ25hbEZkKGVwb2xsLCBTSUdURVJNKTsKKyAgICAgICAgaWYgKCFjc19yZXN1bHQub2soKSkgeworICAgICAgICAgICAgUExPRyhGQVRBTCkgPDwgY3NfcmVzdWx0LmVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgc2lndGVybV9mZCA9IGNzX3Jlc3VsdC52YWx1ZSgpOwogICAgIH0KIH0KIApAQCAtODMyLDYgKzg0NCwxMiBAQAogICAgIENIRUNLQ0FMTChtb3VudCgidG1wZnMiLCAiL2FwZXgiLCAidG1wZnMiLCBNU19OT0VYRUMgfCBNU19OT1NVSUQgfCBNU19OT0RFViwKICAgICAgICAgICAgICAgICAgICAgIm1vZGU9MDc1NSx1aWQ9MCxnaWQ9MCIpKTsKIAorICAgIGlmIChOZWVkc1R3b01vdW50TmFtZXNwYWNlcygpKSB7CisgICAgICAgIC8vIC9ib290c3RyYXAtYXBleCBpcyB1c2VkIHRvIG1vdW50ICJib290c3RyYXAiIEFQRVhlcy4KKyAgICAgICAgQ0hFQ0tDQUxMKG1vdW50KCJ0bXBmcyIsICIvYm9vdHN0cmFwLWFwZXgiLCAidG1wZnMiLCBNU19OT0VYRUMgfCBNU19OT1NVSUQgfCBNU19OT0RFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb2RlPTA3NTUsdWlkPTAsZ2lkPTAiKSk7CisgICAgfQorCiAgICAgLy8gL2xpbmtlcmNvbmZpZyBpcyB1c2VkIHRvIGtlZXAgZ2VuZXJhdGVkIGxpbmtlciBjb25maWd1cmF0aW9uCiAgICAgQ0hFQ0tDQUxMKG1vdW50KCJ0bXBmcyIsICIvbGlua2VyY29uZmlnIiwgInRtcGZzIiwgTVNfTk9FWEVDIHwgTVNfTk9TVUlEIHwgTVNfTk9ERVYsCiAgICAgICAgICAgICAgICAgICAgICJtb2RlPTA3NTUsdWlkPTAsZ2lkPTAiKSk7CkBAIC05NTIsMTEgKzk3MCw2IEBACiAgICAgICAgICAgICAgICAgICAgPDwgIiB0byAvcHJvYy8xL29vbV9zY29yZV9hZGo6ICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgfQogCi0gICAgLy8gU2V0IHVwIGEgc2Vzc2lvbiBrZXlyaW5nIHRoYXQgYWxsIHByb2Nlc3NlcyB3aWxsIGhhdmUgYWNjZXNzIHRvLiBJdAotICAgIC8vIHdpbGwgaG9sZCB0aGluZ3MgbGlrZSBGQkUgZW5jcnlwdGlvbiBrZXlzLiBObyBwcm9jZXNzIHNob3VsZCBvdmVycmlkZQotICAgIC8vIGl0cyBzZXNzaW9uIGtleXJpbmcuCi0gICAga2V5Y3RsX2dldF9rZXlyaW5nX0lEKEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7Ci0KICAgICAvLyBJbmRpY2F0ZSB0aGF0IGJvb3RpbmcgaXMgaW4gcHJvZ3Jlc3MgdG8gYmFja2dyb3VuZCBmdyBsb2FkZXJzLCBldGMuCiAgICAgY2xvc2Uob3BlbigiL2Rldi8uYm9vdGluZyIsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQ0xPRVhFQywgMDAwMCkpOwogCkBAIC0xMDQzLDEyICsxMDU2LDE4IEBACiAgICAgU2V0UHJvcGVydHkoZ3NpOjprR3NpQm9vdGVkUHJvcCwgaXNfcnVubmluZyk7CiAgICAgYXV0byBpc19pbnN0YWxsZWQgPSBhbmRyb2lkOjpnc2k6OklzR3NpSW5zdGFsbGVkKCkgPyAiMSIgOiAiMCI7CiAgICAgU2V0UHJvcGVydHkoZ3NpOjprR3NpSW5zdGFsbGVkUHJvcCwgaXNfaW5zdGFsbGVkKTsKKyAgICBpZiAoYW5kcm9pZDo6Z3NpOjpJc0dzaVJ1bm5pbmcoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBkc3Vfc2xvdDsKKyAgICAgICAgaWYgKGFuZHJvaWQ6OmdzaTo6R2V0QWN0aXZlRHN1KCZkc3Vfc2xvdCkpIHsKKyAgICAgICAgICAgIFNldFByb3BlcnR5KGdzaTo6a0RzdVNsb3RQcm9wLCBkc3Vfc2xvdCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBhbS5RdWV1ZUJ1aWx0aW5BY3Rpb24oU2V0dXBDZ3JvdXBzQWN0aW9uLCAiU2V0dXBDZ3JvdXBzIik7CiAgICAgYW0uUXVldWVCdWlsdGluQWN0aW9uKFNldEtwdHJSZXN0cmljdEFjdGlvbiwgIlNldEtwdHJSZXN0cmljdCIpOwogICAgIGFtLlF1ZXVlQnVpbHRpbkFjdGlvbihUZXN0UGVyZkV2ZW50U2VsaW51eEFjdGlvbiwgIlRlc3RQZXJmRXZlbnRTZWxpbnV4Iik7Ci0gICAgYW0uUXVldWVCdWlsdGluQWN0aW9uKENvbm5lY3RFYXJseVN0YWdlU25hcHVzZXJkQWN0aW9uLCAiQ29ubmVjdEVhcmx5U3RhZ2VTbmFwdXNlcmQiKTsKICAgICBhbS5RdWV1ZUV2ZW50VHJpZ2dlcigiZWFybHktaW5pdCIpOworICAgIGFtLlF1ZXVlQnVpbHRpbkFjdGlvbihDb25uZWN0RWFybHlTdGFnZVNuYXB1c2VyZEFjdGlvbiwgIkNvbm5lY3RFYXJseVN0YWdlU25hcHVzZXJkIik7CiAKICAgICAvLyBRdWV1ZSBhbiBhY3Rpb24gdGhhdCB3YWl0cyBmb3IgY29sZGJvb3QgZG9uZSBzbyB3ZSBrbm93IHVldmVudGQgaGFzIHNldCB1cCBhbGwgb2YgL2Rldi4uLgogICAgIGFtLlF1ZXVlQnVpbHRpbkFjdGlvbih3YWl0X2Zvcl9jb2xkYm9vdF9kb25lX2FjdGlvbiwgIndhaXRfZm9yX2NvbGRib290X2RvbmUiKTsKZGlmZiAtLWdpdCBhL2luaXQvaW5pdF90ZXN0LmNwcCBiL2luaXQvaW5pdF90ZXN0LmNwcAppbmRleCAwZmMzZmZjLi43ZTg1MTNiIDEwMDY0NAotLS0gYS9pbml0L2luaXRfdGVzdC5jcHAKKysrIGIvaW5pdC9pbml0X3Rlc3QuY3BwCkBAIC0xODAsOSArMTgwLDExIEBACiAgICAgc3RkOjpzdHJpbmcgaW5pdF9zY3JpcHQgPSBSImluaXQoCiBzZXJ2aWNlIEEgc29tZXRoaW5nCiAgICAgY2xhc3MgZmlyc3QKKyAgICB1c2VyIG5vYm9keQogCiBzZXJ2aWNlIEEgc29tZXRoaW5nCiAgICAgY2xhc3Mgc2Vjb25kCisgICAgdXNlciBub2JvZHkKICAgICBvdmVycmlkZQogCiApaW5pdCI7CkBAIC02MTAsNiArNjEyLDMxIEBACiAgICAgRVhQRUNUX0VRKDIsIG51bV9leGVjdXRlZCk7CiB9CiAKK1RFU1QoaW5pdCwgUmVqZWN0c05vVXNlclN0YXJ0aW5nSW5WKSB7CisgICAgc3RkOjpzdHJpbmcgaW5pdF9zY3JpcHQgPQorICAgICAgICAgICAgUiJpbml0KAorc2VydmljZSBBIHNvbWV0aGluZworICAgIGNsYXNzIGZpcnN0CispaW5pdCI7CisKKyAgICBUZW1wb3JhcnlGaWxlIHRmOworICAgIEFTU0VSVF9UUlVFKHRmLmZkICE9IC0xKTsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQoaW5pdF9zY3JpcHQsIHRmLmZkKSk7CisKKyAgICBTZXJ2aWNlTGlzdCBzZXJ2aWNlX2xpc3Q7CisgICAgUGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigic2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxTZXJ2aWNlUGFyc2VyPigmc2VydmljZV9saXN0LCBudWxscHRyLCBzdGQ6Om51bGxvcHQpKTsKKworICAgIEFTU0VSVF9UUlVFKHBhcnNlci5QYXJzZUNvbmZpZyh0Zi5wYXRoKSk7CisKKyAgICBpZiAoR2V0SW50UHJvcGVydHkoInJvLnZlbmRvci5hcGlfbGV2ZWwiLCAwKSA+IF9fQU5EUk9JRF9BUElfVV9fKSB7CisgICAgICAgIEFTU0VSVF9FUSgxdSwgcGFyc2VyLnBhcnNlX2Vycm9yX2NvdW50KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9FUSgwdSwgcGFyc2VyLnBhcnNlX2Vycm9yX2NvdW50KCkpOworICAgIH0KK30KKwogVEVTVChpbml0LCBSZWplY3RzQ3JpdGljYWxBbmRPbmVzaG90U2VydmljZSkgewogICAgIGlmIChHZXRJbnRQcm9wZXJ0eSgicm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWwiLCAxMDAwMCkgPCAzMCkgewogICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIlRlc3Qgb25seSB2YWxpZCBmb3IgZGV2aWNlcyBsYXVuY2hpbmcgd2l0aCBSIG9yIGxhdGVyIjsKQEAgLTYxOSw2ICs2NDYsNyBAQAogICAgICAgICAgICAgUiJpbml0KAogc2VydmljZSBBIHNvbWV0aGluZwogICBjbGFzcyBmaXJzdAorICB1c2VyIHJvb3QKICAgY3JpdGljYWwKICAgb25lc2hvdAogKWluaXQiOwpkaWZmIC0tZ2l0IGEvaW5pdC9tb3VudF9uYW1lc3BhY2UuY3BwIGIvaW5pdC9tb3VudF9uYW1lc3BhY2UuY3BwCmluZGV4IGZlYWQzNzEuLjc5MThmMjMgMTAwNjQ0Ci0tLSBhL2luaXQvbW91bnRfbmFtZXNwYWNlLmNwcAorKysgYi9pbml0L21vdW50X25hbWVzcGFjZS5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSA8QXBleFByb3BlcnRpZXMuc3lzcHJvcC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgpAQCAtMzAsMTYgKzI5LDYgQEAKIAogI2luY2x1ZGUgInV0aWwuaCIKIAotI2lmbmRlZiBSRUNPVkVSWQotI2RlZmluZSBBQ1RJVkFURV9GTEFUVEVORURfQVBFWCAxCi0jZW5kaWYKLQotI2lmZGVmIEFDVElWQVRFX0ZMQVRURU5FRF9BUEVYCi0jaW5jbHVkZSA8YXBleF9tYW5pZmVzdC5wYi5oPgotI2luY2x1ZGUgPGNvbV9hbmRyb2lkX2FwZXguaD4KLSNpbmNsdWRlIDxzZWxpbnV4L2FuZHJvaWQuaD4KLSNlbmRpZiAgLy8gQUNUSVZBVEVfRkxBVFRFTkVEX0FQRVgKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogbmFtZXNwYWNlIHsKQEAgLTc3LDIxICs2Niw2IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGJvb2wgSXNBcGV4VXBkYXRhYmxlKCkgewotICAgIHN0YXRpYyBib29sIHVwZGF0YWJsZSA9IGFuZHJvaWQ6OnN5c3Byb3A6OkFwZXhQcm9wZXJ0aWVzOjp1cGRhdGFibGUoKS52YWx1ZV9vcihmYWxzZSk7Ci0gICAgcmV0dXJuIHVwZGF0YWJsZTsKLX0KLQotLy8gSW4gY2FzZSB3ZSBoYXZlIHR3byBzZXRzIG9mIEFQRVhlcyAobm9uLXVwZGF0YWJsZSwgdXBkYXRhYmxlKSwgd2UgbmVlZCB0d28gc2VwYXJhdGUgbW91bnQKLS8vIG5hbWVzcGFjZXMuCi1zdGF0aWMgYm9vbCBOZWVkc1R3b01vdW50TmFtZXNwYWNlcygpIHsKLSAgICBpZiAoIUlzQXBleFVwZGF0YWJsZSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKElzUmVjb3ZlcnlNb2RlKCkpIHJldHVybiBmYWxzZTsKLSAgICAvLyBJbiBtaWNyb2Ryb2lkLCB0aGVyZSdzIG9ubHkgb25lIHNldCBvZiBBUEVYZXMgaW4gYnVpbHQtaW4gZGlyZWN0b3JpZXMgaW5jbHVkZSBibG9jayBkZXZpY2VzLgotICAgIGlmIChJc01pY3JvZHJvaWQoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCiBzdGF0aWMgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGJvb3RzdHJhcF9uc19mZDsKIHN0YXRpYyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZGVmYXVsdF9uc19mZDsKIApAQCAtMTAwLDYgKzc0LDE1IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCisvLyBJbiBjYXNlIHdlIGhhdmUgdHdvIHNldHMgb2YgQVBFWGVzIChub24tdXBkYXRhYmxlLCB1cGRhdGFibGUpLCB3ZSBuZWVkIHR3byBzZXBhcmF0ZSBtb3VudAorLy8gbmFtZXNwYWNlcy4KK2Jvb2wgTmVlZHNUd29Nb3VudE5hbWVzcGFjZXMoKSB7CisgICAgaWYgKElzUmVjb3ZlcnlNb2RlKCkpIHJldHVybiBmYWxzZTsKKyAgICAvLyBJbiBtaWNyb2Ryb2lkLCB0aGVyZSdzIG9ubHkgb25lIHNldCBvZiBBUEVYZXMgaW4gYnVpbHQtaW4gZGlyZWN0b3JpZXMgaW5jbHVkZSBibG9jayBkZXZpY2VzLgorICAgIGlmIChJc01pY3JvZHJvaWQoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIFNldHVwTW91bnROYW1lc3BhY2VzKCkgewogICAgIC8vIFNldCB0aGUgcHJvcGFnYXRpb24gdHlwZSBvZiAvIGFzIHNoYXJlZCBzbyB0aGF0IGFueSBtb3VudGluZyBldmVudCAoZS5nLgogICAgIC8vIC9kYXRhKSBpcyBieSBkZWZhdWx0IHZpc2libGUgdG8gYWxsIHByb2Nlc3Nlcy4gV2hlbiBwcml2YXRlIG1vdW50aW5nIGlzCkBAIC0xODAsNiArMTYzLDIzIEBACiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHN3aXRjaCBiYWNrIHRvIGJvb3RzdHJhcCBtb3VudCBuYW1lc3BhY2UiOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisKKyAgICAgICAgLy8gU29tZSBjb21wb25lbnRzIChlLmcuIHNlcnZpY2VtYW5hZ2VyKSBuZWVkIHRvIGFjY2VzcyBib290c3RyYXAKKyAgICAgICAgLy8gQVBFWGVzIGZyb20gdGhlIGRlZmF1bHQgbW91bnQgbmFtZXNwYWNlLiBUbyBhY2hpZXZlIHRoYXQsIHdlIGJpbmQtbW91bnQKKyAgICAgICAgLy8gL2FwZXggdG8gL2Jvb3RzdHJhcC1hcGV4IGluIHRoZSBib290c3RyYXAgbW91bnQgbmFtZXNwYWNlLiBTaW5jZSAvYm9vdHN0cmFwLWFwZXgKKyAgICAgICAgLy8gaXMgInNoYXJlZCIsIHRoZSBtb3VudHMgYXJlIHZpc2libGUgaW4gdGhlIGRlZmF1bHQgbW91bnQgbmFtZXNwYWNlIGFzIHdlbGwuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBlbmQgcmVzdWx0IHdpbGwgbG9vayBsaWtlOgorICAgICAgICAvLyAgIGluIHRoZSBib290c3RyYXAgbW91bnQgbmFtZXNwYWNlOgorICAgICAgICAvLyAgICAgL2FwZXggICg9PSAvYm9vdHN0cmFwLWFwZXgpCisgICAgICAgIC8vICAgICAgIHtib290c3RyYXAgQVBFWGVzIGZyb20gdGhlIHJlYWQtb25seSBwYXJ0aXRpb259CisgICAgICAgIC8vCisgICAgICAgIC8vICAgaW4gdGhlIGRlZmF1bHQgbW91bnQgbmFtZXNwYWNlOgorICAgICAgICAvLyAgICAgL2Jvb3RzdHJhcC1hcGV4CisgICAgICAgIC8vICAgICAgIHtib290c3RyYXAgQVBFWGVzIGZyb20gdGhlIHJlYWQtb25seSBwYXJ0aXRpb259CisgICAgICAgIC8vICAgICAvYXBleAorICAgICAgICAvLyAgICAgICB7QVBFWGVzLCBjYW4gYmUgZnJvbSAvZGF0YSBwYXJ0aXRpb259CisgICAgICAgIGlmICghKEJpbmRNb3VudCgiL2Jvb3RzdHJhcC1hcGV4IiwgIi9hcGV4IikpKSByZXR1cm4gZmFsc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gT3RoZXJ3aXNlLCBkZWZhdWx0ID09IGJvb3RzdHJhcAogICAgICAgICBkZWZhdWx0X25zX2ZkLnJlc2V0KE9wZW5Nb3VudE5hbWVzcGFjZSgpKTsKQEAgLTE5Myw3ICsxOTMsNyBAQAogLy8gU3dpdGNoIHRoZSBtb3VudCBuYW1lc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyBmcm9tIGJvb3RzdHJhcCB0byBkZWZhdWx0IE9SIGZyb20gZGVmYXVsdCB0bwogLy8gYm9vdHN0cmFwLiBJZiB0aGUgY3VycmVudCBtb3VudCBuYW1lc3BhY2UgaXMgbmVpdGhlciBib290c3RyYXAgbm9yIGRlZmF1bHQsIGtlZXAgaXQgdGhhdCB3YXkuCiBSZXN1bHQ8dm9pZD4gU3dpdGNoVG9Nb3VudE5hbWVzcGFjZUlmTmVlZGVkKE1vdW50TmFtZXNwYWNlIHRhcmdldF9tb3VudF9uYW1lc3BhY2UpIHsKLSAgICBpZiAoSXNSZWNvdmVyeU1vZGUoKSB8fCAhSXNBcGV4VXBkYXRhYmxlKCkpIHsKKyAgICBpZiAoSXNSZWNvdmVyeU1vZGUoKSkgewogICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIG5hbWVzcGFjZXMgaW4gcmVjb3ZlcnkgbW9kZSBvciBpZiBhcGV4IGlzIG5vdCB1cGRhdGFibGUKICAgICAgICAgcmV0dXJuIHt9OwogICAgIH0KZGlmZiAtLWdpdCBhL2luaXQvbW91bnRfbmFtZXNwYWNlLmggYi9pbml0L21vdW50X25hbWVzcGFjZS5oCmluZGV4IDVlM2RhYjIuLjQzYzU0NzYgMTAwNjQ0Ci0tLSBhL2luaXQvbW91bnRfbmFtZXNwYWNlLmgKKysrIGIvaW5pdC9tb3VudF9uYW1lc3BhY2UuaApAQCAtMjQsOSArMjQsMTIgQEAKIGVudW0gTW91bnROYW1lc3BhY2UgeyBOU19CT09UU1RSQVAsIE5TX0RFRkFVTFQgfTsKIAogYm9vbCBTZXR1cE1vdW50TmFtZXNwYWNlcygpOworCiBiYXNlOjpSZXN1bHQ8dm9pZD4gU3dpdGNoVG9Nb3VudE5hbWVzcGFjZUlmTmVlZGVkKE1vdW50TmFtZXNwYWNlIHRhcmdldF9tb3VudF9uYW1lc3BhY2UpOwogCiBiYXNlOjpSZXN1bHQ8TW91bnROYW1lc3BhY2U+IEdldEN1cnJlbnRNb3VudE5hbWVzcGFjZSgpOwogCitib29sIE5lZWRzVHdvTW91bnROYW1lc3BhY2VzKCk7CisKIH0gIC8vIG5hbWVzcGFjZSBpbml0CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXMuY3BwIGIvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXMuY3BwCmluZGV4IDhkYjcyNjcuLjZmOGE0ZGUgMTAwNjQ0Ci0tLSBhL2luaXQvcGVyc2lzdGVudF9wcm9wZXJ0aWVzLmNwcAorKysgYi9pbml0L3BlcnNpc3RlbnRfcHJvcGVydGllcy5jcHAKQEAgLTEyMiwyNCArMTIyLDYgQEAKICAgICB9CiB9CiAKLVBlcnNpc3RlbnRQcm9wZXJ0aWVzIExvYWRQZXJzaXN0ZW50UHJvcGVydGllc0Zyb21NZW1vcnkoKSB7Ci0gICAgUGVyc2lzdGVudFByb3BlcnRpZXMgcGVyc2lzdGVudF9wcm9wZXJ0aWVzOwotICAgIF9fc3lzdGVtX3Byb3BlcnR5X2ZvcmVhY2goCi0gICAgICAgIFtdKGNvbnN0IHByb3BfaW5mbyogcGksIHZvaWQqIGNvb2tpZSkgewotICAgICAgICAgICAgX19zeXN0ZW1fcHJvcGVydHlfcmVhZF9jYWxsYmFjaygKLSAgICAgICAgICAgICAgICBwaSwKLSAgICAgICAgICAgICAgICBbXSh2b2lkKiBjb29raWUsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCB1bnNpZ25lZCBzZXJpYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFN0YXJ0c1dpdGgobmFtZSwgInBlcnNpc3QuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcHJvcGVydGllcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGVyc2lzdGVudFByb3BlcnRpZXMqPihjb29raWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGVyc2lzdGVudFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgY29va2llKTsKLSAgICAgICAgfSwKLSAgICAgICAgJnBlcnNpc3RlbnRfcHJvcGVydGllcyk7Ci0gICAgcmV0dXJuIHBlcnNpc3RlbnRfcHJvcGVydGllczsKLX0KLQogUmVzdWx0PHN0ZDo6c3RyaW5nPiBSZWFkUGVyc2lzdGVudFByb3BlcnR5RmlsZSgpIHsKICAgICBjb25zdCBzdGQ6OnN0cmluZyB0ZW1wX2ZpbGVuYW1lID0gcGVyc2lzdGVudF9wcm9wZXJ0eV9maWxlbmFtZSArICIudG1wIjsKICAgICBpZiAoYWNjZXNzKHRlbXBfZmlsZW5hbWUuY19zdHIoKSwgRl9PSykgPT0gMCkgewpAQCAtMTYxLDkgKzE0Myw5IEBACiAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gcGFyc2UgcGVyc2lzdGVudCBwcm9wZXJ0eSBmaWxlOiBDb3VsZCBub3QgcGFyc2UgcHJvdG9idWYiOwogICAgIH0KICAgICBmb3IgKGF1dG8mIHByb3AgOiBwZXJzaXN0ZW50X3Byb3BlcnRpZXMucHJvcGVydGllcygpKSB7Ci0gICAgICAgIGlmICghU3RhcnRzV2l0aChwcm9wLm5hbWUoKSwgInBlcnNpc3QuIikpIHsKKyAgICAgICAgaWYgKCFTdGFydHNXaXRoKHByb3AubmFtZSgpLCAicGVyc2lzdC4iKSAmJiAhU3RhcnRzV2l0aChwcm9wLm5hbWUoKSwgIm5leHRfYm9vdC4iKSkgewogICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIlVuYWJsZSB0byBsb2FkIHBlcnNpc3RlbnQgcHJvcGVydHkgZmlsZTogcHJvcGVydHkgJyIgPDwgcHJvcC5uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInIGRvZXNuJ3Qgc3RhcnQgd2l0aCAncGVyc2lzdC4nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInIGRvZXNuJ3Qgc3RhcnQgd2l0aCAncGVyc2lzdC4nIG9yICduZXh0X2Jvb3QuJyI7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHBlcnNpc3RlbnRfcHJvcGVydGllczsKQEAgLTIyMSw2ICsyMDMsMjQgQEAKICAgICByZXR1cm4ge307CiB9CiAKK1BlcnNpc3RlbnRQcm9wZXJ0aWVzIExvYWRQZXJzaXN0ZW50UHJvcGVydGllc0Zyb21NZW1vcnkoKSB7CisgICAgUGVyc2lzdGVudFByb3BlcnRpZXMgcGVyc2lzdGVudF9wcm9wZXJ0aWVzOworICAgIF9fc3lzdGVtX3Byb3BlcnR5X2ZvcmVhY2goCisgICAgICAgICAgICBbXShjb25zdCBwcm9wX2luZm8qIHBpLCB2b2lkKiBjb29raWUpIHsKKyAgICAgICAgICAgICAgICBfX3N5c3RlbV9wcm9wZXJ0eV9yZWFkX2NhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgcGksCisgICAgICAgICAgICAgICAgICAgICAgICBbXSh2b2lkKiBjb29raWUsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCB1bnNpZ25lZCBzZXJpYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3RhcnRzV2l0aChuYW1lLCAicGVyc2lzdC4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHByb3BlcnRpZXMgPSByZWludGVycHJldF9jYXN0PFBlcnNpc3RlbnRQcm9wZXJ0aWVzKj4oY29va2llKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGVyc2lzdGVudFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgY29va2llKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAmcGVyc2lzdGVudF9wcm9wZXJ0aWVzKTsKKyAgICByZXR1cm4gcGVyc2lzdGVudF9wcm9wZXJ0aWVzOworfQorCiAvLyBQZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIG5vdCB3cml0dGVuIG9mdGVuLCBzbyB3ZSByYXRoZXIgbm90IGtlZXAgYW55IGRhdGEgaW4gbWVtb3J5IGFuZCByZWFkCiAvLyB0aGVuIHJld3JpdGUgdGhlIHBlcnNpc3RlbnQgcHJvcGVydHkgZmlsZSBmb3IgZWFjaCB1cGRhdGUuCiB2b2lkIFdyaXRlUGVyc2lzdGVudFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKQEAgLTI2Niw4ICsyNjYsNTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAqcGVyc2lzdGVudF9wcm9wZXJ0aWVzOworICAgIC8vIGxvb3Agb3ZlciB0byBmaW5kIGFsbCBzdGFnZWQgcHJvcHMKKyAgICBhdXRvIGNvbnN0IHN0YWdlZF9wcmVmaXggPSBzdGQ6OnN0cmluZ192aWV3KCJuZXh0X2Jvb3QuIik7CisgICAgYXV0byBzdGFnZWRfcHJvcHMgPSBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPigpOworICAgIGZvciAoY29uc3QgYXV0byYgcHJvcGVydHlfcmVjb3JkIDogcGVyc2lzdGVudF9wcm9wZXJ0aWVzLT5wcm9wZXJ0aWVzKCkpIHsKKyAgICAgICAgYXV0byBjb25zdCYgcHJvcF9uYW1lID0gcHJvcGVydHlfcmVjb3JkLm5hbWUoKTsKKyAgICAgICAgYXV0byBjb25zdCYgcHJvcF92YWx1ZSA9IHByb3BlcnR5X3JlY29yZC52YWx1ZSgpOworICAgICAgICBpZiAoU3RhcnRzV2l0aChwcm9wX25hbWUsIHN0YWdlZF9wcmVmaXgpKSB7CisgICAgICAgICAgICBhdXRvIGFjdHVhbF9wcm9wX25hbWUgPSBwcm9wX25hbWUuc3Vic3RyKHN0YWdlZF9wcmVmaXguc2l6ZSgpKTsKKyAgICAgICAgICAgIHN0YWdlZF9wcm9wc1thY3R1YWxfcHJvcF9uYW1lXSA9IHByb3BfdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhZ2VkX3Byb3BzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuICpwZXJzaXN0ZW50X3Byb3BlcnRpZXM7CisgICAgfQorCisgICAgLy8gaWYgaGFzIHN0YWdpbmcsIGFwcGx5IHN0YWdpbmcgYW5kIHBlcnNlcnZlIHRoZSBvcmlnaW5hbCBwcm9wIG9yZGVyCisgICAgUGVyc2lzdGVudFByb3BlcnRpZXMgdXBkYXRlZF9wZXJzaXN0ZW50X3Byb3BlcnRpZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9wZXJ0eV9yZWNvcmQgOiBwZXJzaXN0ZW50X3Byb3BlcnRpZXMtPnByb3BlcnRpZXMoKSkgeworICAgICAgICBhdXRvIGNvbnN0JiBwcm9wX25hbWUgPSBwcm9wZXJ0eV9yZWNvcmQubmFtZSgpOworICAgICAgICBhdXRvIGNvbnN0JiBwcm9wX3ZhbHVlID0gcHJvcGVydHlfcmVjb3JkLnZhbHVlKCk7CisKKyAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSBzdGFnZWQgcHJvcHMgYW55bW9yZQorICAgICAgICBpZiAoU3RhcnRzV2l0aChwcm9wX25hbWUsIHN0YWdlZF9wcmVmaXgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaXRlciA9IHN0YWdlZF9wcm9wcy5maW5kKHByb3BfbmFtZSk7CisgICAgICAgIGlmIChpdGVyICE9IHN0YWdlZF9wcm9wcy5lbmQoKSkgeworICAgICAgICAgICAgQWRkUGVyc2lzdGVudFByb3BlcnR5KHByb3BfbmFtZSwgaXRlci0+c2Vjb25kLCAmdXBkYXRlZF9wZXJzaXN0ZW50X3Byb3BlcnRpZXMpOworICAgICAgICAgICAgc3RhZ2VkX3Byb3BzLmVyYXNlKGl0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQWRkUGVyc2lzdGVudFByb3BlcnR5KHByb3BfbmFtZSwgcHJvcF92YWx1ZSwgJnVwZGF0ZWRfcGVyc2lzdGVudF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkZCBhbnkgYWRkaXRpb25hbCBzdGFnZWQgcHJvcHMKKyAgICBmb3IgKGF1dG8gY29uc3QmIFtwcm9wX25hbWUsIHByb3BfdmFsdWVdIDogc3RhZ2VkX3Byb3BzKSB7CisgICAgICAgIEFkZFBlcnNpc3RlbnRQcm9wZXJ0eShwcm9wX25hbWUsIHByb3BfdmFsdWUsICZ1cGRhdGVkX3BlcnNpc3RlbnRfcHJvcGVydGllcyk7CisgICAgfQorCisgICAgLy8gd3JpdGUgY3VycmVudCB1cGRhdGVkIHBlcnNpc3QgcHJvcCBmaWxlCisgICAgYXV0byByZXN1bHQgPSBXcml0ZVBlcnNpc3RlbnRQcm9wZXJ0eUZpbGUodXBkYXRlZF9wZXJzaXN0ZW50X3Byb3BlcnRpZXMpOworICAgIGlmICghcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHN0b3JlIHBlcnNpc3RlbnQgcHJvcGVydHk6ICIgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgfQorCisgICAgcmV0dXJuIHVwZGF0ZWRfcGVyc2lzdGVudF9wcm9wZXJ0aWVzOwogfQogCisKKwogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L3BlcnNpc3RlbnRfcHJvcGVydGllcy5oIGIvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXMuaAppbmRleCAzODQ1YTBkLi4xMTA4M2RhIDEwMDY0NAotLS0gYS9pbml0L3BlcnNpc3RlbnRfcHJvcGVydGllcy5oCisrKyBiL2luaXQvcGVyc2lzdGVudF9wcm9wZXJ0aWVzLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAogUGVyc2lzdGVudFByb3BlcnRpZXMgTG9hZFBlcnNpc3RlbnRQcm9wZXJ0aWVzKCk7CiB2b2lkIFdyaXRlUGVyc2lzdGVudFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworUGVyc2lzdGVudFByb3BlcnRpZXMgTG9hZFBlcnNpc3RlbnRQcm9wZXJ0aWVzRnJvbU1lbW9yeSgpOwogCiAvLyBFeHBvc2VkIG9ubHkgZm9yIHRlc3RpbmcKIFJlc3VsdDxQZXJzaXN0ZW50UHJvcGVydGllcz4gTG9hZFBlcnNpc3RlbnRQcm9wZXJ0eUZpbGUoKTsKZGlmZiAtLWdpdCBhL2luaXQvcGVyc2lzdGVudF9wcm9wZXJ0aWVzX3Rlc3QuY3BwIGIvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXNfdGVzdC5jcHAKaW5kZXggZTVkMjZkYi4uNTc2MzA1MCAxMDA2NDQKLS0tIGEvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXNfdGVzdC5jcHAKKysrIGIvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXNfdGVzdC5jcHAKQEAgLTE3OCw1ICsxNzgsMzcgQEAKICAgICBFWFBFQ1RfRkFMU0UoaXQgPT0gcmVhZF9iYWNrX3Byb3BlcnRpZXMucHJvcGVydGllcygpLmVuZCgpKTsKIH0KIAorVEVTVChwZXJzaXN0ZW50X3Byb3BlcnRpZXMsIFN0YWdlZFBlcnNpc3RQcm9wZXJ0eSkgeworICAgIFRlbXBvcmFyeUZpbGUgdGY7CisgICAgQVNTRVJUX1RSVUUodGYuZmQgIT0gLTEpOworICAgIHBlcnNpc3RlbnRfcHJvcGVydHlfZmlsZW5hbWUgPSB0Zi5wYXRoOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHBlcnNpc3RlbnRfcHJvcGVydGllcyA9IHsKKyAgICAgICAgeyJwZXJzaXN0LnN5cy5sb2NhbGUiLCAiZW4tVVMifSwKKyAgICAgICAgeyJuZXh0X2Jvb3QucGVyc2lzdC50ZXN0Lm51bWJlcnMiLCAiNTQzMjEifSwKKyAgICAgICAgeyJwZXJzaXN0LnN5cy50aW1lem9uZSIsICJBbWVyaWNhL0xvc19BbmdlbGVzIn0sCisgICAgICAgIHsicGVyc2lzdC50ZXN0Lm51bWJlcnMiLCAiMTIzNDUifSwKKyAgICAgICAgeyJuZXh0X2Jvb3QucGVyc2lzdC50ZXN0LmV4dHJhIiwgImFiYyJ9LAorICAgIH07CisKKyAgICBBU1NFUlRfUkVTVUxUX09LKAorICAgICAgICAgICAgV3JpdGVQZXJzaXN0ZW50UHJvcGVydHlGaWxlKFZlY3RvclRvUGVyc2lzdGVudFByb3BlcnRpZXMocGVyc2lzdGVudF9wcm9wZXJ0aWVzKSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGV4cGVjdGVkX3BlcnNpc3RlbnRfcHJvcGVydGllcyA9IHsKKyAgICAgICAgeyJwZXJzaXN0LnN5cy5sb2NhbGUiLCAiZW4tVVMifSwKKyAgICAgICAgeyJwZXJzaXN0LnN5cy50aW1lem9uZSIsICJBbWVyaWNhL0xvc19BbmdlbGVzIn0sCisgICAgICAgIHsicGVyc2lzdC50ZXN0Lm51bWJlcnMiLCAiNTQzMjEifSwKKyAgICAgICAgeyJwZXJzaXN0LnRlc3QuZXh0cmEiLCAiYWJjIn0sCisgICAgfTsKKworICAgIC8vIGxvY2sgZG93biB0aGF0IHN0YWdlZCBwcm9wcyBhcmUgYXBwbGllZAorICAgIGF1dG8gZmlyc3RfcmVhZF9iYWNrX3Byb3BlcnRpZXMgPSBMb2FkUGVyc2lzdGVudFByb3BlcnRpZXMoKTsKKyAgICBDaGVja1Byb3BlcnRpZXNFcXVhbChleHBlY3RlZF9wZXJzaXN0ZW50X3Byb3BlcnRpZXMsIGZpcnN0X3JlYWRfYmFja19wcm9wZXJ0aWVzKTsKKworICAgIC8vIGxvY2sgZG93biB0aGF0IG90aGVyIHByb3BzIGFyZSBub3Qgb3ZlcndyaXR0ZW4KKyAgICBhdXRvIHNlY29uZF9yZWFkX2JhY2tfcHJvcGVydGllcyA9IExvYWRQZXJzaXN0ZW50UHJvcGVydGllcygpOworICAgIENoZWNrUHJvcGVydGllc0VxdWFsKGV4cGVjdGVkX3BlcnNpc3RlbnRfcHJvcGVydGllcywgc2Vjb25kX3JlYWRfYmFja19wcm9wZXJ0aWVzKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L3Byb3BlcnR5X3NlcnZpY2UuY3BwIGIvaW5pdC9wcm9wZXJ0eV9zZXJ2aWNlLmNwcAppbmRleCA0MjQyOTEyLi4zMGFkODAwIDEwMDY0NAotLS0gYS9pbml0L3Byb3BlcnR5X3NlcnZpY2UuY3BwCisrKyBiL2luaXQvcHJvcGVydHlfc2VydmljZS5jcHAKQEAgLTU3LDEyICs1NywxNCBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KICNpbmNsdWRlIDxwcm9wZXJ0eV9pbmZvX3BhcnNlci9wcm9wZXJ0eV9pbmZvX3BhcnNlci5oPgogI2luY2x1ZGUgPHByb3BlcnR5X2luZm9fc2VyaWFsaXplci9wcm9wZXJ0eV9pbmZvX3NlcmlhbGl6ZXIuaD4KICNpbmNsdWRlIDxzZWxpbnV4L2FuZHJvaWQuaD4KICNpbmNsdWRlIDxzZWxpbnV4L2xhYmVsLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8dmVuZG9yc3VwcG9ydC9hcGlfbGV2ZWwuaD4KKwogI2luY2x1ZGUgImRlYnVnX3JhbWRpc2suaCIKICNpbmNsdWRlICJlcG9sbC5oIgogI2luY2x1ZGUgImluaXQuaCIKQEAgLTc1LDEwICs3NywxNSBAQAogI2luY2x1ZGUgInN5c3RlbS9jb3JlL2luaXQvcHJvcGVydHlfc2VydmljZS5wYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAorc3RhdGljIGNvbnN0ZXhwciBjaGFyIEFQUENPTVBBVF9PVkVSUklERV9QUk9QX0ZPTERFUk5BTUVbXSA9CisgICAgICAgICIvZGV2L19fcHJvcGVydGllc19fL2FwcGNvbXBhdF9vdmVycmlkZSI7CitzdGF0aWMgY29uc3RleHByIGNoYXIgQVBQQ09NUEFUX09WRVJSSURFX1BST1BfVFJFRV9GSUxFW10gPQorICAgICAgICAiL2Rldi9fX3Byb3BlcnRpZXNfXy9hcHBjb21wYXRfb3ZlcnJpZGUvcHJvcGVydHlfaW5mbyI7CiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpsaXRlcmFsczsKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OkVycm9yOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHk7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eTsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlBhcnNlSW50OwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZzsKQEAgLTEwNywxNiArMTE0LDE1IEBACiBjb25zdGV4cHIgYXV0byBMRUdBQ1lfSURfUFJPUCA9ICJyby5idWlsZC5sZWdhY3kuaWQiOwogY29uc3RleHByIGF1dG8gVkJNRVRBX0RJR0VTVF9QUk9QID0gInJvLmJvb3QudmJtZXRhLmRpZ2VzdCI7CiBjb25zdGV4cHIgYXV0byBESUdFU1RfU0laRV9VU0VEID0gODsKLWNvbnN0ZXhwciBhdXRvIEFQSV9MRVZFTF9DVVJSRU5UID0gMTAwMDA7CiAKIHN0YXRpYyBib29sIHBlcnNpc3RlbnRfcHJvcGVydGllc19sb2FkZWQgPSBmYWxzZTsKIAorc3RhdGljIGludCBwcm9wZXJ0eV9zZXRfZmQgPSAtMTsKIHN0YXRpYyBpbnQgZnJvbV9pbml0X3NvY2tldCA9IC0xOwogc3RhdGljIGludCBpbml0X3NvY2tldCA9IC0xOwogc3RhdGljIGJvb2wgYWNjZXB0X21lc3NhZ2VzID0gZmFsc2U7CiBzdGF0aWMgc3RkOjptdXRleCBhY2NlcHRfbWVzc2FnZXNfbG9jazsKIHN0YXRpYyBzdGQ6OnRocmVhZCBwcm9wZXJ0eV9zZXJ2aWNlX3RocmVhZDsKLXN0YXRpYyBzdGQ6OnRocmVhZCBwcm9wZXJ0eV9zZXJ2aWNlX2Zvcl9zeXN0ZW1fdGhyZWFkOwogCiBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFBlcnNpc3RXcml0ZVRocmVhZD4gcGVyc2lzdF93cml0ZV90aHJlYWQ7CiAKQEAgLTM5NCwzNyArNDAwLDMwIEBACiAgICAgICAgIHJldHVybiB7UFJPUF9FUlJPUl9JTlZBTElEX1ZBTFVFfTsKICAgICB9CiAKLSAgICBpZiAobmFtZSA9PSAic3lzLnBvd2VyY3RsIikgewotICAgICAgICAvLyBObyBhY3Rpb24gaGVyZSAtIE5vdGlmeVByb3BlcnR5Q2hhbmdlIHdpbGwgdHJpZ2dlciB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uLCBhbmQgc2luY2UgdGhpcwotICAgICAgICAvLyBjYW4gY29tZSB0byB0aGUgc2Vjb25kIHRocmVhZCwgd2UgbXVzdG4ndCBjYWxsIG91dCB0byB0aGUgX19zeXN0ZW1fcHJvcGVydHlfKiBmdW5jdGlvbnMKLSAgICAgICAgLy8gd2hpY2ggc3VwcG9ydCBtdWx0aXBsZSByZWFkZXJzIGJ1dCBvbmx5IG9uZSBtdXRhdG9yLgorICAgIHByb3BfaW5mbyogcGkgPSAocHJvcF9pbmZvKilfX3N5c3RlbV9wcm9wZXJ0eV9maW5kKG5hbWUuY19zdHIoKSk7CisgICAgaWYgKHBpICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcm8uKiBwcm9wZXJ0aWVzIGFyZSBhY3R1YWxseSAid3JpdGUtb25jZSIuCisgICAgICAgIGlmIChTdGFydHNXaXRoKG5hbWUsICJyby4iKSkgeworICAgICAgICAgICAgKmVycm9yID0gIlJlYWQtb25seSBwcm9wZXJ0eSB3YXMgYWxyZWFkeSBzZXQiOworICAgICAgICAgICAgcmV0dXJuIHtQUk9QX0VSUk9SX1JFQURfT05MWV9QUk9QRVJUWX07CisgICAgICAgIH0KKworICAgICAgICBfX3N5c3RlbV9wcm9wZXJ0eV91cGRhdGUocGksIHZhbHVlLmNfc3RyKCksIHZhbHVlbGVuKTsKICAgICB9IGVsc2UgewotICAgICAgICBwcm9wX2luZm8qIHBpID0gKHByb3BfaW5mbyopX19zeXN0ZW1fcHJvcGVydHlfZmluZChuYW1lLmNfc3RyKCkpOwotICAgICAgICBpZiAocGkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gcm8uKiBwcm9wZXJ0aWVzIGFyZSBhY3R1YWxseSAid3JpdGUtb25jZSIuCi0gICAgICAgICAgICBpZiAoU3RhcnRzV2l0aChuYW1lLCAicm8uIikpIHsKLSAgICAgICAgICAgICAgICAqZXJyb3IgPSAiUmVhZC1vbmx5IHByb3BlcnR5IHdhcyBhbHJlYWR5IHNldCI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHtQUk9QX0VSUk9SX1JFQURfT05MWV9QUk9QRVJUWX07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9fc3lzdGVtX3Byb3BlcnR5X3VwZGF0ZShwaSwgdmFsdWUuY19zdHIoKSwgdmFsdWVsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHJjID0gX19zeXN0ZW1fcHJvcGVydHlfYWRkKG5hbWUuY19zdHIoKSwgbmFtZS5zaXplKCksIHZhbHVlLmNfc3RyKCksIHZhbHVlbGVuKTsKLSAgICAgICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAqZXJyb3IgPSAiX19zeXN0ZW1fcHJvcGVydHlfYWRkIGZhaWxlZCI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHtQUk9QX0VSUk9SX1NFVF9GQUlMRUR9OwotICAgICAgICAgICAgfQorICAgICAgICBpbnQgcmMgPSBfX3N5c3RlbV9wcm9wZXJ0eV9hZGQobmFtZS5jX3N0cigpLCBuYW1lLnNpemUoKSwgdmFsdWUuY19zdHIoKSwgdmFsdWVsZW4pOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAqZXJyb3IgPSAiX19zeXN0ZW1fcHJvcGVydHlfYWRkIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4ge1BST1BfRVJST1JfU0VUX0ZBSUxFRH07CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgLy8gRG9uJ3Qgd3JpdGUgcHJvcGVydGllcyB0byBkaXNrIHVudGlsIGFmdGVyIHdlIGhhdmUgcmVhZCBhbGwgZGVmYXVsdAotICAgICAgICAvLyBwcm9wZXJ0aWVzIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IGRlZmF1bHQgdmFsdWVzLgotICAgICAgICBpZiAoc29ja2V0ICYmIHBlcnNpc3RlbnRfcHJvcGVydGllc19sb2FkZWQgJiYgU3RhcnRzV2l0aChuYW1lLCAicGVyc2lzdC4iKSkgewotICAgICAgICAgICAgaWYgKHBlcnNpc3Rfd3JpdGVfdGhyZWFkKSB7Ci0gICAgICAgICAgICAgICAgcGVyc2lzdF93cml0ZV90aHJlYWQtPldyaXRlKG5hbWUsIHZhbHVlLCBzdGQ6Om1vdmUoKnNvY2tldCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFdyaXRlUGVyc2lzdGVudFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICBib29sIG5lZWRfcGVyc2lzdCA9IFN0YXJ0c1dpdGgobmFtZSwgInBlcnNpc3QuIikgfHwgU3RhcnRzV2l0aChuYW1lLCAibmV4dF9ib290LiIpOworICAgIGlmIChzb2NrZXQgJiYgcGVyc2lzdGVudF9wcm9wZXJ0aWVzX2xvYWRlZCAmJiBuZWVkX3BlcnNpc3QpIHsKKyAgICAgICAgaWYgKHBlcnNpc3Rfd3JpdGVfdGhyZWFkKSB7CisgICAgICAgICAgICBwZXJzaXN0X3dyaXRlX3RocmVhZC0+V3JpdGUobmFtZSwgdmFsdWUsIHN0ZDo6bW92ZSgqc29ja2V0KSk7CisgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgIH0KKyAgICAgICAgV3JpdGVQZXJzaXN0ZW50UHJvcGVydHkobmFtZSwgdmFsdWUpOwogICAgIH0KIAogICAgIE5vdGlmeVByb3BlcnR5Q2hhbmdlKG5hbWUsIHZhbHVlKTsKQEAgLTU4NSwxMCArNTg0LDEwIEBACiAgICAgcmV0dXJuICpyZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZV9wcm9wZXJ0eV9zZXRfZmQoaW50IGZkKSB7CitzdGF0aWMgdm9pZCBoYW5kbGVfcHJvcGVydHlfc2V0X2ZkKCkgewogICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0RlZmF1bHRTb2NrZXRUaW1lb3V0ID0gMjAwMDsgLyogbXMgKi8KIAotICAgIGludCBzID0gYWNjZXB0NChmZCwgbnVsbHB0ciwgbnVsbHB0ciwgU09DS19DTE9FWEVDKTsKKyAgICBpbnQgcyA9IGFjY2VwdDQocHJvcGVydHlfc2V0X2ZkLCBudWxscHRyLCBudWxscHRyLCBTT0NLX0NMT0VYRUMpOwogICAgIGlmIChzID09IC0xKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMDg2LDM2ICsxMDg1LDM4IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IHJlYWRfYXBpX2xldmVsX3Byb3BzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXBpX2xldmVsX3Byb3BzKSB7Ci0gICAgaW50IGFwaV9sZXZlbCA9IEFQSV9MRVZFTF9DVVJSRU5UOwotICAgIGZvciAoY29uc3QgYXV0byYgYXBpX2xldmVsX3Byb3AgOiBhcGlfbGV2ZWxfcHJvcHMpIHsKLSAgICAgICAgYXBpX2xldmVsID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoYXBpX2xldmVsX3Byb3AsIEFQSV9MRVZFTF9DVVJSRU5UKTsKLSAgICAgICAgaWYgKGFwaV9sZXZlbCAhPSBBUElfTEVWRUxfQ1VSUkVOVCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFwaV9sZXZlbDsKLX0KLQogc3RhdGljIHZvaWQgcHJvcGVydHlfaW5pdGlhbGl6ZV9yb192ZW5kb3JfYXBpX2xldmVsKCkgewogICAgIC8vIHJvLnZlbmRvci5hcGlfbGV2ZWwgc2hvd3MgdGhlIGFwaV9sZXZlbCB0aGF0IHRoZSB2ZW5kb3IgaW1hZ2VzICh2ZW5kb3IsIG9kbSwgLi4uKSBhcmUKICAgICAvLyByZXF1aXJlZCB0byBzdXBwb3J0LgogICAgIGNvbnN0ZXhwciBhdXRvIFZFTkRPUl9BUElfTEVWRUxfUFJPUCA9ICJyby52ZW5kb3IuYXBpX2xldmVsIjsKIAotICAgIC8vIEFwaSBsZXZlbCBwcm9wZXJ0aWVzIG9mIHRoZSBib2FyZC4gVGhlIG9yZGVyIG9mIHRoZSBwcm9wZXJ0aWVzIG11c3QgYmUga2VwdC4KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQk9BUkRfQVBJX0xFVkVMX1BST1BTID0geyJyby5ib2FyZC5hcGlfbGV2ZWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCJ9OwotICAgIC8vIEFwaSBsZXZlbCBwcm9wZXJ0aWVzIG9mIHRoZSBkZXZpY2UuIFRoZSBvcmRlciBvZiB0aGUgcHJvcGVydGllcyBtdXN0IGJlIGtlcHQuCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IERFVklDRV9BUElfTEVWRUxfUFJPUFMgPSB7InJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm8uYnVpbGQudmVyc2lvbi5zZGsifTsKKyAgICBhdXRvIHZlbmRvcl9hcGlfbGV2ZWwgPSBHZXRJbnRQcm9wZXJ0eSgicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwgX19BTkRST0lEX1ZFTkRPUl9BUElfTUFYX18pOworICAgIGlmICh2ZW5kb3JfYXBpX2xldmVsICE9IF9fQU5EUk9JRF9WRU5ET1JfQVBJX01BWF9fKSB7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdmVuZG9yX2FwaV9sZXZlbCB3aXRoICJyby5ib2FyZC5hcGlfbGV2ZWwiIG9ubHkgaWYgYm90aCAicm8uYm9hcmQuYXBpX2xldmVsIgorICAgICAgICAvLyBhbmQgInJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCIgYXJlIGRlZmluZWQuCisgICAgICAgIHZlbmRvcl9hcGlfbGV2ZWwgPSBHZXRJbnRQcm9wZXJ0eSgicm8uYm9hcmQuYXBpX2xldmVsIiwgdmVuZG9yX2FwaV9sZXZlbCk7CisgICAgfQogCi0gICAgaW50IGFwaV9sZXZlbCA9IHN0ZDo6bWluKHJlYWRfYXBpX2xldmVsX3Byb3BzKEJPQVJEX0FQSV9MRVZFTF9QUk9QUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYXBpX2xldmVsX3Byb3BzKERFVklDRV9BUElfTEVWRUxfUFJPUFMpKTsKKyAgICBhdXRvIHByb2R1Y3RfZmlyc3RfYXBpX2xldmVsID0KKyAgICAgICAgICAgIEdldEludFByb3BlcnR5KCJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIsIF9fQU5EUk9JRF9BUElfRlVUVVJFX18pOworICAgIGlmIChwcm9kdWN0X2ZpcnN0X2FwaV9sZXZlbCA9PSBfX0FORFJPSURfQVBJX0ZVVFVSRV9fKSB7CisgICAgICAgIC8vIEZhbGxiYWNrIHRvICJyby5idWlsZC52ZXJzaW9uLnNkayIgaWYgdGhlICJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIgaXMgbm90IGRlZmluZWQuCisgICAgICAgIHByb2R1Y3RfZmlyc3RfYXBpX2xldmVsID0gR2V0SW50UHJvcGVydHkoInJvLmJ1aWxkLnZlcnNpb24uc2RrIiwgX19BTkRST0lEX0FQSV9GVVRVUkVfXyk7CisgICAgfQorCisgICAgdmVuZG9yX2FwaV9sZXZlbCA9IHN0ZDo6bWluKHZlbmRvcl9hcGlfbGV2ZWxfb2YocHJvZHVjdF9maXJzdF9hcGlfbGV2ZWwpLCB2ZW5kb3JfYXBpX2xldmVsKTsKKworICAgIGlmICh2ZW5kb3JfYXBpX2xldmVsIDwgMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIHZlbmRvciBhcGkgbGV2ZWwgZm9yICIgPDwgVkVORE9SX0FQSV9MRVZFTF9QUk9QIDw8ICIuIENoZWNrICIKKyAgICAgICAgICAgICAgICAgICA8PCAicm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWwgYW5kIHJvLmJ1aWxkLnZlcnNpb24uc2RrLiI7CisgICAgICAgIHZlbmRvcl9hcGlfbGV2ZWwgPSBfX0FORFJPSURfVkVORE9SX0FQSV9NQVhfXzsKKyAgICB9CisKICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKLSAgICBhdXRvIHJlcyA9IFByb3BlcnR5U2V0Tm9Tb2NrZXQoVkVORE9SX0FQSV9MRVZFTF9QUk9QLCBzdGQ6OnRvX3N0cmluZyhhcGlfbGV2ZWwpLCAmZXJyb3IpOworICAgIGF1dG8gcmVzID0gUHJvcGVydHlTZXROb1NvY2tldChWRU5ET1JfQVBJX0xFVkVMX1BST1AsIHN0ZDo6dG9fc3RyaW5nKHZlbmRvcl9hcGlfbGV2ZWwpLCAmZXJyb3IpOwogICAgIGlmIChyZXMgIT0gUFJPUF9TVUNDRVNTKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgIiA8PCBWRU5ET1JfQVBJX0xFVkVMX1BST1AgPDwgIiB3aXRoICIgPDwgYXBpX2xldmVsIDw8ICI6ICIKLSAgICAgICAgICAgICAgICAgICA8PCBlcnJvciA8PCAiKCIgPDwgcmVzIDw8ICIpIjsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCAiIDw8IFZFTkRPUl9BUElfTEVWRUxfUFJPUCA8PCAiIHdpdGggIiA8PCB2ZW5kb3JfYXBpX2xldmVsCisgICAgICAgICAgICAgICAgICAgPDwgIjogIiA8PCBlcnJvciA8PCAiKCIgPDwgcmVzIDw8ICIpIjsKICAgICB9CiB9CiAKQEAgLTEyNTIsOSArMTI1Myw2IEBACiAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciBmYWlsdXJlIGhlcmUsIHNpbmNlIHdlIGRvbid0IGFsd2F5cyBoYXZlIGFsbCBvZiB0aGVzZSBwYXJ0aXRpb25zLgogICAgICAgICAvLyBFLmcuIEluIGNhc2Ugb2YgcmVjb3ZlcnksIHRoZSB2ZW5kb3IgcGFydGl0aW9uIHdpbGwgbm90IGhhdmUgbW91bnRlZCBhbmQgd2UKICAgICAgICAgLy8gc3RpbGwgbmVlZCB0aGUgc3lzdGVtIC8gcGxhdGZvcm0gcHJvcGVydGllcyB0byBmdW5jdGlvbi4KLSAgICAgICAgaWYgKGFjY2VzcygiL2Rldi9zZWxpbnV4L2FwZXhfcHJvcGVydHlfY29udGV4dHMiLCBSX09LKSAhPSAtMSkgewotICAgICAgICAgICAgTG9hZFByb3BlcnR5SW5mb0Zyb21GaWxlKCIvZGV2L3NlbGludXgvYXBleF9wcm9wZXJ0eV9jb250ZXh0cyIsICZwcm9wZXJ0eV9pbmZvcyk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKGFjY2VzcygiL3N5c3RlbV9leHQvZXRjL3NlbGludXgvc3lzdGVtX2V4dF9wcm9wZXJ0eV9jb250ZXh0cyIsIFJfT0spICE9IC0xKSB7CiAgICAgICAgICAgICBMb2FkUHJvcGVydHlJbmZvRnJvbUZpbGUoIi9zeXN0ZW1fZXh0L2V0Yy9zZWxpbnV4L3N5c3RlbV9leHRfcHJvcGVydHlfY29udGV4dHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9pbmZvcyk7CkBAIC0xMjc4LDcgKzEyNzYsNiBAQAogICAgICAgICBMb2FkUHJvcGVydHlJbmZvRnJvbUZpbGUoIi92ZW5kb3JfcHJvcGVydHlfY29udGV4dHMiLCAmcHJvcGVydHlfaW5mb3MpOwogICAgICAgICBMb2FkUHJvcGVydHlJbmZvRnJvbUZpbGUoIi9wcm9kdWN0X3Byb3BlcnR5X2NvbnRleHRzIiwgJnByb3BlcnR5X2luZm9zKTsKICAgICAgICAgTG9hZFByb3BlcnR5SW5mb0Zyb21GaWxlKCIvb2RtX3Byb3BlcnR5X2NvbnRleHRzIiwgJnByb3BlcnR5X2luZm9zKTsKLSAgICAgICAgTG9hZFByb3BlcnR5SW5mb0Zyb21GaWxlKCIvZGV2L3NlbGludXgvYXBleF9wcm9wZXJ0eV9jb250ZXh0cyIsICZwcm9wZXJ0eV9pbmZvcyk7CiAgICAgfQogCiAgICAgYXV0byBzZXJpYWxpemVkX2NvbnRleHRzID0gc3RkOjpzdHJpbmcoKTsKQEAgLTEyODksMTEgKzEyODYsMTcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgY2hhciBrUHJvcGVydHlJbmZvc1BhdGhbXSA9ICIvZGV2L19fcHJvcGVydGllc19fL3Byb3BlcnR5X2luZm8iOwotICAgIGlmICghV3JpdGVTdHJpbmdUb0ZpbGUoc2VyaWFsaXplZF9jb250ZXh0cywga1Byb3BlcnR5SW5mb3NQYXRoLCAwNDQ0LCAwLCAwLCBmYWxzZSkpIHsKKyAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKHNlcmlhbGl6ZWRfY29udGV4dHMsIFBST1BfVFJFRV9GSUxFLCAwNDQ0LCAwLCAwLCBmYWxzZSkpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byB3cml0ZSBzZXJpYWxpemVkIHByb3BlcnR5IGluZm9zIHRvIGZpbGUiOwogICAgIH0KLSAgICBzZWxpbnV4X2FuZHJvaWRfcmVzdG9yZWNvbihrUHJvcGVydHlJbmZvc1BhdGgsIDApOworICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKFBST1BfVFJFRV9GSUxFLCAwKTsKKworICAgIG1rZGlyKEFQUENPTVBBVF9PVkVSUklERV9QUk9QX0ZPTERFUk5BTUUsIFNfSVJXWFUgfCBTX0lYR1JQIHwgU19JWE9USCk7CisgICAgaWYgKCFXcml0ZVN0cmluZ1RvRmlsZShzZXJpYWxpemVkX2NvbnRleHRzLCBBUFBDT01QQVRfT1ZFUlJJREVfUFJPUF9UUkVFX0ZJTEUsIDA0NDQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byB3cml0ZSB2ZW5kb3Igb3ZlcnJpZGVzIHRvIGZpbGUiOworICAgIH0KKyAgICBzZWxpbnV4X2FuZHJvaWRfcmVzdG9yZWNvbihBUFBDT01QQVRfT1ZFUlJJREVfUFJPUF9UUkVFX0ZJTEUsIDApOwogfQogCiBzdGF0aWMgdm9pZCBFeHBvcnRLZXJuZWxCb290UHJvcHMoKSB7CkBAIC0xMzIzLDcgKzEzMjYsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgaW50ICgqKShESVIqKT4gZGlyKG9wZW5kaXIoZ2V0X2FuZHJvaWRfZHRfZGlyKCkuY19zdHIoKSksIGNsb3NlZGlyKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RElSLCBpbnQgKCopKERJUiopPiBkaXIob3BlbmRpcihhbmRyb2lkOjpmc19tZ3I6OkdldEFuZHJvaWREdERpcigpLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWRpcik7CiAgICAgaWYgKCFkaXIpIHJldHVybjsKIAogICAgIHN0ZDo6c3RyaW5nIGR0X2ZpbGU7CkBAIC0xMzM0LDcgKzEzMzgsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArIGRwLT5kX25hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IGFuZHJvaWQ6OmZzX21ncjo6R2V0QW5kcm9pZER0RGlyKCkgKyBkcC0+ZF9uYW1lOwogCiAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZmlsZV9uYW1lLCAmZHRfZmlsZSk7CiAgICAgICAgIHN0ZDo6cmVwbGFjZShkdF9maWxlLmJlZ2luKCksIGR0X2ZpbGUuZW5kKCksICcsJywgJy4nKTsKQEAgLTEzNDYsNyArMTM1MCw3IEBACiBjb25zdGV4cHIgYXV0byBBTkRST0lEQk9PVF9QUkVGSVggPSAiYW5kcm9pZGJvb3QuInN2OwogCiBzdGF0aWMgdm9pZCBQcm9jZXNzS2VybmVsQ21kbGluZSgpIHsKLSAgICBJbXBvcnRLZXJuZWxDbWRsaW5lKFsmXShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpmc19tZ3I6OkltcG9ydEtlcm5lbENtZGxpbmUoWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICAgICAgICBpZiAoU3RhcnRzV2l0aChrZXksIEFORFJPSURCT09UX1BSRUZJWCkpIHsKICAgICAgICAgICAgIEluaXRQcm9wZXJ0eVNldCgicm8uYm9vdC4iICsga2V5LnN1YnN0cihBTkRST0lEQk9PVF9QUkVGSVguc2l6ZSgpKSwgdmFsdWUpOwogICAgICAgICB9CkBAIC0xMzU1LDcgKzEzNTksNyBAQAogCiAKIHN0YXRpYyB2b2lkIFByb2Nlc3NCb290Y29uZmlnKCkgewotICAgIEltcG9ydEJvb3Rjb25maWcoWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6OmZzX21ncjo6SW1wb3J0Qm9vdGNvbmZpZyhbJl0oY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgICAgICAgIGlmIChTdGFydHNXaXRoKGtleSwgQU5EUk9JREJPT1RfUFJFRklYKSkgewogICAgICAgICAgICAgSW5pdFByb3BlcnR5U2V0KCJyby5ib290LiIgKyBrZXkuc3Vic3RyKEFORFJPSURCT09UX1BSRUZJWC5zaXplKCkpLCB2YWx1ZSk7CiAgICAgICAgIH0KQEAgLTE0MDUsMTIgKzE0MDksMTQgQEAKICAgICBzd2l0Y2ggKGluaXRfbWVzc2FnZS5tc2dfY2FzZSgpKSB7CiAgICAgICAgIGNhc2UgSW5pdE1lc3NhZ2U6OmtMb2FkUGVyc2lzdGVudFByb3BlcnRpZXM6IHsKICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVfcHJvcGVydGllcygpOwotICAgICAgICAgICAgLy8gUmVhZCBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYWZ0ZXIgYWxsIGRlZmF1bHQgdmFsdWVzIGhhdmUgYmVlbiBsb2FkZWQuCisKICAgICAgICAgICAgIGF1dG8gcGVyc2lzdGVudF9wcm9wZXJ0aWVzID0gTG9hZFBlcnNpc3RlbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBlcnNpc3RlbnRfcHJvcGVydHlfcmVjb3JkIDogcGVyc2lzdGVudF9wcm9wZXJ0aWVzLnByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgICAgIEluaXRQcm9wZXJ0eVNldChwZXJzaXN0ZW50X3Byb3BlcnR5X3JlY29yZC5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRfcHJvcGVydHlfcmVjb3JkLnZhbHVlKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9wZXJ0eV9yZWNvcmQgOiBwZXJzaXN0ZW50X3Byb3BlcnRpZXMucHJvcGVydGllcygpKSB7CisgICAgICAgICAgICAgICAgYXV0byBjb25zdCYgcHJvcF9uYW1lID0gcHJvcGVydHlfcmVjb3JkLm5hbWUoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnN0JiBwcm9wX3ZhbHVlID0gcHJvcGVydHlfcmVjb3JkLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgSW5pdFByb3BlcnR5U2V0KHByb3BfbmFtZSwgcHJvcF92YWx1ZSk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIEFwcGx5IGRlYnVnIHJhbWRpc2sgc3BlY2lhbCBzZXR0aW5ncyBhZnRlciBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIGxvYWRlZC4KICAgICAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLmZvcmNlLmRlYnVnZ2FibGUiLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICAvLyBBbHdheXMgZW5hYmxlIHVzYiBhZGIgaWYgZGV2aWNlIGlzIGJvb3RlZCB3aXRoIGRlYnVnIHJhbWRpc2suCkBAIC0xNDI1LDIxICsxNDMxLDE5IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBQcm9wZXJ0eVNlcnZpY2VUaHJlYWQoaW50IGZkLCBib29sIGxpc3Rlbl9pbml0KSB7CitzdGF0aWMgdm9pZCBQcm9wZXJ0eVNlcnZpY2VUaHJlYWQoKSB7CiAgICAgRXBvbGwgZXBvbGw7CiAgICAgaWYgKGF1dG8gcmVzdWx0ID0gZXBvbGwuT3BlbigpOyAhcmVzdWx0Lm9rKCkpIHsKICAgICAgICAgTE9HKEZBVEFMKSA8PCByZXN1bHQuZXJyb3IoKTsKICAgICB9CiAKLSAgICBpZiAoYXV0byByZXN1bHQgPSBlcG9sbC5SZWdpc3RlckhhbmRsZXIoZmQsIHN0ZDo6YmluZChoYW5kbGVfcHJvcGVydHlfc2V0X2ZkLCBmZCkpOworICAgIGlmIChhdXRvIHJlc3VsdCA9IGVwb2xsLlJlZ2lzdGVySGFuZGxlcihwcm9wZXJ0eV9zZXRfZmQsIGhhbmRsZV9wcm9wZXJ0eV9zZXRfZmQpOwogICAgICAgICAhcmVzdWx0Lm9rKCkpIHsKICAgICAgICAgTE9HKEZBVEFMKSA8PCByZXN1bHQuZXJyb3IoKTsKICAgICB9CiAKLSAgICBpZiAobGlzdGVuX2luaXQpIHsKLSAgICAgICAgaWYgKGF1dG8gcmVzdWx0ID0gZXBvbGwuUmVnaXN0ZXJIYW5kbGVyKGluaXRfc29ja2V0LCBIYW5kbGVJbml0U29ja2V0KTsgIXJlc3VsdC5vaygpKSB7Ci0gICAgICAgICAgICBMT0coRkFUQUwpIDw8IHJlc3VsdC5lcnJvcigpOwotICAgICAgICB9CisgICAgaWYgKGF1dG8gcmVzdWx0ID0gZXBvbGwuUmVnaXN0ZXJIYW5kbGVyKGluaXRfc29ja2V0LCBIYW5kbGVJbml0U29ja2V0KTsgIXJlc3VsdC5vaygpKSB7CisgICAgICAgIExPRyhGQVRBTCkgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgfQogCiAgICAgd2hpbGUgKHRydWUpIHsKQEAgLTE0NzEsOCArMTQ3NSw2IEBACiAgICAgICAgICAgICB3b3JrXy5wb3BfZnJvbnQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigxcyk7Ci0KICAgICAgICAgLy8gUGVyZm9ybSB3cml0ZS9mc3luYyBvdXRzaWRlIHRoZSBsb2NrLgogICAgICAgICBXcml0ZVBlcnNpc3RlbnRQcm9wZXJ0eShzdGQ6OmdldDwwPihpdGVtKSwgc3RkOjpnZXQ8MT4oaXRlbSkpOwogICAgICAgICBOb3RpZnlQcm9wZXJ0eUNoYW5nZShzdGQ6OmdldDwwPihpdGVtKSwgc3RkOjpnZXQ8MT4oaXRlbSkpOwpAQCAtMTQ5MCwyMyArMTQ5Miw2IEBACiAgICAgY3ZfLm5vdGlmeV9hbGwoKTsKIH0KIAotdm9pZCBTdGFydFRocmVhZChjb25zdCBjaGFyKiBuYW1lLCBpbnQgbW9kZSwgaW50IGdpZCwgc3RkOjp0aHJlYWQmIHQsIGJvb2wgbGlzdGVuX2luaXQpIHsKLSAgICBpbnQgZmQgPSAtMTsKLSAgICBpZiAoYXV0byByZXN1bHQgPSBDcmVhdGVTb2NrZXQobmFtZSwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMgfCBTT0NLX05PTkJMT0NLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBhc3NjcmVkPSovZmFsc2UsIC8qc2hvdWxkX2xpc3Rlbj0qL2ZhbHNlLCBtb2RlLCAvKnVpZD0qLzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZ2lkPSovZ2lkLCAvKnNvY2tldGNvbj0qL3t9KTsKLSAgICAgICAgcmVzdWx0Lm9rKCkpIHsKLSAgICAgICAgZmQgPSAqcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgInN0YXJ0X3Byb3BlcnR5X3NlcnZpY2Ugc29ja2V0IGNyZWF0aW9uIGZhaWxlZDogIiA8PCByZXN1bHQuZXJyb3IoKTsKLSAgICB9Ci0KLSAgICBsaXN0ZW4oZmQsIDgpOwotCi0gICAgYXV0byBuZXdfdGhyZWFkID0gc3RkOjp0aHJlYWQoUHJvcGVydHlTZXJ2aWNlVGhyZWFkLCBmZCwgbGlzdGVuX2luaXQpOwotICAgIHQuc3dhcChuZXdfdGhyZWFkKTsKLX0KLQogdm9pZCBTdGFydFByb3BlcnR5U2VydmljZShpbnQqIGVwb2xsX3NvY2tldCkgewogICAgIEluaXRQcm9wZXJ0eVNldCgicm8ucHJvcGVydHlfc2VydmljZS52ZXJzaW9uIiwgIjIiKTsKIApAQCAtMTUxOCw5ICsxNTAzLDE5IEBACiAgICAgaW5pdF9zb2NrZXQgPSBzb2NrZXRzWzFdOwogICAgIFN0YXJ0U2VuZGluZ01lc3NhZ2VzKCk7CiAKLSAgICBTdGFydFRocmVhZChQUk9QX1NFUlZJQ0VfRk9SX1NZU1RFTV9OQU1FLCAwNjYwLCBBSURfU1lTVEVNLCBwcm9wZXJ0eV9zZXJ2aWNlX2Zvcl9zeXN0ZW1fdGhyZWFkLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgIFN0YXJ0VGhyZWFkKFBST1BfU0VSVklDRV9OQU1FLCAwNjY2LCAwLCBwcm9wZXJ0eV9zZXJ2aWNlX3RocmVhZCwgZmFsc2UpOworICAgIGlmIChhdXRvIHJlc3VsdCA9IENyZWF0ZVNvY2tldChQUk9QX1NFUlZJQ0VfTkFNRSwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMgfCBTT0NLX05PTkJMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBhc3NjcmVkPSovZmFsc2UsIC8qc2hvdWxkX2xpc3Rlbj0qL2ZhbHNlLCAwNjY2LCAvKnVpZD0qLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZ2lkPSovMCwgLypzb2NrZXRjb249Ki97fSk7CisgICAgICAgIHJlc3VsdC5vaygpKSB7CisgICAgICAgIHByb3BlcnR5X3NldF9mZCA9ICpyZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEZBVEFMKSA8PCAic3RhcnRfcHJvcGVydHlfc2VydmljZSBzb2NrZXQgY3JlYXRpb24gZmFpbGVkOiAiIDw8IHJlc3VsdC5lcnJvcigpOworICAgIH0KKworICAgIGxpc3Rlbihwcm9wZXJ0eV9zZXRfZmQsIDgpOworCisgICAgYXV0byBuZXdfdGhyZWFkID0gc3RkOjp0aHJlYWR7UHJvcGVydHlTZXJ2aWNlVGhyZWFkfTsKKyAgICBwcm9wZXJ0eV9zZXJ2aWNlX3RocmVhZC5zd2FwKG5ld190aHJlYWQpOwogCiAgICAgYXV0byBhc3luY19wZXJzaXN0X3dyaXRlcyA9CiAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnByb3BlcnR5X3NlcnZpY2UuYXN5bmNfcGVyc2lzdF93cml0ZXMiLCBmYWxzZSk7CmRpZmYgLS1naXQgYS9pbml0L3JlYm9vdC5jcHAgYi9pbml0L3JlYm9vdC5jcHAKaW5kZXggMjdhNzg3Ni4uMWEyNmM0ZCAxMDA2NDQKLS0tIGEvaW5pdC9yZWJvb3QuY3BwCisrKyBiL2luaXQvcmVib290LmNwcApAQCAtNTYzLDcgKzU2Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHRpbWVvdXQgPiAwbXMpIHsKLSAgICAgICAgV2FpdFRvQmVSZWFwZWQocGlkcywgdGltZW91dCk7CisgICAgICAgIFdhaXRUb0JlUmVhcGVkKFNlcnZpY2U6OkdldFNpZ2NobGRGZCgpLCBwaWRzLCB0aW1lb3V0KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBFdmVuIGlmIHdlIGRvbid0IHRvIHdhaXQgZm9yIHNlcnZpY2VzIHRvIHN0b3AsIHdlIHN0aWxsIG9wdGltaXN0aWNhbGx5IHJlYXAgem9tYmllcy4KICAgICAgICAgUmVhcEFueU91dHN0YW5kaW5nQ2hpbGRyZW4oKTsKQEAgLTY4MCw4ICs2ODAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzLT5TZXRTaHV0ZG93bkNyaXRpY2FsKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG9fc2h1dGRvd25fYW5pbWF0aW9uKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChkb19zaHV0ZG93bl9hbmltYXRpb24gJiYgcy0+Y2xhc3NuYW1lcygpLmNvdW50KCJhbmltYXRpb24iKSA+IDApIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdGhlc2UgZm9yIHNodXRkb3duIGFuaW1hdGlvbnMuCiAgICAgICAgIH0gZWxzZSBpZiAocy0+SXNTaHV0ZG93bkNyaXRpY2FsKCkpIHsKICAgICAgICAgICAgIC8vIFN0YXJ0IHNodXRkb3duIGNyaXRpY2FsIHNlcnZpY2UgaWYgbm90IHN0YXJ0ZWQuCiAgICAgICAgICAgICBpZiAoYXV0byByZXN1bHQgPSBzLT5TdGFydCgpOyAhcmVzdWx0Lm9rKCkpIHsKZGlmZiAtLWdpdCBhL2luaXQvcmVib290X3V0aWxzLmNwcCBiL2luaXQvcmVib290X3V0aWxzLmNwcAppbmRleCBlNmI4NjhlLi41NDdiMTg2IDEwMDY0NAotLS0gYS9pbml0L3JlYm9vdF91dGlscy5jcHAKKysrIGIvaW5pdC9yZWJvb3RfdXRpbHMuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGN1dGlscy9hbmRyb2lkX3JlYm9vdC5oPgorI2luY2x1ZGUgPGZzX21nci5oPgogI2luY2x1ZGUgPHVud2luZHN0YWNrL0FuZHJvaWRVbndpbmRlci5oPgogCiAjaW5jbHVkZSAiY2FwYWJpbGl0aWVzLmgiCkBAIC00OCwxMyArNDksOSBAQAogCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcga0luaXRGYXRhbFBhbmljUGFyYW1TdHJpbmcgPSAiYW5kcm9pZGJvb3QuaW5pdF9mYXRhbF9wYW5pYyI7CiAgICAgaWYgKGNtZGxpbmUuZmluZChrSW5pdEZhdGFsUGFuaWNQYXJhbVN0cmluZykgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgaW5pdF9mYXRhbF9wYW5pYyA9IGZhbHNlOwotICAgICAgICBJbXBvcnRCb290Y29uZmlnKAotICAgICAgICAgICAgICAgIFtrSW5pdEZhdGFsUGFuaWNQYXJhbVN0cmluZ10oY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0ga0luaXRGYXRhbFBhbmljUGFyYW1TdHJpbmcgJiYgdmFsdWUgPT0gInRydWUiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbml0X2ZhdGFsX3BhbmljID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOworICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICAgICAgaW5pdF9mYXRhbF9wYW5pYyA9IChhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3Rjb25maWcoa0luaXRGYXRhbFBhbmljUGFyYW1TdHJpbmcsICZ2YWx1ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9PSAidHJ1ZSIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtJbml0RmF0YWxQYW5pY1N0cmluZyA9IGtJbml0RmF0YWxQYW5pY1BhcmFtU3RyaW5nICsgIj10cnVlIjsKICAgICAgICAgaW5pdF9mYXRhbF9wYW5pYyA9IGNtZGxpbmUuZmluZChrSW5pdEZhdGFsUGFuaWNTdHJpbmcpICE9IHN0ZDo6c3RyaW5nOjpucG9zOwpAQCAtNjgsMTEgKzY1LDcgQEAKICAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVib290VGFyZ2V0U3RyaW5nID0gImFuZHJvaWRib290LmluaXRfZmF0YWxfcmVib290X3RhcmdldCI7CiAgICAgYXV0byBzdGFydF9wb3MgPSBjbWRsaW5lLmZpbmQoa1JlYm9vdFRhcmdldFN0cmluZyk7CiAgICAgaWYgKHN0YXJ0X3BvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBJbXBvcnRCb290Y29uZmlnKFtrUmVib290VGFyZ2V0U3RyaW5nXShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0ga1JlYm9vdFRhcmdldFN0cmluZykgewotICAgICAgICAgICAgICAgIGluaXRfZmF0YWxfcmVib290X3RhcmdldCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgYW5kcm9pZDo6ZnNfbWdyOjpHZXRCb290Y29uZmlnKGtSZWJvb3RUYXJnZXRTdHJpbmcsICZpbml0X2ZhdGFsX3JlYm9vdF90YXJnZXQpOwogICAgICAgICAvLyBXZSBhbHJlYWR5IGRlZmF1bHQgdG8gYm9vdGxvYWRlciBpZiBubyBzZXR0aW5nIGlzIHByb3ZpZGVkLgogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZWJvb3RUYXJnZXRTdHJpbmdQYXR0ZXJuID0ga1JlYm9vdFRhcmdldFN0cmluZyArICI9IjsKZGlmZiAtLWdpdCBhL2luaXQvcmxpbWl0X3BhcnNlci5jcHAgYi9pbml0L3JsaW1pdF9wYXJzZXIuY3BwCmluZGV4IDQ3NmE0NmEuLmMyYTNmYTEgMTAwNjQ0Ci0tLSBhL2luaXQvcmxpbWl0X3BhcnNlci5jcHAKKysrIGIvaW5pdC9ybGltaXRfcGFyc2VyLmNwcApAQCAtMzAsMTAgKzMwLDE0IEBACiAvLyBCdWlsdGlucyBhbmQgc2VydmljZSBkZWZpbml0aW9ucyBib3RoIGhhdmUgdGhlaXIgYXJndW1lbnRzIHN0YXJ0IGF0IDEgYW5kIGZpbmlzaCBhdCAzLgogUmVzdWx0PHN0ZDo6cGFpcjxpbnQsIHJsaW1pdD4+IFBhcnNlUmxpbWl0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewogICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciosIGludD4+IHRleHRfdG9fcmVzb3VyY2VzID0gewotICAgICAgICB7ImNwdSIsIDB9LCAgICAgICB7ImZzaXplIiwgMX0sIHsiZGF0YSIsIDJ9LCAgICB7InN0YWNrIiwgM30sCi0gICAgICAgIHsiY29yZSIsIDR9LCAgICAgIHsicnNzIiwgNX0sICAgeyJucHJvYyIsIDZ9LCAgIHsibm9maWxlIiwgN30sCi0gICAgICAgIHsibWVtbG9jayIsIDh9LCAgIHsiYXMiLCA5fSwgICAgeyJsb2NrcyIsIDEwfSwgIHsic2lncGVuZGluZyIsIDExfSwKLSAgICAgICAgeyJtc2dxdWV1ZSIsIDEyfSwgeyJuaWNlIiwgMTN9LCB7InJ0cHJpbyIsIDE0fSwgeyJydHRpbWUiLCAxNX0sCisgICAgICAgICAgICB7ImNwdSIsIFJMSU1JVF9DUFV9LCAgICAgICAgICAgeyJmc2l6ZSIsIFJMSU1JVF9GU0laRX0sCisgICAgICAgICAgICB7ImRhdGEiLCBSTElNSVRfREFUQX0sICAgICAgICAgeyJzdGFjayIsIFJMSU1JVF9TVEFDS30sCisgICAgICAgICAgICB7ImNvcmUiLCBSTElNSVRfQ09SRX0sICAgICAgICAgeyJyc3MiLCBSTElNSVRfUlNTfSwKKyAgICAgICAgICAgIHsibnByb2MiLCBSTElNSVRfTlBST0N9LCAgICAgICB7Im5vZmlsZSIsIFJMSU1JVF9OT0ZJTEV9LAorICAgICAgICAgICAgeyJtZW1sb2NrIiwgUkxJTUlUX01FTUxPQ0t9LCAgIHsiYXMiLCBSTElNSVRfQVN9LAorICAgICAgICAgICAgeyJsb2NrcyIsIFJMSU1JVF9MT0NLU30sICAgICAgIHsic2lncGVuZGluZyIsIFJMSU1JVF9TSUdQRU5ESU5HfSwKKyAgICAgICAgICAgIHsibXNncXVldWUiLCBSTElNSVRfTVNHUVVFVUV9LCB7Im5pY2UiLCBSTElNSVRfTklDRX0sCisgICAgICAgICAgICB7InJ0cHJpbyIsIFJMSU1JVF9SVFBSSU99LCAgICAgeyJydHRpbWUiLCBSTElNSVRfUlRUSU1FfSwKICAgICB9OwogCiAgICAgaW50IHJlc291cmNlOwpAQCAtNDksNiArNTMsOCBAQAogICAgICAgICBzdGQ6OnN0cmluZyByZXNvdXJjZV9zdHJpbmc7CiAgICAgICAgIGlmIChTdGFydHNXaXRoKGFyZ3NbMV0sICJSTElNXyIpKSB7CiAgICAgICAgICAgICByZXNvdXJjZV9zdHJpbmcgPSBhcmdzWzFdLnN1YnN0cig1KTsKKyAgICAgICAgfSBlbHNlIGlmIChTdGFydHNXaXRoKGFyZ3NbMV0sICJSTElNSVRfIikpIHsKKyAgICAgICAgICAgIHJlc291cmNlX3N0cmluZyA9IGFyZ3NbMV0uc3Vic3RyKDcpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzb3VyY2Vfc3RyaW5nID0gYXJnc1sxXTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaW5pdC9ybGltaXRfcGFyc2VyX3Rlc3QuY3BwIGIvaW5pdC9ybGltaXRfcGFyc2VyX3Rlc3QuY3BwCmluZGV4IDNjM2Y4NDguLmE2OTU1ZjYgMTAwNjQ0Ci0tLSBhL2luaXQvcmxpbWl0X3BhcnNlcl90ZXN0LmNwcAorKysgYi9pbml0L3JsaW1pdF9wYXJzZXJfdGVzdC5jcHAKQEAgLTY3LDYgKzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAge3sicnRwcmlvIiwgIjEwIiwgIjEwIn0sIHsxNCwgezEwLCAxMH19fSwKICAgICAgICAgICAgICAgICAgICAge3sicnR0aW1lIiwgIjEwIiwgIjEwIn0sIHsxNSwgezEwLCAxMH19fSwKIAorICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc29tZSByZWFzb24sIHdlIHNwZWxsZWQgdGhlc2Ugd3JvbmcuCiAgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1fQ1BVIiwgIjEwIiwgIjEwIn0sIHswLCB7MTAsIDEwfX19LAogICAgICAgICAgICAgICAgICAgICB7eyJSTElNX0ZTSVpFIiwgIjEwIiwgIjEwIn0sIHsxLCB7MTAsIDEwfX19LAogICAgICAgICAgICAgICAgICAgICB7eyJSTElNX0RBVEEiLCAiMTAiLCAiMTAifSwgezIsIHsxMCwgMTB9fX0sCkBAIC04NCw2ICs4NSwyNCBAQAogICAgICAgICAgICAgICAgICAgICB7eyJSTElNX1JUUFJJTyIsICIxMCIsICIxMCJ9LCB7MTQsIHsxMCwgMTB9fX0sCiAgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1fUlRUSU1FIiwgIjEwIiwgIjEwIn0sIHsxNSwgezEwLCAxMH19fSwKIAorICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIGNvcnJlY3Qgc3BlbGxpbmdzLgorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfQ1BVIiwgIjEwIiwgIjEwIn0sIHswLCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfRlNJWkUiLCAiMTAiLCAiMTAifSwgezEsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9EQVRBIiwgIjEwIiwgIjEwIn0sIHsyLCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfU1RBQ0siLCAiMTAiLCAiMTAifSwgezMsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9DT1JFIiwgIjEwIiwgIjEwIn0sIHs0LCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfUlNTIiwgIjEwIiwgIjEwIn0sIHs1LCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfTlBST0MiLCAiMTAiLCAiMTAifSwgezYsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9OT0ZJTEUiLCAiMTAiLCAiMTAifSwgezcsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9NRU1MT0NLIiwgIjEwIiwgIjEwIn0sIHs4LCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfQVMiLCAiMTAiLCAiMTAifSwgezksIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9MT0NLUyIsICIxMCIsICIxMCJ9LCB7MTAsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9TSUdQRU5ESU5HIiwgIjEwIiwgIjEwIn0sIHsxMSwgezEwLCAxMH19fSwKKyAgICAgICAgICAgICAgICAgICAge3siUkxJTUlUX01TR1FVRVVFIiwgIjEwIiwgIjEwIn0sIHsxMiwgezEwLCAxMH19fSwKKyAgICAgICAgICAgICAgICAgICAge3siUkxJTUlUX05JQ0UiLCAiMTAiLCAiMTAifSwgezEzLCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfUlRQUklPIiwgIjEwIiwgIjEwIn0sIHsxNCwgezEwLCAxMH19fSwKKyAgICAgICAgICAgICAgICAgICAge3siUkxJTUlUX1JUVElNRSIsICIxMCIsICIxMCJ9LCB7MTUsIHsxMCwgMTB9fX0sCisKICAgICAgICAgICAgICAgICAgICAge3siMCIsICIxMCIsICIxMCJ9LCB7MCwgezEwLCAxMH19fSwKICAgICAgICAgICAgICAgICAgICAge3siMSIsICIxMCIsICIxMCJ9LCB7MSwgezEwLCAxMH19fSwKICAgICAgICAgICAgICAgICAgICAge3siMiIsICIxMCIsICIxMCJ9LCB7MiwgezEwLCAxMH19fSwKQEAgLTExMyw2ICsxMzIsNyBAQAogICAgICAgICAgICAge3siMTAwIiwgIjEwIiwgIjEwIn0sICJSZXNvdXJjZSAnMTAwJyBvdmVyIHRoZSBtYXhpbXVtIHJlc291cmNlIHZhbHVlICcxNicifSwKICAgICAgICAgICAgIHt7ImJhZF9zdHJpbmciLCAiMTAiLCAiMTAifSwgIkNvdWxkIG5vdCBwYXJzZSByZXNvdXJjZSAnYmFkX3N0cmluZycifSwKICAgICAgICAgICAgIHt7IlJMSU1fIiwgIjEwIiwgIjEwIn0sICJDb3VsZCBub3QgcGFyc2UgcmVzb3VyY2UgJ1JMSU1fJyJ9LAorICAgICAgICAgICAge3siUkxJTUlUXyIsICIxMCIsICIxMCJ9LCAiQ291bGQgbm90IHBhcnNlIHJlc291cmNlICdSTElNSVRfJyJ9LAogICAgICAgICAgICAge3siY3B1IiwgImFiYyIsICIxMCJ9LCAiQ291bGQgbm90IHBhcnNlIHNvZnQgbGltaXQgJ2FiYycifSwKICAgICAgICAgICAgIHt7ImNwdSIsICIxMCIsICJhYmMifSwgIkNvdWxkIG5vdCBwYXJzZSBoYXJkIGxpbWl0ICdhYmMnIn0sCiAgICAgICAgICAgICB7eyJjcHUiLCAidW5saW1pdCIsICIxMCJ9LCAiQ291bGQgbm90IHBhcnNlIHNvZnQgbGltaXQgJ3VubGltaXQnIn0sCmRpZmYgLS1naXQgYS9pbml0L3NlY3VyaXR5LmNwcCBiL2luaXQvc2VjdXJpdHkuY3BwCmluZGV4IDZlNjE2YmUuLjNlMTU0NDcgMTAwNjQ0Ci0tLSBhL2luaXQvc2VjdXJpdHkuY3BwCisrKyBiL2luaXQvc2VjdXJpdHkuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KQEAgLTEwNiwyNyArMTA3LDI3IEBACiAgICAgLy8gdW1sIGRvZXMgbm90IHN1cHBvcnQgbW1hcF9ybmRfYml0cwogICAgIHJldHVybiB7fTsKICNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCi0gICAgLy8gYXJtNjQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIDE4IC0gMzMgcm5kIGJpdHMgZGVwZW5kaW5nIG9uIHBhZ2VzaXplIGFuZAotICAgIC8vIFZBX1NJWkUuIEhvd2V2ZXIgdGhlIGtlcm5lbCBtaWdodCBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCBhIG5hcnJvd2VyCi0gICAgLy8gcmFuZ2UgdXNpbmcgQ09ORklHX0FSQ0hfTU1BUF9STkRfQklUU19NSU4vTUFYLiBUbyB1c2UgdGhlIG1heGltdW0KLSAgICAvLyBzdXBwb3J0ZWQgbnVtYmVyIG9mIGJpdHMsIHdlIHN0YXJ0IGZyb20gdGhlIHRoZW9yZXRpY2FsIG1heGltdW0gb2YgMzMKLSAgICAvLyBiaXRzIGFuZCB0cnkgc21hbGxlciB2YWx1ZXMgdW50aWwgd2UgcmVhY2ggMjQgYml0cyB3aGljaCBpcyB0aGUKLSAgICAvLyBBbmRyb2lkLXNwZWNpZmljIG1pbmltdW0uIERvbid0IGdvIGxvd2VyIGV2ZW4gaWYgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bQotICAgIC8vIGlzIHNtYWxsZXIgdGhhbiAyNC4KKyAgICAvLyBhcm02NCBzdXBwb3J0cyAxNCAtIDMzIHJuZCBiaXRzIGRlcGVuZGluZyBvbiBwYWdlIHNpemUgYW5kIEFSTTY0X1ZBX0JJVFMuCisgICAgLy8gVGhlIGtlcm5lbCAoNi41KSBzdGlsbCBkZWZhdWx0cyB0byAzOSB2YSBiaXRzIGZvciA0S2lCIHBhZ2VzLCBzbyBzaGlwcGluZworICAgIC8vIGRldmljZXMgYXJlIG9ubHkgZ2V0dGluZyAyNCBiaXRzIG9mIHJhbmRvbW5lc3MgaW4gcHJhY3RpY2UuCiAgICAgaWYgKFNldE1tYXBSbmRCaXRzTWluKDMzLCAyNCwgZmFsc2UpICYmICghSGFzMzJCaXRBYmkoKSB8fCBTZXRNbWFwUm5kQml0c01pbigxNiwgMTYsIHRydWUpKSkgewogICAgICAgICByZXR1cm4ge307CiAgICAgfQogI2VsaWYgZGVmaW5lZChfX3Jpc2N2KQotICAgIC8vIFRPRE86IHN2NDggYW5kIHN2NTcgd2VyZSBib3RoIGFkZGVkIHRvIHRoZSBrZXJuZWwgdGhpcyB5ZWFyLCBzbyB3ZQotICAgIC8vIHByb2JhYmx5IGp1c3QgbmVlZCBzb21lIGtlcm5lbCBmaXhlcyB0byBlbmFibGUgaGlnaGVyIEFTTFIgcmFuZG9taXphdGlvbiwKLSAgICAvLyBidXQgZm9yIG5vdyAyNCBpcyB0aGUgbWF4aW11bSB0aGF0IHRoZSBrZXJuZWwgc3VwcG9ydHMuCi0gICAgaWYgKFNldE1tYXBSbmRCaXRzTWluKDI0LCAxOCwgZmFsc2UpKSB7CisgICAgLy8gVE9ETzogc3Y0OCBhbmQgc3Y1NyBoYXZlIGJvdGggYmVlbiBhZGRlZCB0byB0aGUga2VybmVsLCBidXQgdGhlIGtlcm5lbAorICAgIC8vIHN0aWxsIGRvZXNuJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gMjQgYml0cy4KKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2FuZHJvaWQtcmlzY3Y2NC9pc3N1ZXMvMQorICAgIGlmIChTZXRNbWFwUm5kQml0c01pbigyNCwgMjQsIGZhbHNlKSkgewogICAgICAgICByZXR1cm4ge307CiAgICAgfQogI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQogICAgIC8vIHg4Nl82NCBzdXBwb3J0cyAyOCAtIDMyIHJuZCBiaXRzLCBidXQgQW5kcm9pZCB3YW50cyB0byBlbnN1cmUgdGhhdCB0aGUKLSAgICAvLyB0aGVvcmV0aWNhbCBtYXhpbXVtIG9mIDMyIGJpdHMgaXMgYWx3YXlzIHN1cHBvcnRlZCBhbmQgdXNlZC4KLSAgICBpZiAoU2V0TW1hcFJuZEJpdHNNaW4oMzIsIDMyLCBmYWxzZSkgJiYgKCFIYXMzMkJpdEFiaSgpIHx8IFNldE1tYXBSbmRCaXRzTWluKDE2LCAxNiwgdHJ1ZSkpKSB7CisgICAgLy8gdGhlb3JldGljYWwgbWF4aW11bSBvZiAzMiBiaXRzIGlzIGFsd2F5cyBzdXBwb3J0ZWQgYW5kIHVzZWQ7IGV4Y2VwdCBpbgorICAgIC8vIHRoZSBjYXNlIG9mIHRoZSB4ODYgcGFnZSBzaXplIGVtdWxhdG9yIHdoaWNoIHN1cHBvcnRzIGEgbWF4aW11bQorICAgIC8vIG9mIDMwIGJpdHMgZm9yIDE2ayBwYWdlIHNpemUsIG9yIDI4IGJpdHMgZm9yIDY0ayBwYWdlIHNpemUuCisgICAgaW50IG1heF9iaXRzID0gMzIgLSAoc3RhdGljX2Nhc3Q8aW50Pihsb2cyKGdldHBhZ2VzaXplKCkpKSAtIDEyKTsKKyAgICBpZiAoU2V0TW1hcFJuZEJpdHNNaW4obWF4X2JpdHMsIG1heF9iaXRzLCBmYWxzZSkgJiYKKyAgICAgICAgKCFIYXMzMkJpdEFiaSgpIHx8IFNldE1tYXBSbmRCaXRzTWluKDE2LCAxNiwgdHJ1ZSkpKSB7CiAgICAgICAgIHJldHVybiB7fTsKICAgICB9CiAjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19pMzg2X18pCmRpZmYgLS1naXQgYS9pbml0L3NlbGludXguY3BwIGIvaW5pdC9zZWxpbnV4LmNwcAppbmRleCA5MDdlYjgwLi4xZjIxMWRkIDEwMDY0NAotLS0gYS9pbml0L3NlbGludXguY3BwCisrKyBiL2luaXQvc2VsaW51eC5jcHAKQEAgLTI2LDI5ICsyNiwyNiBAQAogLy8gVGhlIG1vbm9saXRoaWMgcG9saWN5IHZhcmlhbnQgaXMgZm9yIGxlZ2FjeSBub24tdHJlYmxlIGRldmljZXMgdGhhdCBjb250YWluIGEgc2luZ2xlIFNFUG9saWN5CiAvLyBmaWxlIGxvY2F0ZWQgYXQgL3NlcG9saWN5IGFuZCBpcyBkaXJlY3RseSBsb2FkZWQgaW50byB0aGUga2VybmVsIFNFTGludXggc3Vic3lzdGVtLgogCi0vLyBUaGUgc3BsaXQgcG9saWN5IGlzIGZvciBzdXBwb3J0aW5nIHRyZWJsZSBkZXZpY2VzIGFuZCB1cGRhdGVhYmxlIGFwZXhlcy4gIEl0IHNwbGl0cyB0aGUgU0VQb2xpY3kKLS8vIGFjcm9zcyBmaWxlcyBvbiAvc3lzdGVtL2V0Yy9zZWxpbnV4ICh0aGUgJ3BsYXQnIHBvcnRpb24gb2YgdGhlIHBvbGljeSksIC92ZW5kb3IvZXRjL3NlbGludXgKLS8vICh0aGUgJ3ZlbmRvcicgcG9ydGlvbiBvZiB0aGUgcG9saWN5KSwgL3N5c3RlbV9leHQvZXRjL3NlbGludXgsIC9wcm9kdWN0L2V0Yy9zZWxpbnV4LAotLy8gL29kbS9ldGMvc2VsaW51eCwgYW5kIC9kZXYvc2VsaW51eCAodGhlIGFwZXggcG9ydGlvbiBvZiBwb2xpY3kpLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cKLS8vIGltYWdlcyB0byBiZSB1cGRhdGVkIGluZGVwZW5kZW50bHkgb2YgdGhlIHZlbmRvciBpbWFnZSwgd2hpbGUgbWFpbnRhaW5pbmcgY29udHJpYnV0aW9ucyBmcm9tCi0vLyBtdWx0aXBsZSBwYXJ0aXRpb25zIGluIHRoZSBTRVBvbGljeS4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIFZUUyB0ZXN0aW5nLCB3aGVyZSB0aGUKLS8vIFNFUG9saWN5IG9uIHRoZSBHb29nbGUgU3lzdGVtIEltYWdlIG1heSBub3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBzeXN0ZW0gaW1hZ2Ugc2hpcHBlZCBvbiBhCi0vLyB2ZW5kb3IncyBkZXZpY2UuCisvLyBUaGUgc3BsaXQgcG9saWN5IGlzIGZvciBzdXBwb3J0aW5nIHRyZWJsZSBkZXZpY2VzLiAgSXQgc3BsaXRzIHRoZSBTRVBvbGljeSBhY3Jvc3MgZmlsZXMgb24KKy8vIC9zeXN0ZW0vZXRjL3NlbGludXggKHRoZSAncGxhdCcgcG9ydGlvbiBvZiB0aGUgcG9saWN5KSBhbmQgL3ZlbmRvci9ldGMvc2VsaW51eCAodGhlICd2ZW5kb3InCisvLyBwb3J0aW9uIG9mIHRoZSBwb2xpY3kpLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgdGhlIHN5c3RlbSBpbWFnZSB0byBiZSB1cGRhdGVkIGluZGVwZW5kZW50bHkKKy8vIG9mIHRoZSB2ZW5kb3IgaW1hZ2UsIHdoaWxlIG1haW50YWluaW5nIGNvbnRyaWJ1dGlvbnMgZnJvbSBib3RoIHBhcnRpdGlvbnMgaW4gdGhlIFNFUG9saWN5LiAgVGhpcworLy8gaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIFZUUyB0ZXN0aW5nLCB3aGVyZSB0aGUgU0VQb2xpY3kgb24gdGhlIEdvb2dsZSBTeXN0ZW0gSW1hZ2UgbWF5IG5vdCBiZQorLy8gaWRlbnRpY2FsIHRvIHRoZSBzeXN0ZW0gaW1hZ2Ugc2hpcHBlZCBvbiBhIHZlbmRvcidzIGRldmljZS4KIAogLy8gVGhlIHNwbGl0IFNFUG9saWN5IGlzIGxvYWRlZCBhcyBkZXNjcmliZWQgYmVsb3c6CiAvLyAxKSBUaGVyZSBpcyBhIHByZWNvbXBpbGVkIFNFUG9saWN5IGxvY2F0ZWQgYXQgZWl0aGVyIC92ZW5kb3IvZXRjL3NlbGludXgvcHJlY29tcGlsZWRfc2Vwb2xpY3kgb3IKIC8vICAgIC9vZG0vZXRjL3NlbGludXgvcHJlY29tcGlsZWRfc2Vwb2xpY3kgaWYgb2RtIHBhcml0aW9uIGlzIHByZXNlbnQuICBTdG9yZWQgYWxvbmcgd2l0aCB0aGlzIGZpbGUKLS8vICAgIGFyZSB0aGUgc2hhMjU2IGhhc2hlcyBvZiB0aGUgcGFydHMgb2YgdGhlIFNFUG9saWN5IG9uIC9zeXN0ZW0sIC9zeXN0ZW1fZXh0LCAvcHJvZHVjdCwgYW5kIGFwZXgKLS8vICAgIHRoYXQgd2VyZSB1c2VkIHRvIGNvbXBpbGUgdGhpcyBwcmVjb21waWxlZCBwb2xpY3kuICBUaGUgc3lzdGVtIHBhcnRpdGlvbiBjb250YWlucyBhIHNpbWlsYXIKLS8vICAgIHNoYTI1NiBvZiB0aGUgcGFydHMgb2YgdGhlIFNFUG9saWN5IHRoYXQgaXQgY3VycmVudGx5IGNvbnRhaW5zLiBTeW1tZXRyaWNhbGx5LCBzeXN0ZW1fZXh0LAotLy8gICAgcHJvZHVjdCwgYW5kIGFwZXggY29udGFpbiBzaGEyNTYgaGFzaGVzIG9mIHRoZWlyIFNFUG9saWN5LiBJbml0IGxvYWRzIHRoaXMKKy8vICAgIGFyZSB0aGUgc2hhMjU2IGhhc2hlcyBvZiB0aGUgcGFydHMgb2YgdGhlIFNFUG9saWN5IG9uIC9zeXN0ZW0sIC9zeXN0ZW1fZXh0IGFuZCAvcHJvZHVjdCB0aGF0CisvLyAgICB3ZXJlIHVzZWQgdG8gY29tcGlsZSB0aGlzIHByZWNvbXBpbGVkIHBvbGljeS4gIFRoZSBzeXN0ZW0gcGFydGl0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBzaGEyNTYKKy8vICAgIG9mIHRoZSBwYXJ0cyBvZiB0aGUgU0VQb2xpY3kgdGhhdCBpdCBjdXJyZW50bHkgY29udGFpbnMuICBTeW1tZXRyaWNhbGx5LCBzeXN0ZW1fZXh0IGFuZAorLy8gICAgcHJvZHVjdCBwYXJpdGl0aW9uIGNvbnRhaW4gc2hhMjU2IGhhc2hlcyBvZiB0aGVpciBTRVBvbGljeS4gIFRoZSBpbml0IGxvYWRzIHRoaXMKIC8vICAgIHByZWNvbXBpbGVkX3NlcG9saWN5IGRpcmVjdGx5IGlmIGFuZCBvbmx5IGlmIHRoZSBoYXNoZXMgYWxvbmcgd2l0aCB0aGUgcHJlY29tcGlsZWQgU0VQb2xpY3kgb24KLS8vICAgIC92ZW5kb3Igb3IgL29kbSBtYXRjaCB0aGUgaGFzaGVzIGZvciBzeXN0ZW0sIHN5c3RlbV9leHQsIHByb2R1Y3QsIGFuZCBhcGV4IFNFUG9saWN5LAotLy8gICAgcmVzcGVjdGl2ZWx5LgotLy8gMikgSWYgdGhlc2UgaGFzaGVzIGRvIG5vdCBtYXRjaCwgdGhlbiBlaXRoZXIgL3N5c3RlbSBvciAvc3lzdGVtX2V4dCAvcHJvZHVjdCwgb3IgYXBleCAob3Igc29tZSBvZgotLy8gICAgdGhlbSkgaGF2ZSBiZWVuIHVwZGF0ZWQgb3V0IG9mIHN5bmMgd2l0aCAvdmVuZG9yIChvciAvb2RtIGlmIGl0IGlzIHByZXNlbnQpIGFuZCB0aGUgaW5pdCBuZWVkcwotLy8gICAgdG8gY29tcGlsZSB0aGUgU0VQb2xpY3kuICAvc3lzdGVtIGNvbnRhaW5zIHRoZSBTRVBvbGljeSBjb21waWxlciwgc2VjaWxjLCBhbmQgaXQgaXMgdXNlZCBieQotLy8gICAgdGhlIE9wZW5TcGxpdFBvbGljeSgpIGZ1bmN0aW9uIGJlbG93IHRvIGNvbXBpbGUgdGhlIFNFUG9saWN5IHRvIGEgdGVtcCBkaXJlY3RvcnkgYW5kIGxvYWQgaXQuCisvLyAgICAvdmVuZG9yIG9yIC9vZG0gbWF0Y2ggdGhlIGhhc2hlcyBmb3Igc3lzdGVtLCBzeXN0ZW1fZXh0IGFuZCBwcm9kdWN0IFNFUG9saWN5LCByZXNwZWN0aXZlbHkuCisvLyAyKSBJZiB0aGVzZSBoYXNoZXMgZG8gbm90IG1hdGNoLCB0aGVuIGVpdGhlciAvc3lzdGVtIG9yIC9zeXN0ZW1fZXh0IG9yIC9wcm9kdWN0IChvciBzb21lIG9mIHRoZW0pCisvLyAgICBoYXZlIGJlZW4gdXBkYXRlZCBvdXQgb2Ygc3luYyB3aXRoIC92ZW5kb3IgKG9yIC9vZG0gaWYgaXQgaXMgcHJlc2VudCkgYW5kIHRoZSBpbml0IG5lZWRzIHRvCisvLyAgICBjb21waWxlIHRoZSBTRVBvbGljeS4gIC9zeXN0ZW0gY29udGFpbnMgdGhlIFNFUG9saWN5IGNvbXBpbGVyLCBzZWNpbGMsIGFuZCBpdCBpcyB1c2VkIGJ5IHRoZQorLy8gICAgT3BlblNwbGl0UG9saWN5KCkgZnVuY3Rpb24gYmVsb3cgdG8gY29tcGlsZSB0aGUgU0VQb2xpY3kgdG8gYSB0ZW1wIGRpcmVjdG9yeSBhbmQgbG9hZCBpdC4KIC8vICAgIFRoYXQgZnVuY3Rpb24gY29udGFpbnMgZXZlbiBtb3JlIGRvY3VtZW50YXRpb24gd2l0aCB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBob3cKIC8vICAgIHRoZSBTRVBvbGljeSBpcyBjb21waWxlZCBpZiBuZWVkZWQuCiAKQEAgLTYxLDI1ICs1OCwxOSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KIAotI2luY2x1ZGUgPENlcnRVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8ZnNfYXZiL2ZzX2F2Yi5oPgogI2luY2x1ZGUgPGZzX21nci5oPgotI2luY2x1ZGUgPGZzdmVyaXR5X2luaXQuaD4KICNpbmNsdWRlIDxsaWJnc2kvbGliZ3NpLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3QuaD4KLSNpbmNsdWRlIDxtaW5pX2tleWN0bF91dGlscy5oPgogI2luY2x1ZGUgPHNlbGludXgvYW5kcm9pZC5oPgotI2luY2x1ZGUgPHppcGFyY2hpdmUvemlwX2FyY2hpdmUuaD4KIAogI2luY2x1ZGUgImJsb2NrX2Rldl9pbml0aWFsaXplci5oIgogI2luY2x1ZGUgImRlYnVnX3JhbWRpc2suaCIKQEAgLTEwMywyMyArOTQsMTQgQEAKIGVudW0gRW5mb3JjaW5nU3RhdHVzIHsgU0VMSU5VWF9QRVJNSVNTSVZFLCBTRUxJTlVYX0VORk9SQ0lORyB9OwogCiBFbmZvcmNpbmdTdGF0dXMgU3RhdHVzRnJvbVByb3BlcnR5KCkgewotICAgIEVuZm9yY2luZ1N0YXR1cyBzdGF0dXMgPSBTRUxJTlVYX0VORk9SQ0lORzsKLQotICAgIEltcG9ydEtlcm5lbENtZGxpbmUoWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICAgICAgICBpZiAoa2V5ID09ICJhbmRyb2lkYm9vdC5zZWxpbnV4IiAmJiB2YWx1ZSA9PSAicGVybWlzc2l2ZSIpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFNFTElOVVhfUEVSTUlTU0lWRTsKLSAgICAgICAgfQotICAgIH0pOwotCi0gICAgaWYgKHN0YXR1cyA9PSBTRUxJTlVYX0VORk9SQ0lORykgewotICAgICAgICBJbXBvcnRCb290Y29uZmlnKFsmXShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gImFuZHJvaWRib290LnNlbGludXgiICYmIHZhbHVlID09ICJwZXJtaXNzaXZlIikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNFTElOVVhfUEVSTUlTU0lWRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgaWYgKGFuZHJvaWQ6OmZzX21ncjo6R2V0S2VybmVsQ21kbGluZSgiYW5kcm9pZGJvb3Quc2VsaW51eCIsICZ2YWx1ZSkgJiYgdmFsdWUgPT0gInBlcm1pc3NpdmUiKSB7CisgICAgICAgIHJldHVybiBTRUxJTlVYX1BFUk1JU1NJVkU7CiAgICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoYW5kcm9pZDo6ZnNfbWdyOjpHZXRCb290Y29uZmlnKCJhbmRyb2lkYm9vdC5zZWxpbnV4IiwgJnZhbHVlKSAmJiB2YWx1ZSA9PSAicGVybWlzc2l2ZSIpIHsKKyAgICAgICAgcmV0dXJuIFNFTElOVVhfUEVSTUlTU0lWRTsKKyAgICB9CisgICAgcmV0dXJuIFNFTElOVVhfRU5GT1JDSU5HOwogfQogCiBib29sIElzRW5mb3JjaW5nKCkgewpAQCAtMjU2LDcgKzIzOCw2IEBACiAgICAgICAgICAgICAgcHJlY29tcGlsZWRfc2Vwb2xpY3kgKyAiLnN5c3RlbV9leHRfc2Vwb2xpY3lfYW5kX21hcHBpbmcuc2hhMjU2In0sCiAgICAgICAgICAgICB7Ii9wcm9kdWN0L2V0Yy9zZWxpbnV4L3Byb2R1Y3Rfc2Vwb2xpY3lfYW5kX21hcHBpbmcuc2hhMjU2IiwKICAgICAgICAgICAgICBwcmVjb21waWxlZF9zZXBvbGljeSArICIucHJvZHVjdF9zZXBvbGljeV9hbmRfbWFwcGluZy5zaGEyNTYifSwKLSAgICAgICAgICAgIHsiL2Rldi9zZWxpbnV4L2FwZXhfc2Vwb2xpY3kuc2hhMjU2IiwgcHJlY29tcGlsZWRfc2Vwb2xpY3kgKyAiLmFwZXhfc2Vwb2xpY3kuc2hhMjU2In0sCiAgICAgfTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgW2FjdHVhbF9pZF9wYXRoLCBwcmVjb21waWxlZF9pZF9wYXRoXSA6IHNlcG9saWN5X2hhc2hlcykgewpAQCAtMzM1LDcgKzMxNiw3IEBACiAgICAgLy8gKiB2ZW5kb3IgLS0gcG9saWN5IG5lZWRlZCBkdWUgdG8gbG9naWMgY29udGFpbmVkIGluIHRoZSB2ZW5kb3IgaW1hZ2UsCiAgICAgLy8gKiBtYXBwaW5nIC0tIG1hcHBpbmcgcG9saWN5IHdoaWNoIGhlbHBzIHByZXNlcnZlIGZvcndhcmQtY29tcGF0aWJpbGl0eSBvZiBub24tcGxhdGZvcm0gcG9saWN5CiAgICAgLy8gICB3aXRoIG5ld2VyIHZlcnNpb25zIG9mIHBsYXRmb3JtIHBvbGljeS4KLSAgICAvLyAqIChvcHRpb25hbCkgcG9saWN5IG5lZWRlZCBkdWUgdG8gbG9naWMgb24gcHJvZHVjdCwgc3lzdGVtX2V4dCwgb2RtLCBvciBhcGV4LgorICAgIC8vICogKG9wdGlvbmFsKSBwb2xpY3kgbmVlZGVkIGR1ZSB0byBsb2dpYyBvbiBwcm9kdWN0LCBzeXN0ZW1fZXh0LCBvciBvZG0gaW1hZ2VzLgogICAgIC8vIHNlY2lsYyBpcyBpbnZva2VkIHRvIGNvbXBpbGUgdGhlIGFib3ZlIHRocmVlIHBvbGljeSBmaWxlcyBpbnRvIGEgc2luZ2xlIG1vbm9saXRoaWMgcG9saWN5CiAgICAgLy8gZmlsZS4gVGhpcyBmaWxlIGlzIHRoZW4gbG9hZGVkIGludG8gdGhlIGtlcm5lbC4KIApAQCAtNDMxLDEyICs0MTIsNiBAQAogICAgIGlmIChhY2Nlc3Mob2RtX3BvbGljeV9jaWxfZmlsZS5jX3N0cigpLCBGX09LKSA9PSAtMSkgewogICAgICAgICBvZG1fcG9saWN5X2NpbF9maWxlLmNsZWFyKCk7CiAgICAgfQotCi0gICAgLy8gYXBleF9zZXBvbGljeS5jaWwgaXMgZGVmYXVsdCBidXQgb3B0aW9uYWwuCi0gICAgc3RkOjpzdHJpbmcgYXBleF9wb2xpY3lfY2lsX2ZpbGUoIi9kZXYvc2VsaW51eC9hcGV4X3NlcG9saWN5LmNpbCIpOwotICAgIGlmIChhY2Nlc3MoYXBleF9wb2xpY3lfY2lsX2ZpbGUuY19zdHIoKSwgRl9PSykgPT0gLTEpIHsKLSAgICAgICAgYXBleF9wb2xpY3lfY2lsX2ZpbGUuY2xlYXIoKTsKLSAgICB9CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdmVyc2lvbl9hc19zdHJpbmcgPSBzdGQ6OnRvX3N0cmluZyhTRVBPTElDWV9WRVJTSU9OKTsKIAogICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKQEAgLTQ3OSw5ICs0NTQsNiBAQAogICAgIGlmICghb2RtX3BvbGljeV9jaWxfZmlsZS5lbXB0eSgpKSB7CiAgICAgICAgIGNvbXBpbGVfYXJncy5wdXNoX2JhY2sob2RtX3BvbGljeV9jaWxfZmlsZS5jX3N0cigpKTsKICAgICB9Ci0gICAgaWYgKCFhcGV4X3BvbGljeV9jaWxfZmlsZS5lbXB0eSgpKSB7Ci0gICAgICAgIGNvbXBpbGVfYXJncy5wdXNoX2JhY2soYXBleF9wb2xpY3lfY2lsX2ZpbGUuY19zdHIoKSk7Ci0gICAgfQogICAgIGNvbXBpbGVfYXJncy5wdXNoX2JhY2sobnVsbHB0cik7CiAKICAgICBpZiAoIUZvcmtFeGVjdmVBbmRXYWl0Rm9yQ29tcGxldGlvbihjb21waWxlX2FyZ3NbMF0sIChjaGFyKiopY29tcGlsZV9hcmdzLmRhdGEoKSkpIHsKQEAgLTQ5OCw3ICs0NzAsNyBAQAogYm9vbCBPcGVuTW9ub2xpdGhpY1BvbGljeShQb2xpY3lGaWxlKiBwb2xpY3lfZmlsZSkgewogICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrU2Vwb2xpY3lGaWxlW10gPSAiL3NlcG9saWN5IjsKIAotICAgIExPRyhWRVJCT1NFKSA8PCAiT3BlbmluZyBTRUxpbnV4IHBvbGljeSBmcm9tIG1vbm9saXRoaWMgZmlsZSI7CisgICAgTE9HKElORk8pIDw8ICJPcGVuaW5nIFNFTGludXggcG9saWN5IGZyb20gbW9ub2xpdGhpYyBmaWxlICIgPDwga1NlcG9saWN5RmlsZTsKICAgICBwb2xpY3lfZmlsZS0+ZmQucmVzZXQob3BlbihrU2Vwb2xpY3lGaWxlLCBPX1JET05MWSB8IE9fQ0xPRVhFQyB8IE9fTk9GT0xMT1cpKTsKICAgICBpZiAocG9saWN5X2ZpbGUtPmZkIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gbW9ub2xpdGhpYyBTRUxpbnV4IHBvbGljeSI7CkBAIC01MDgsMjI4ICs0ODAsNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1jb25zdGV4cHIgY29uc3QgY2hhcioga1NpZ25pbmdDZXJ0UmVsZWFzZSA9Ci0gICAgICAgICIvc3lzdGVtL2V0Yy9zZWxpbnV4L2NvbS5hbmRyb2lkLnNlcG9saWN5LmNlcnQtcmVsZWFzZS5kZXIiOwotY29uc3RleHByIGNvbnN0IGNoYXIqIGtGc1Zlcml0eVByb2NQYXRoID0gIi9wcm9jL3N5cy9mcy92ZXJpdHkiOwotY29uc3Qgc3RkOjpzdHJpbmcga1NlcG9saWN5QXBleE1ldGFkYXRhRGlyID0gIi9tZXRhZGF0YS9zZXBvbGljeS8iOwotY29uc3Qgc3RkOjpzdHJpbmcga1NlcG9saWN5QXBleFN5c3RlbURpciA9ICIvc3lzdGVtL2V0Yy9zZWxpbnV4L2FwZXgvIjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtTZXBvbGljeVppcCA9ICJTRVBvbGljeS56aXAiOwotY29uc3Qgc3RkOjpzdHJpbmcga1NlcG9saWN5U2lnbmF0dXJlID0gIlNFUG9saWN5LnppcC5zaWciOwotCi1jb25zdCBzdGQ6OnN0cmluZyBrVG1wZnNEaXIgPSAiL2Rldi9zZWxpbnV4LyI7Ci0KLS8vIEZpbGVzIHRoYXQgYXJlIGRlbGV0ZWQgYWZ0ZXIgcG9saWN5IGlzIGNvbXBpbGVkL2xvYWRlZC4KLWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBrQXBleFNlcG9saWN5VG1weyJhcGV4X3NlcG9saWN5LmNpbCIsICJhcGV4X3NlcG9saWN5LnNoYTI1NiJ9OwotLy8gRmlsZXMgdGhhdCBuZWVkIHRvIHBlcnNpc3QgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGJ5IHVzZXJzcGFjZSBwcm9jZXNzZXMuCi1jb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ga0FwZXhTZXBvbGljeXsiYXBleF9maWxlX2NvbnRleHRzIiwgImFwZXhfcHJvcGVydHlfY29udGV4dHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwZXhfc2VydmljZV9jb250ZXh0cyIsICJhcGV4X3NlYXBwX2NvbnRleHRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcGV4X3Rlc3QifTsKLQotUmVzdWx0PHZvaWQ+IENyZWF0ZVRtcGZzRGlyKCkgewotICAgIG1vZGVfdCBtb2RlID0gMDc0NDsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2RhdGE7Ci0gICAgaWYgKHN0YXQoa1RtcGZzRGlyLmNfc3RyKCksICZzdGF0X2RhdGEpICE9IDApIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkgewotICAgICAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiQ291bGQgbm90IHN0YXQgIiA8PCBrVG1wZnNEaXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1rZGlyKGtUbXBmc0Rpci5jX3N0cigpLCBtb2RlKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJDb3VsZCBub3QgbWtkaXIgIiA8PCBrVG1wZnNEaXI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIVNfSVNESVIoc3RhdF9kYXRhLnN0X21vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCBrVG1wZnNEaXIgPDwgIiBleGlzdHMgYW5kIGlzIG5vdCBhIGRpcmVjdG9yeS4iOwotICAgICAgICB9Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRGlyZWN0b3J5ICIgPDwga1RtcGZzRGlyIDw8ICIgYWxyZWFkeSBleGlzdHMiOwotICAgIH0KLQotICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2FsbCBjaG1vZCBiZWNhdXNlIG1rZGlyIHdpbGwgY3JlYXRlIGEgZm9sZGVyIHdpdGgKLSAgICAvLyBwZXJtaXNzaW9ucyBtb2RlICYgfnVtYXNrLgotICAgIGlmIChjaG1vZChrVG1wZnNEaXIuY19zdHIoKSwgbW9kZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJDb3VsZCBub3QgY2htb2QgIiA8PCBrVG1wZnNEaXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHt9OwotfQotCi1SZXN1bHQ8dm9pZD4gUHV0RmlsZUluVG1wZnMoWmlwQXJjaGl2ZUhhbmRsZSBhcmNoaXZlLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKLSAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICBzdGQ6OnN0cmluZyBkc3RQYXRoID0ga1RtcGZzRGlyICsgZmlsZU5hbWU7Ci0KLSAgICBpbnQgcmV0ID0gRmluZEVudHJ5KGFyY2hpdmUsIGZpbGVOYW1lLCAmZW50cnkpOwotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICAvLyBBbGwgZmlsZXMgYXJlIG9wdGlvbmFsLiBJZiBhIGZpbGUgZG9lc24ndCBleGlzdCwgcmV0dXJuIHdpdGhvdXQgZXJyb3IuCi0gICAgICAgIHJldHVybiB7fTsKLSAgICB9Ci0KLSAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKAotICAgICAgICAgICAgb3Blbihkc3RQYXRoLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIFNfSVJVU1IgfCBTX0lXVVNSKSkpOwotICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IGRzdFBhdGg7Ci0gICAgfQotCi0gICAgcmV0ID0gRXh0cmFjdEVudHJ5VG9GaWxlKGFyY2hpdmUsICZlbnRyeSwgZmQuZ2V0KCkpOwotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRmFpbGVkIHRvIGV4dHJhY3QgZW50cnkgXCIiIDw8IGZpbGVOYW1lIDw8ICJcIiAoIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBlbnRyeS51bmNvbXByZXNzZWRfbGVuZ3RoIDw8ICIgYnl0ZXMpIHRvIFwiIiA8PCBkc3RQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIjogIiA8PCBFcnJvckNvZGVTdHJpbmcocmV0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4ge307Ci19Ci0KLVJlc3VsdDx2b2lkPiBHZXRQb2xpY3lGcm9tQXBleChjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSB7Ci0gICAgTE9HKElORk8pIDw8ICJMb2FkaW5nIEFQRVggU2Vwb2xpY3kgZnJvbSAiIDw8IGRpciArIGtTZXBvbGljeVppcDsKLSAgICB1bmlxdWVfZmQgZmQob3BlbigoZGlyICsga1NlcG9saWN5WmlwKS5jX3N0cigpLCBPX1JET05MWSB8IE9fQklOQVJZIHwgT19DTE9FWEVDKSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJGYWlsZWQgdG8gb3BlbiBwYWNrYWdlICIgPDwgZGlyICsga1NlcG9saWN5WmlwOwotICAgIH0KLQotICAgIFppcEFyY2hpdmVIYW5kbGUgaGFuZGxlOwotICAgIGludCByZXQgPSBPcGVuQXJjaGl2ZUZkKGZkLmdldCgpLCAoZGlyICsga1NlcG9saWN5WmlwKS5jX3N0cigpLCAmaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYXNzdW1lX293bmVyc2hpcD0qL2ZhbHNlKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRmFpbGVkIHRvIG9wZW4gcGFja2FnZSAiIDw8IGRpciArIGtTZXBvbGljeVppcCA8PCAiOiAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IEVycm9yQ29kZVN0cmluZyhyZXQpOwotICAgIH0KLQotICAgIGF1dG8gaGFuZGxlX2d1YXJkID0gYW5kcm9pZDo6YmFzZTo6bWFrZV9zY29wZV9ndWFyZChbJmhhbmRsZV0geyBDbG9zZUFyY2hpdmUoaGFuZGxlKTsgfSk7Ci0KLSAgICBhdXRvIGNyZWF0ZSA9IENyZWF0ZVRtcGZzRGlyKCk7Ci0gICAgaWYgKCFjcmVhdGUub2soKSkgewotICAgICAgICByZXR1cm4gY3JlYXRlLmVycm9yKCk7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBmaWxlIDoga0FwZXhTZXBvbGljeSkgewotICAgICAgICBhdXRvIGV4dHJhY3QgPSBQdXRGaWxlSW5UbXBmcyhoYW5kbGUsIGZpbGUpOwotICAgICAgICBpZiAoIWV4dHJhY3Qub2soKSkgewotICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QuZXJyb3IoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGZpbGUgOiBrQXBleFNlcG9saWN5VG1wKSB7Ci0gICAgICAgIGF1dG8gZXh0cmFjdCA9IFB1dEZpbGVJblRtcGZzKGhhbmRsZSwgZmlsZSk7Ci0gICAgICAgIGlmICghZXh0cmFjdC5vaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXh0cmFjdC5lcnJvcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB7fTsKLX0KLQotUmVzdWx0PHZvaWQ+IExvYWRTZXBvbGljeUFwZXhDZXJ0cygpIHsKLSAgICBrZXlfc2VyaWFsX3Qga2V5cmluZ19pZCA9IGFuZHJvaWQ6OkdldEtleXJpbmdJZCgiLmZzLXZlcml0eSIpOwotICAgIGlmIChrZXlyaW5nX2lkIDwgMCkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRmFpbGVkIHRvIGZpbmQgLmZzLXZlcml0eSBrZXlyaW5nIGlkIjsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGIvMTk5OTE0MjI3KSB0aGUgcmVsZWFzZSBrZXkgc2hvdWxkIGFsd2F5cyBleGlzdC4gT25jZSBpdCdzIGNoZWNrZWQgaW4sIHN0YXJ0Ci0gICAgLy8gdGhyb3dpbmcgYW4gZXJyb3IgaGVyZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgotICAgIGlmIChhY2Nlc3Moa1NpZ25pbmdDZXJ0UmVsZWFzZSwgRl9PSykgPT0gMCkgewotICAgICAgICBMb2FkS2V5RnJvbUZpbGUoa2V5cmluZ19pZCwgImZzdl9zZXBvbGljeV9hcGV4X3JlbGVhc2UiLCBrU2lnbmluZ0NlcnRSZWxlYXNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHt9OwotfQotCi1SZXN1bHQ8dm9pZD4gU2Vwb2xpY3lGc1Zlcml0eUNoZWNrKCkgewotICAgIHJldHVybiBFcnJvcigpIDw8ICJUT0RPIGltcGxlbWVudCBzdXBwb3J0IGZvciBmc3Zlcml0eSBTRVBvbGljeS4iOwotfQotCi1SZXN1bHQ8dm9pZD4gU2Vwb2xpY3lDaGVja1NpZ25hdHVyZShjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSB7Ci0gICAgc3RkOjpzdHJpbmcgc2lnbmF0dXJlOwotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhkaXIgKyBrU2Vwb2xpY3lTaWduYXR1cmUsICZzaWduYXR1cmUpKSB7Ci0gICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgIkZhaWxlZCB0byByZWFkICIgPDwga1NlcG9saWN5U2lnbmF0dXJlOwotICAgIH0KLQotICAgIHN0ZDo6ZnN0cmVhbSBzZXBvbGljeVppcChkaXIgKyBrU2Vwb2xpY3laaXAsIHN0ZDo6aW9zOjppbiB8IHN0ZDo6aW9zOjpiaW5hcnkpOwotICAgIGlmICghc2Vwb2xpY3laaXApIHsKLSAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwga1NlcG9saWN5WmlwOwotICAgIH0KLSAgICBzZXBvbGljeVppcC5zZWVrZygwKTsKLSAgICBzdGQ6OnN0cmluZyBzZXBvbGljeVN0cigoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KHNlcG9saWN5WmlwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpOwotCi0gICAgYXV0byByZWxlYXNlS2V5ID0gZXh0cmFjdFB1YmxpY0tleUZyb21YNTA5KGtTaWduaW5nQ2VydFJlbGVhc2UpOwotICAgIGlmICghcmVsZWFzZUtleS5vaygpKSB7Ci0gICAgICAgIHJldHVybiByZWxlYXNlS2V5LmVycm9yKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZlcmlmeVNpZ25hdHVyZShzZXBvbGljeVN0ciwgc2lnbmF0dXJlLCAqcmVsZWFzZUtleSk7Ci19Ci0KLVJlc3VsdDx2b2lkPiBTZXBvbGljeVZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgZGlyLCBib29sIHN1cHBvcnRzRnNWZXJpdHkpIHsKLSAgICBpZiAoc3VwcG9ydHNGc1Zlcml0eSkgewotICAgICAgICBhdXRvIGZzVmVyaXR5Q2hlY2sgPSBTZXBvbGljeUZzVmVyaXR5Q2hlY2soKTsKLSAgICAgICAgaWYgKGZzVmVyaXR5Q2hlY2sub2soKSkgewotICAgICAgICAgICAgcmV0dXJuIGZzVmVyaXR5Q2hlY2s7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhiLzE5OTkxNDIyNykgSWYgdGhlIGRldmljZSBzdXBwb3J0cyBmc3Zlcml0eSwgYnV0IHdlIGZhaWwgaGVyZSwgd2Ugc2hvdWxkIGZhaWwgdG8KLSAgICAgICAgLy8gYm9vdCBhbmQgbm90IGNhcnJ5IG9uLiBGb3Igbm93LCBmYWxsYmFjayB0byBhIHNpZ25hdHVyZSBjaGVja3VudGlsIHRoZSBmc3Zlcml0eQotICAgICAgICAvLyBsb2dpYyBpcyBpbXBsZW1lbnRlZC4KLSAgICAgICAgTE9HKElORk8pIDw8ICJGYWxsaW5nIGJhY2sgdG8gc3RhbmRhcmQgc2lnbmF0dXJlIGNoZWNrLiAiIDw8IGZzVmVyaXR5Q2hlY2suZXJyb3IoKTsKLSAgICB9Ci0KLSAgICBhdXRvIHNlcG9saWN5U2lnbmF0dXJlID0gU2Vwb2xpY3lDaGVja1NpZ25hdHVyZShkaXIpOwotICAgIGlmICghc2Vwb2xpY3lTaWduYXR1cmUub2soKSkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQXBleCBTRVBvbGljeSBmYWlsZWQgc2lnbmF0dXJlIGNoZWNrIjsKLSAgICB9Ci0gICAgcmV0dXJuIHt9OwotfQotCi12b2lkIENsZWFudXBBcGV4U2Vwb2xpY3koKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBmaWxlIDoga0FwZXhTZXBvbGljeVRtcCkgewotICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0ga1RtcGZzRGlyICsgZmlsZTsKLSAgICAgICAgdW5saW5rKHBhdGguY19zdHIoKSk7Ci0gICAgfQotfQotCi0vLyBVcGRhdGFibGUgc2Vwb2xpY3kgaXMgc2hpcHBlZCB3aXRoaW4gYW4gemlwIHdpdGhpbiBhbiBBUEVYLiBCZWNhdXNlCi0vLyBpdCBuZWVkcyB0byBiZSBhdmFpbGFibGUgYmVmb3JlIEFwZXhlcyBhcmUgbW91bnRlZCwgYXBleGQgY29waWVzCi0vLyB0aGUgemlwIGZyb20gdGhlIEFQRVggYW5kIHN0b3JlcyBpdCBpbiAvbWV0YWRhdGEvc2Vwb2xpY3kuIElmIHRoZXJlIGlzCi0vLyBubyB1cGRhdGFibGUgc2Vwb2xpY3kgaW4gL21ldGFkYXRhL3NlcG9saWN5LCB0aGVuIHRoZSB1cGRhdGFibGUgcG9saWN5IGlzCi0vLyBsb2FkZWQgZnJvbSAvc3lzdGVtL2V0Yy9zZWxpbnV4L2FwZXguIEluaXQgcGVyZm9ybXMgdGhlIGZvbGxvd2luZwotLy8gc3RlcHMgb24gYm9vdDoKLS8vCi0vLyAxLiBWYWxpZGF0ZXMgdGhlIHppcCBieSBjaGVja2luZyBpdHMgc2lnbmF0dXJlIGFnYWluc3QgYSBwdWJsaWMga2V5IHRoYXQgaXMKLS8vIHN0b3JlZCBpbiAvc3lzdGVtL2V0Yy9zZWxpbnV4LgotLy8gMi4gRXh0cmFjdHMgZmlsZXMgZnJvbSB6aXAgYW5kIHN0b3JlcyB0aGVtIGluIC9kZXYvc2VsaW51eC4KLS8vIDMuIENoZWNrcyBpZiB0aGUgYXBleF9zZXBvbGljeS5zaGEyNTYgbWF0Y2hlcyB0aGUgc2hhMjU2IG9mIHByZWNvbXBpbGVkX3NlcG9saWN5LgotLy8gaWYgc28sIHRoZSBwcmVjb21waWxlZCBzZXBvbGljeSBpcyB1c2VkLiBPdGhlcndpc2UsIGFuIG9uLWRldmljZSBjb21waWxlIG9mIHRoZSBwb2xpY3kKLS8vIGlzIHVzZWQuIFRoaXMgaXMgdGhlIHNhbWUgZmxvdyBhcyBvbi1kZXZpY2UgY29tcGlsYXRpb24gb2YgcG9saWN5IGZvciBUcmVibGUuCi0vLyA0LiBDbGVhbnMgdXAgZmlsZXMgaW4gL2Rldi9zZWxpbnV4IHdoaWNoIGFyZSBubyBsb25nZXIgbmVlZGVkLgotLy8gNS4gUmVzdG9yZWNvbnMgdGhlIHJlbWFpbmluZyBmaWxlcyBpbiAvZGV2L3NlbGludXguCi0vLyA2LiBTZXRzIHNlbGludXggaW50byBlbmZvcmNpbmcgbW9kZSBhbmQgY29udGludWVzIG5vcm1hbCBib290aW5nLgotLy8KLXZvaWQgUHJlcGFyZUFwZXhTZXBvbGljeSgpIHsKLSAgICBib29sIHN1cHBvcnRzRnNWZXJpdHkgPSBhY2Nlc3Moa0ZzVmVyaXR5UHJvY1BhdGgsIEZfT0spID09IDA7Ci0gICAgaWYgKHN1cHBvcnRzRnNWZXJpdHkpIHsKLSAgICAgICAgYXV0byBsb2FkU2Vwb2xpY3lBcGV4Q2VydHMgPSBMb2FkU2Vwb2xpY3lBcGV4Q2VydHMoKTsKLSAgICAgICAgaWYgKCFsb2FkU2Vwb2xpY3lBcGV4Q2VydHMub2soKSkgewotICAgICAgICAgICAgLy8gVE9ETyhiLzE5OTkxNDIyNykgSWYgdGhlIGRldmljZSBzdXBwb3J0cyBmc3Zlcml0eSwgYnV0IHdlIGZhaWwgaGVyZSwgd2Ugc2hvdWxkIGZhaWwKLSAgICAgICAgICAgIC8vIHRvIGJvb3QgYW5kIG5vdCBjYXJyeSBvbi4gRm9yIG5vdywgZmFsbGJhY2sgdG8gYSBzaWduYXR1cmUgY2hlY2t1bnRpbCB0aGUgZnN2ZXJpdHkKLSAgICAgICAgICAgIC8vIGxvZ2ljIGlzIGltcGxlbWVudGVkLgotICAgICAgICAgICAgTE9HKElORk8pIDw8IGxvYWRTZXBvbGljeUFwZXhDZXJ0cy5lcnJvcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIElmIGFwZXggc2Vwb2xpY3kgemlwIGV4aXN0cyBpbiAvbWV0YWRhdGEvc2Vwb2xpY3ksIHVzZSB0aGF0LCBvdGhlcndpc2UgdXNlIHZlcnNpb24gb24KLSAgICAvLyAvc3lzdGVtLgotICAgIGF1dG8gZGlyID0gKGFjY2Vzcygoa1NlcG9saWN5QXBleE1ldGFkYXRhRGlyICsga1NlcG9saWN5WmlwKS5jX3N0cigpLCBGX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICA/IGtTZXBvbGljeUFwZXhNZXRhZGF0YURpcgotICAgICAgICAgICAgICAgICAgICAgICA6IGtTZXBvbGljeUFwZXhTeXN0ZW1EaXI7Ci0KLSAgICBhdXRvIHNlcG9saWN5VmVyaWZ5ID0gU2Vwb2xpY3lWZXJpZnkoZGlyLCBzdXBwb3J0c0ZzVmVyaXR5KTsKLSAgICBpZiAoIXNlcG9saWN5VmVyaWZ5Lm9rKCkpIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJFcnJvcjogIiA8PCBzZXBvbGljeVZlcmlmeS5lcnJvcigpOwotICAgICAgICAvLyBJZiBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxzLCBmYWxsIGJhY2sgdG8gdmVyc2lvbiBvbiAvc3lzdGVtLgotICAgICAgICAvLyBUaGlzIGZpbGUgZG9lc24ndCBuZWVkIHRvIGJlIHZlcmlmaWVkIGJlY2F1c2UgaXQgbGl2ZXMgb24gdGhlIHN5c3RlbSBwYXJ0aXRpb24gd2hpY2gKLSAgICAgICAgLy8gaXMgc2lnbmVkIGFuZCBwcm90ZWN0ZWQgYnkgdmVyaWZpZWQgYm9vdC4KLSAgICAgICAgZGlyID0ga1NlcG9saWN5QXBleFN5c3RlbURpcjsKLSAgICB9Ci0KLSAgICBhdXRvIGFwZXggPSBHZXRQb2xpY3lGcm9tQXBleChkaXIpOwotICAgIGlmICghYXBleC5vaygpKSB7Ci0gICAgICAgIC8vIFRPRE8oYi8xOTk5MTQyMjcpIE1ha2UgZmFpbHVyZSBmYXRhbC4gRm9yIG5vdyBjb250aW51ZSBib290aW5nIHdpdGggbm9uLWFwZXggc2Vwb2xpY3kuCi0gICAgICAgIExPRyhFUlJPUikgPDwgYXBleC5lcnJvcigpOwotICAgIH0KLX0KLQogdm9pZCBSZWFkUG9saWN5KHN0ZDo6c3RyaW5nKiBwb2xpY3kpIHsKICAgICBQb2xpY3lGaWxlIHBvbGljeV9maWxlOwogCkBAIC03NTMsMTAgKzUwMyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSBmYWlsZWQiOwogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGF1dG8gcmVzdWx0ID0gV3JpdGVGaWxlKCIvc3lzL2ZzL3NlbGludXgvY2hlY2tyZXFwcm90IiwgIjAiKTsgIXJlc3VsdC5vaygpKSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgIlVuYWJsZSB0byB3cml0ZSB0byAvc3lzL2ZzL3NlbGludXgvY2hlY2tyZXFwcm90OiAiIDw8IHJlc3VsdC5lcnJvcigpOwotICAgIH0KIH0KIAogY29uc3RleHByIHNpemVfdCBrS2xvZ01lc3NhZ2VTaXplID0gMTAyNDsKQEAgLTc4MCw2ICs1MjYsMTQgQEAKICAgICBURU1QX0ZBSUxVUkVfUkVUUlkoc2VuZChmZC5nZXQoKSwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgMCkpOwogfQogCitpbnQgUmVzdG9yZWNvbklmRXhpc3RzKGNvbnN0IGNoYXIqIHBhdGgsIHVuc2lnbmVkIGludCBmbGFncykgeworICAgIGlmIChhY2Nlc3MocGF0aCwgRl9PSykgIT0gMCAmJiBlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgLy8gQXZvaWQgZXJyb3IgbWVzc2FnZSBmb3IgcGF0aCB0aGF0IGlzIGV4cGVjdGVkIHRvIG5vdCBhbHdheXMgZXhpc3QuCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24ocGF0aCwgZmxhZ3MpOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogdm9pZCBTZWxpbnV4UmVzdG9yZUNvbnRleHQoKSB7CkBAIC04MDIsMTQgKzU1NiwxNCBAQAogICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCIvZGV2L2RldmljZS1tYXBwZXIiLCAwKTsKIAogICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCIvYXBleCIsIDApOwotCisgICAgc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24oIi9ib290c3RyYXAtYXBleCIsIDApOwogICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCIvbGlua2VyY29uZmlnIiwgMCk7CiAKICAgICAvLyBhZGIgcmVtb3VudCwgc25hcHNob3QtYmFzZWQgdXBkYXRlcywgYW5kIERTVXMgYWxsIGNyZWF0ZSBmaWxlcyBkdXJpbmcKICAgICAvLyBmaXJzdC1zdGFnZSBpbml0LgotICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKFNuYXBzaG90TWFuYWdlcjo6R2V0R2xvYmFsUm9sbGJhY2tJbmRpY2F0b3JQYXRoKCkuY19zdHIoKSwgMCk7Ci0gICAgc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24oIi9tZXRhZGF0YS9nc2kiLCBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9SRUNVUlNFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fU0tJUF9TRUhBU0gpOworICAgIFJlc3RvcmVjb25JZkV4aXN0cyhTbmFwc2hvdE1hbmFnZXI6OkdldEdsb2JhbFJvbGxiYWNrSW5kaWNhdG9yUGF0aCgpLmNfc3RyKCksIDApOworICAgIFJlc3RvcmVjb25JZkV4aXN0cygiL21ldGFkYXRhL2dzaSIsCisgICAgICAgICAgICAgICAgICAgICAgIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1JFQ1VSU0UgfCBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9TS0lQX1NFSEFTSCk7CiB9CiAKIGludCBTZWxpbnV4S2xvZ0NhbGxiYWNrKGludCB0eXBlLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgewpAQCAtODUxLDYgKzYwNSwxMCBAQAogfQogCiBpbnQgU2VsaW51eEdldFZlbmRvckFuZHJvaWRWZXJzaW9uKCkgeworICAgIGlmIChJc01pY3JvZHJvaWQoKSkgeworICAgICAgICAvLyBBcyBvZiBub3cgTWljcm9kcm9pZCBkb2Vzbid0IGhhdmUgYW55IHZlbmRvciBjb2RlLgorICAgICAgICByZXR1cm4gX19BTkRST0lEX0FQSV9GVVRVUkVfXzsKKyAgICB9CiAgICAgc3RhdGljIGludCB2ZW5kb3JfYW5kcm9pZF92ZXJzaW9uID0gW10gewogICAgICAgICBpZiAoIUlzU3BsaXRQb2xpY3lEZXZpY2UoKSkgewogICAgICAgICAgICAgLy8gSWYgdGhpcyBkZXZpY2UgZG9lcyBub3Qgc3BsaXQgc2Vwb2xpY3kgZmlsZXMsIGl0J3Mgbm90IGEgVHJlYmxlIGRldmljZSBhbmQgdGhlcmVmb3JlLApAQCAtOTU0LDYgKzcxMiwyNiBAQAogICAgIH0KIH0KIAorLy8gRW5jYXBzdWxhdGVzIHN0ZXBzIHRvIGxvYWQgU0VMaW51eCBwb2xpY3kgaW4gTWljcm9kcm9pZC4KKy8vIFNvIGZhciB0aGUgcHJvY2VzcyBpcyB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZCAtIGp1c3QgbG9hZCB0aGUgcHJlY29tcGlsZWQgcG9saWN5IGZyb20gL3N5c3RlbS4KK3ZvaWQgTG9hZFNlbGludXhQb2xpY3lNaWNyb2Ryb2lkKCkgeworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGtNaWNyb2Ryb2lkUHJlY29tcGlsZWRTZXBvbGljeVtdID0KKyAgICAgICAgICAgICIvc3lzdGVtL2V0Yy9zZWxpbnV4L21pY3JvZHJvaWRfcHJlY29tcGlsZWRfc2Vwb2xpY3kiOworCisgICAgTE9HKElORk8pIDw8ICJPcGVuaW5nIFNFTGludXggcG9saWN5IGZyb20gIiA8PCBrTWljcm9kcm9pZFByZWNvbXBpbGVkU2Vwb2xpY3k7CisgICAgdW5pcXVlX2ZkIHBvbGljeV9mZChvcGVuKGtNaWNyb2Ryb2lkUHJlY29tcGlsZWRTZXBvbGljeSwgT19SRE9OTFkgfCBPX0NMT0VYRUMgfCBPX05PRk9MTE9XKSk7CisgICAgaWYgKHBvbGljeV9mZCA8IDApIHsKKyAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwga01pY3JvZHJvaWRQcmVjb21waWxlZFNlcG9saWN5OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHBvbGljeTsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKHBvbGljeV9mZCwgJnBvbGljeSkpIHsKKyAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byByZWFkIHBvbGljeSBmaWxlOiAiIDw8IGtNaWNyb2Ryb2lkUHJlY29tcGlsZWRTZXBvbGljeTsKKyAgICB9CisKKyAgICBMb2FkU2VsaW51eFBvbGljeShwb2xpY3kpOworfQorCiAvLyBUaGUgU0VMaW51eCBzZXR1cCBwcm9jZXNzIGlzIGNhcmVmdWxseSBvcmNoZXN0cmF0ZWQgYXJvdW5kIHNuYXB1c2VyZC4gUG9saWN5CiAvLyBtdXN0IGJlIGxvYWRlZCBvZmYgZHluYW1pYyBwYXJ0aXRpb25zLCBhbmQgZHVyaW5nIGFuIE9UQSwgdGhvc2UgcGFydGl0aW9ucwogLy8gY2Fubm90IGJlIHJlYWQgd2l0aG91dCBzbmFwdXNlcmQuIEJ1dCwgd2l0aCBrZXJuZWwtcHJpdmlsZWdlZCBzbmFwdXNlcmQKQEAgLTk2OSwzNCArNzQ3LDE5IEBACiAvLyAgKDUpIFJlLWxhdW5jaCBzbmFwdXNlcmQgYW5kIGF0dGFjaCBpdCB0byB0aGUgZG0tdXNlciBkZXZpY2VzIGZyb20gc3RlcCAoMikuCiAvLwogLy8gQWZ0ZXIgdGhpcyBzZXF1ZW5jZSwgaXQgaXMgc2FmZSB0byBlbmFibGUgZW5mb3JjaW5nIG1vZGUgYW5kIGNvbnRpbnVlIGJvb3RpbmcuCi1pbnQgU2V0dXBTZWxpbnV4KGNoYXIqKiBhcmd2KSB7Ci0gICAgU2V0U3RkaW9Ub0Rldk51bGwoYXJndik7Ci0gICAgSW5pdEtlcm5lbExvZ2dpbmcoYXJndik7Ci0KLSAgICBpZiAoUkVCT09UX0JPT1RMT0FERVJfT05fUEFOSUMpIHsKLSAgICAgICAgSW5zdGFsbFJlYm9vdFNpZ25hbEhhbmRsZXJzKCk7Ci0gICAgfQotCi0gICAgYm9vdF9jbG9jazo6dGltZV9wb2ludCBzdGFydF90aW1lID0gYm9vdF9jbG9jazo6bm93KCk7Ci0KK3ZvaWQgTG9hZFNlbGludXhQb2xpY3lBbmRyb2lkKCkgewogICAgIE1vdW50TWlzc2luZ1N5c3RlbVBhcnRpdGlvbnMoKTsKIAotICAgIFNlbGludXhTZXR1cEtlcm5lbExvZ2dpbmcoKTsKLQogICAgIExPRyhJTkZPKSA8PCAiT3BlbmluZyBTRUxpbnV4IHBvbGljeSI7CiAKLSAgICBQcmVwYXJlQXBleFNlcG9saWN5KCk7Ci0KICAgICAvLyBSZWFkIHRoZSBwb2xpY3kgYmVmb3JlIHBvdGVudGlhbGx5IGtpbGxpbmcgc25hcHVzZXJkLgogICAgIHN0ZDo6c3RyaW5nIHBvbGljeTsKICAgICBSZWFkUG9saWN5KCZwb2xpY3kpOwotICAgIENsZWFudXBBcGV4U2Vwb2xpY3koKTsKIAogICAgIGF1dG8gc25hcHVzZXJkX2hlbHBlciA9IFNuYXB1c2VyZFNlbGludXhIZWxwZXI6OkNyZWF0ZUlmTmVlZGVkKCk7CiAgICAgaWYgKHNuYXB1c2VyZF9oZWxwZXIpIHsKLSAgICAgICAgLy8gS2lsbCB0aGUgb2xkIHNuYXB1c2VkIHRvIGF2b2lkIGF1ZGl0IG1lc3NhZ2VzLiBBZnRlciB0aGlzIHdlIGNhbm5vdAotICAgICAgICAvLyByZWFkIGZyb20gL3N5c3RlbSAob3Igb3RoZXIgZHluYW1pYyBwYXJ0aXRpb25zKSB1bnRpbCB3ZSBjYWxsCi0gICAgICAgIC8vIEZpbmlzaFRyYW5zaXRpb24oKS4KKyAgICAgICAgLy8gS2lsbCB0aGUgb2xkIHNuYXB1c2VkIHRvIGF2b2lkIGF1ZGl0IG1lc3NhZ2VzLiBBZnRlciB0aGlzIHdlIGNhbm5vdCByZWFkIGZyb20gL3N5c3RlbQorICAgICAgICAvLyAob3Igb3RoZXIgZHluYW1pYyBwYXJ0aXRpb25zKSB1bnRpbCB3ZSBjYWxsIEZpbmlzaFRyYW5zaXRpb24oKS4KICAgICAgICAgc25hcHVzZXJkX2hlbHBlci0+U3RhcnRUcmFuc2l0aW9uKCk7CiAgICAgfQogCkBAIC0xMDA3LDEyICs3NzAsMjUgQEAKICAgICAgICAgc25hcHVzZXJkX2hlbHBlci0+RmluaXNoVHJhbnNpdGlvbigpOwogICAgICAgICBzbmFwdXNlcmRfaGVscGVyID0gbnVsbHB0cjsKICAgICB9Cit9CiAKLSAgICAvLyBUaGlzIHJlc3RvcmVjb24gaXMgaW50ZW50aW9uYWxseSBkb25lIGJlZm9yZSBTZWxpbnV4U2V0RW5mb3JjZW1lbnQgYmVjYXVzZSB0aGUgcGVybWlzc2lvbnMKLSAgICAvLyBuZWVkZWQgdG8gdHJhbnNpdGlvbiBmaWxlcyBmcm9tIHRtcGZzIHRvICpfY29udGV4dHNfZmlsZSBjb250ZXh0IHNob3VsZCBub3QgYmUgZ3JhbnRlZCB0bwotICAgIC8vIGFueSBwcm9jZXNzIGFmdGVyIHNlbGludXggaXMgc2V0IGludG8gZW5mb3JjaW5nIG1vZGUuCi0gICAgaWYgKHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCIvZGV2L3NlbGludXgvIiwgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fUkVDVVJTRSkgPT0gLTEpIHsKLSAgICAgICAgUExPRyhGQVRBTCkgPDwgInJlc3RvcmVjb24gZmFpbGVkIG9mIC9kZXYvc2VsaW51eCBmYWlsZWQiOworaW50IFNldHVwU2VsaW51eChjaGFyKiogYXJndikgeworICAgIFNldFN0ZGlvVG9EZXZOdWxsKGFyZ3YpOworICAgIEluaXRLZXJuZWxMb2dnaW5nKGFyZ3YpOworCisgICAgaWYgKFJFQk9PVF9CT09UTE9BREVSX09OX1BBTklDKSB7CisgICAgICAgIEluc3RhbGxSZWJvb3RTaWduYWxIYW5kbGVycygpOworICAgIH0KKworICAgIGJvb3RfY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRfdGltZSA9IGJvb3RfY2xvY2s6Om5vdygpOworCisgICAgU2VsaW51eFNldHVwS2VybmVsTG9nZ2luZygpOworCisgICAgLy8gVE9ETyhiLzI4NzIwNjQ5Nyk6IHJlZmFjdG9yIGludG8gZGlmZmVyZW50IGhlYWRlcnMgdG8gb25seSBpbmNsdWRlIHdoYXQgd2UgbmVlZC4KKyAgICBpZiAoSXNNaWNyb2Ryb2lkKCkpIHsKKyAgICAgICAgTG9hZFNlbGludXhQb2xpY3lNaWNyb2Ryb2lkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTG9hZFNlbGludXhQb2xpY3lBbmRyb2lkKCk7CiAgICAgfQogCiAgICAgU2VsaW51eFNldEVuZm9yY2VtZW50KCk7CmRpZmYgLS1naXQgYS9pbml0L3NlcnZpY2UuY3BwIGIvaW5pdC9zZXJ2aWNlLmNwcAppbmRleCAzNWJlYWFkLi5lYjI0ZGQ1IDEwMDY0NAotLS0gYS9pbml0L3NlcnZpY2UuY3BwCisrKyBiL2luaXQvc2VydmljZS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgogI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuaD4KICNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxzeXMvc2lnbmFsZmQuaD4KIAogI2luY2x1ZGUgPHN0cmluZz4KIApAQCAtNTAsNyArNTEsNiBAQAogI2VuZGlmCiAKICNpZmRlZiBJTklUX0ZVTExfU09VUkNFUwotI2luY2x1ZGUgPEFwZXhQcm9wZXJ0aWVzLnN5c3Byb3AuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgogCiAjaW5jbHVkZSAibW91bnRfbmFtZXNwYWNlLmgiCkBAIC02OSw2ICs2OSw3IEBACiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eTsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGg7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTQwLDkgKzE0MSwxMCBAQAogCiBTZXJ2aWNlOjpTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBTdWJjb250ZXh0KiBzdWJjb250ZXh0X2Zvcl9yZXN0YXJ0X2NvbW1hbmRzLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykKLSAgICA6IFNlcnZpY2UobmFtZSwgMCwgMCwgMCwge30sIDAsICIiLCBzdWJjb250ZXh0X2Zvcl9yZXN0YXJ0X2NvbW1hbmRzLCBmaWxlbmFtZSwgYXJncykge30KKyAgICA6IFNlcnZpY2UobmFtZSwgMCwgc3RkOjpudWxsb3B0LCAwLCB7fSwgMCwgIiIsIHN1YmNvbnRleHRfZm9yX3Jlc3RhcnRfY29tbWFuZHMsIGZpbGVuYW1lLAorICAgICAgICAgICAgICBhcmdzKSB7fQogCi1TZXJ2aWNlOjpTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1bnNpZ25lZCBmbGFncywgdWlkX3QgdWlkLCBnaWRfdCBnaWQsCitTZXJ2aWNlOjpTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1bnNpZ25lZCBmbGFncywgc3RkOjpvcHRpb25hbDx1aWRfdD4gdWlkLCBnaWRfdCBnaWQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGdpZF90PiYgc3VwcF9naWRzLCBpbnQgbmFtZXNwYWNlX2ZsYWdzLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjbGFiZWwsIFN1YmNvbnRleHQqIHN1YmNvbnRleHRfZm9yX3Jlc3RhcnRfY29tbWFuZHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKQpAQCAtMTUzLDcgKzE1NSw3IEBACiAgICAgICBjcmFzaF9jb3VudF8oMCksCiAgICAgICBwcm9jX2F0dHJfey5pb3ByaW9fY2xhc3MgPSBJb1NjaGVkQ2xhc3NfTk9ORSwKICAgICAgICAgICAgICAgICAgLmlvcHJpb19wcmkgPSAwLAotICAgICAgICAgICAgICAgICAudWlkID0gdWlkLAorICAgICAgICAgICAgICAgICAucGFyc2VkX3VpZCA9IHVpZCwKICAgICAgICAgICAgICAgICAgLmdpZCA9IGdpZCwKICAgICAgICAgICAgICAgICAgLnN1cHBfZ2lkcyA9IHN1cHBfZ2lkcywKICAgICAgICAgICAgICAgICAgLnByaW9yaXR5ID0gMH0sCkBAIC0xOTQsMjggKzE5NiwyMCBAQAogICAgIH0KIH0KIAotdm9pZCBTZXJ2aWNlOjpLaWxsUHJvY2Vzc0dyb3VwKGludCBzaWduYWwsIGJvb2wgcmVwb3J0X29uZXNob3QpIHsKLSAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gYSBzdWNjZXNzZnVsIHJlc3VsdCBmcm9tIGtpbGxQcm9jZXNzR3JvdXAqKCksIHRoZW4gd2UgaGF2ZSByZW1vdmVkCi0gICAgLy8gdGhlIGNncm91cCBhbHJlYWR5IGFuZCBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBhIHNlY29uZCB0aW1lIHdpbGwgc2ltcGx5IHJlc3VsdCBpbiBhbiBlcnJvci4KLSAgICAvLyBUaGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZiB3aGljaCBzaWduYWwgd2FzIHNlbnQuCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGhhbmRsZSB0aGVpciBvd24gbG9nZ2luZywgc28gbm8gYWRkaXRpb25hbCBsb2dnaW5nIGlzIG5lZWRlZC4KLSAgICBpZiAoIXByb2Nlc3NfY2dyb3VwX2VtcHR5Xykgewordm9pZCBTZXJ2aWNlOjpLaWxsUHJvY2Vzc0dyb3VwKGludCBzaWduYWwpIHsKKyAgICAvLyBBbHdheXMgYXR0ZW1wdCB0aGUgcHJvY2VzcyBraWxsIGlmIHByb2Nlc3MgaXMgc3RpbGwgcnVubmluZy4KKyAgICAvLyBDZ3JvdXAgY2xlYW4gdXAgcm91dGluZXMgYXJlIGlkZW1wb3RlbnQuIEl0J3Mgc2FmZSB0byBjYWxsCisgICAgLy8ga2lsbFByb2Nlc3NHcm91cCByZXBlYXRlZGx5LiBEdXJpbmcgc2h1dGRvd24sIGBpbml0YCB3aWxsCisgICAgLy8gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHNlbmQgU0lHVEVSTS9TSUdLSUxMIHRvIGFsbCBwcm9jZXNzZXMuCisgICAgLy8gVGhlc2Ugc2lnbmFscyBtdXN0IGJlIHNlbnQgZm9yIGEgc3VjY2Vzc2Z1bCBzaHV0ZG93bi4KKyAgICBpZiAoIXByb2Nlc3NfY2dyb3VwX2VtcHR5XyB8fCBJc1J1bm5pbmcoKSkgewogICAgICAgICBMT0coSU5GTykgPDwgIlNlbmRpbmcgc2lnbmFsICIgPDwgc2lnbmFsIDw8ICIgdG8gc2VydmljZSAnIiA8PCBuYW1lXyA8PCAiJyAocGlkICIgPDwgcGlkXwogICAgICAgICAgICAgICAgICAgPDwgIikgcHJvY2VzcyBncm91cC4uLiI7Ci0gICAgICAgIGludCBtYXhfcHJvY2Vzc2VzID0gMDsKICAgICAgICAgaW50IHI7CiAgICAgICAgIGlmIChzaWduYWwgPT0gU0lHVEVSTSkgewotICAgICAgICAgICAgciA9IGtpbGxQcm9jZXNzR3JvdXBPbmNlKHByb2NfYXR0cl8udWlkLCBwaWRfLCBzaWduYWwsICZtYXhfcHJvY2Vzc2VzKTsKKyAgICAgICAgICAgIHIgPSBraWxsUHJvY2Vzc0dyb3VwT25jZSh1aWQoKSwgcGlkXywgc2lnbmFsKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHIgPSBraWxsUHJvY2Vzc0dyb3VwKHByb2NfYXR0cl8udWlkLCBwaWRfLCBzaWduYWwsICZtYXhfcHJvY2Vzc2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXBvcnRfb25lc2hvdCAmJiBtYXhfcHJvY2Vzc2VzID4gMCkgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpCi0gICAgICAgICAgICAgICAgICAgIDw8ICJLaWxsZWQgIiA8PCBtYXhfcHJvY2Vzc2VzCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgYWRkaXRpb25hbCBwcm9jZXNzZXMgZnJvbSBhIG9uZXNob3QgcHJvY2VzcyBncm91cCBmb3Igc2VydmljZSAnIiA8PCBuYW1lXwotICAgICAgICAgICAgICAgICAgICA8PCAiJy4gVGhpcyBpcyBuZXcgYmVoYXZpb3IsIHByZXZpb3VzbHkgY2hpbGQgcHJvY2Vzc2VzIHdvdWxkIG5vdCBiZSBraWxsZWQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBjYXNlLiI7CisgICAgICAgICAgICByID0ga2lsbFByb2Nlc3NHcm91cCh1aWQoKSwgcGlkXywgc2lnbmFsKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyID09IDApIHByb2Nlc3NfY2dyb3VwX2VtcHR5XyA9IHRydWU7CkBAIC0yMjgsNyArMjIyLDcgQEAKIAogdm9pZCBTZXJ2aWNlOjpTZXRQcm9jZXNzQXR0cmlidXRlc0FuZENhcHMoSW50ZXJwcm9jZXNzRmlmbyBzZXRzaWRfZmluaXNoZWQpIHsKICAgICAvLyBLZWVwIGNhcGFiaWxpdGVzIG9uIHVpZCBjaGFuZ2UuCi0gICAgaWYgKGNhcGFiaWxpdGllc18gJiYgcHJvY19hdHRyXy51aWQpIHsKKyAgICBpZiAoY2FwYWJpbGl0aWVzXyAmJiB1aWQoKSkgewogICAgICAgICAvLyBJZiBBbmRyb2lkIGlzIHJ1bm5pbmcgaW4gYSBjb250YWluZXIsIHNvbWUgc2VjdXJlYml0cyBtaWdodCBhbHJlYWR5CiAgICAgICAgIC8vIGJlIGxvY2tlZCwgc28gZG9uJ3QgY2hhbmdlIHRob3NlLgogICAgICAgICB1bnNpZ25lZCBsb25nIHNlY3VyZWJpdHMgPSBwcmN0bChQUl9HRVRfU0VDVVJFQklUUyk7CkBAIC0yNTUsNyArMjQ5LDcgQEAKICAgICAgICAgaWYgKCFTZXRDYXBzRm9yRXhlYygqY2FwYWJpbGl0aWVzXykpIHsKICAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgImNhbm5vdCBzZXQgY2FwYWJpbGl0aWVzIGZvciAiIDw8IG5hbWVfOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwcm9jX2F0dHJfLnVpZCkgeworICAgIH0gZWxzZSBpZiAodWlkKCkpIHsKICAgICAgICAgLy8gSW5oZXJpdGFibGUgY2FwcyBjYW4gYmUgbm9uLXplcm8gd2hlbiBydW5uaW5nIGluIGEgY29udGFpbmVyLgogICAgICAgICBpZiAoIURyb3BJbmhlcml0YWJsZUNhcHMoKSkgewogICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiY2Fubm90IGRyb3AgaW5oZXJpdGFibGUgY2FwcyBmb3IgIiA8PCBuYW1lXzsKQEAgLTI2NSw3ICsyNTksNyBAQAogCiB2b2lkIFNlcnZpY2U6OlJlYXAoY29uc3Qgc2lnaW5mb190JiBzaWdpbmZvKSB7CiAgICAgaWYgKCEoZmxhZ3NfICYgU1ZDX09ORVNIT1QpIHx8IChmbGFnc18gJiBTVkNfUkVTVEFSVCkpIHsKLSAgICAgICAgS2lsbFByb2Nlc3NHcm91cChTSUdLSUxMLCBmYWxzZSk7CisgICAgICAgIEtpbGxQcm9jZXNzR3JvdXAoU0lHS0lMTCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gTGVnYWN5IGJlaGF2aW9yIGZyb20gfjIwMDcgdW50aWwgQW5kcm9pZCBSOiB0aGlzIGVsc2UgYnJhbmNoIGRpZCBub3QgZXhpc3QgYW5kIHdlIGRpZCBub3QKICAgICAgICAgLy8ga2lsbCB0aGUgcHJvY2VzcyBncm91cCBpbiB0aGlzIGNhc2UuCkBAIC0yNzMsNyArMjY3LDcgQEAKICAgICAgICAgICAgIC8vIFRoZSBuZXcgYmVoYXZpb3IgaW4gQW5kcm9pZCBSIGlzIHRvIGtpbGwgdGhlc2UgcHJvY2VzcyBncm91cHMgaW4gYWxsIGNhc2VzLiAgVGhlCiAgICAgICAgICAgICAvLyAndHJ1ZScgcGFyYW1ldGVyIGluc3RydWN0aW9ucyBLaWxsUHJvY2Vzc0dyb3VwKCkgdG8gcmVwb3J0IGEgd2FybmluZyBtZXNzYWdlIHdoZXJlIGl0CiAgICAgICAgICAgICAvLyBkZXRlY3RzIGEgZGlmZmVyZW5jZSBpbiBiZWhhdmlvciBoYXMgb2NjdXJyZWQuCi0gICAgICAgICAgICBLaWxsUHJvY2Vzc0dyb3VwKFNJR0tJTEwsIHRydWUpOworICAgICAgICAgICAgS2lsbFByb2Nlc3NHcm91cChTSUdLSUxMKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzA3LDYgKzMwMSw3IEBACiAgICAgcGlkXyA9IDA7CiAgICAgZmxhZ3NfICY9ICh+U1ZDX1JVTk5JTkcpOwogICAgIHN0YXJ0X29yZGVyXyA9IDA7CisgICAgd2FzX2xhc3RfZXhpdF9va18gPSBzaWdpbmZvLnNpX2NvZGUgPT0gQ0xEX0VYSVRFRCAmJiBzaWdpbmZvLnNpX3N0YXR1cyA9PSAwOwogCiAgICAgLy8gT25lc2hvdCBwcm9jZXNzZXMgZ28gaW50byB0aGUgZGlzYWJsZWQgc3RhdGUgb24gZXhpdCwKICAgICAvLyBleGNlcHQgd2hlbiBtYW51YWxseSByZXN0YXJ0ZWQuCkBAIC0zMjEsNyArMzE2LDcgQEAKICAgICB9CiAKICNpZiBJTklUX0ZVTExfU09VUkNFUwotICAgIHN0YXRpYyBib29sIGlzX2FwZXhfdXBkYXRhYmxlID0gYW5kcm9pZDo6c3lzcHJvcDo6QXBleFByb3BlcnRpZXM6OnVwZGF0YWJsZSgpLnZhbHVlX29yKGZhbHNlKTsKKyAgICBzdGF0aWMgYm9vbCBpc19hcGV4X3VwZGF0YWJsZSA9IHRydWU7CiAjZWxzZQogICAgIHN0YXRpYyBib29sIGlzX2FwZXhfdXBkYXRhYmxlID0gZmFsc2U7CiAjZW5kaWYKQEAgLTM2MCw3ICszNTUsOCBAQAogICAgIC8vIElmIHdlIGNyYXNoID4gNCB0aW1lcyBpbiAnZmF0YWxfY3Jhc2hfd2luZG93XycgbWludXRlcyBvciBiZWZvcmUgYm9vdF9jb21wbGV0ZWQsCiAgICAgLy8gcmVib290IGludG8gYm9vdGxvYWRlciBvciBzZXQgY3Jhc2hpbmcgcHJvcGVydHkKICAgICBib290X2Nsb2NrOjp0aW1lX3BvaW50IG5vdyA9IGJvb3RfY2xvY2s6Om5vdygpOwotICAgIGlmICgoKGZsYWdzXyAmIFNWQ19DUklUSUNBTCkgfHwgaXNfcHJvY2Vzc191cGRhdGFibGUpICYmICEoZmxhZ3NfICYgU1ZDX1JFU1RBUlQpKSB7CisgICAgaWYgKCgoZmxhZ3NfICYgU1ZDX0NSSVRJQ0FMKSB8fCBpc19wcm9jZXNzX3VwZGF0YWJsZSkgJiYgIShmbGFnc18gJiBTVkNfUkVTVEFSVCkgJiYKKyAgICAgICAgIXdhc19sYXN0X2V4aXRfb2tfKSB7CiAgICAgICAgIGJvb2wgYm9vdF9jb21wbGV0ZWQgPSBHZXRCb29sUHJvcGVydHkoInN5cy5ib290X2NvbXBsZXRlZCIsIGZhbHNlKTsKICAgICAgICAgaWYgKG5vdyA8IHRpbWVfY3Jhc2hlZF8gKyBmYXRhbF9jcmFzaF93aW5kb3dfIHx8ICFib290X2NvbXBsZXRlZCkgewogICAgICAgICAgICAgaWYgKCsrY3Jhc2hfY291bnRfID4gNCkgewpAQCAtNDE4LDcgKzQxNCw3IEBACiAgICAgICAgIH0KICAgICB9KTsKIAotICAgIGlmIChpc191cGRhdGFibGUoKSAmJiAhU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuSXNTZXJ2aWNlc1VwZGF0ZWQoKSkgeworICAgIGlmIChpc191cGRhdGFibGUoKSAmJiAhSXNEZWZhdWx0TW91bnROYW1lc3BhY2VSZWFkeSgpKSB7CiAgICAgICAgIC8vIERvbid0IGRlbGF5IHRoZSBzZXJ2aWNlIGZvciBFeGVjU3RhcnQoKSBhcyB0aGUgc2VtYW50aWMgaXMgdGhhdAogICAgICAgICAvLyB0aGUgY2FsbGVyIG1pZ2h0IGRlcGVuZCBvbiB0aGUgc2lkZSBlZmZlY3Qgb2YgdGhlIGV4ZWN1dGlvbi4KICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNhbm5vdCBzdGFydCBhbiB1cGRhdGFibGUgc2VydmljZSAnIiA8PCBuYW1lXwpAQCAtNDM0LDggKzQzMCw4IEBACiAgICAgZmxhZ3NfIHw9IFNWQ19FWEVDOwogICAgIGlzX2V4ZWNfc2VydmljZV9ydW5uaW5nXyA9IHRydWU7CiAKLSAgICBMT0coSU5GTykgPDwgIlNWQ19FWEVDIHNlcnZpY2UgJyIgPDwgbmFtZV8gPDwgIicgcGlkICIgPDwgcGlkXyA8PCAiICh1aWQgIiA8PCBwcm9jX2F0dHJfLnVpZAotICAgICAgICAgICAgICA8PCAiIGdpZCAiIDw8IHByb2NfYXR0cl8uZ2lkIDw8ICIrIiA8PCBwcm9jX2F0dHJfLnN1cHBfZ2lkcy5zaXplKCkgPDwgIiBjb250ZXh0ICIKKyAgICBMT0coSU5GTykgPDwgIlNWQ19FWEVDIHNlcnZpY2UgJyIgPDwgbmFtZV8gPDwgIicgcGlkICIgPDwgcGlkXyA8PCAiICh1aWQgIiA8PCB1aWQoKSA8PCAiIGdpZCAiCisgICAgICAgICAgICAgIDw8IHByb2NfYXR0cl8uZ2lkIDw8ICIrIiA8PCBwcm9jX2F0dHJfLnN1cHBfZ2lkcy5zaXplKCkgPDwgIiBjb250ZXh0ICIKICAgICAgICAgICAgICAgPDwgKCFzZWNsYWJlbF8uZW1wdHkoKSA/IHNlY2xhYmVsXyA6ICJkZWZhdWx0IikgPDwgIikgc3RhcnRlZDsgd2FpdGluZy4uLiI7CiAKICAgICByZWJvb3Rfb25fZmFpbHVyZS5EaXNhYmxlKCk7CkBAIC00NzUsMTMgKzQ3MSwxMyBAQAogLy8gQ29uZmlndXJlcyB0aGUgbWVtb3J5IGNncm91cCBwcm9wZXJ0aWVzIGZvciB0aGUgc2VydmljZS4KIHZvaWQgU2VydmljZTo6Q29uZmlndXJlTWVtY2coKSB7CiAgICAgaWYgKHN3YXBwaW5lc3NfICE9IC0xKSB7Ci0gICAgICAgIGlmICghc2V0UHJvY2Vzc0dyb3VwU3dhcHBpbmVzcyhwcm9jX2F0dHJfLnVpZCwgcGlkXywgc3dhcHBpbmVzc18pKSB7CisgICAgICAgIGlmICghc2V0UHJvY2Vzc0dyb3VwU3dhcHBpbmVzcyh1aWQoKSwgcGlkXywgc3dhcHBpbmVzc18pKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAic2V0UHJvY2Vzc0dyb3VwU3dhcHBpbmVzcyBmYWlsZWQiOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHNvZnRfbGltaXRfaW5fYnl0ZXNfICE9IC0xKSB7Ci0gICAgICAgIGlmICghc2V0UHJvY2Vzc0dyb3VwU29mdExpbWl0KHByb2NfYXR0cl8udWlkLCBwaWRfLCBzb2Z0X2xpbWl0X2luX2J5dGVzXykpIHsKKyAgICAgICAgaWYgKCFzZXRQcm9jZXNzR3JvdXBTb2Z0TGltaXQodWlkKCksIHBpZF8sIHNvZnRfbGltaXRfaW5fYnl0ZXNfKSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInNldFByb2Nlc3NHcm91cFNvZnRMaW1pdCBmYWlsZWQiOwogICAgICAgICB9CiAgICAgfQpAQCAtNTA4LDcgKzUwNCw3IEBACiAgICAgfQogCiAgICAgaWYgKGNvbXB1dGVkX2xpbWl0X2luX2J5dGVzICE9IHNpemVfdCgtMSkpIHsKLSAgICAgICAgaWYgKCFzZXRQcm9jZXNzR3JvdXBMaW1pdChwcm9jX2F0dHJfLnVpZCwgcGlkXywgY29tcHV0ZWRfbGltaXRfaW5fYnl0ZXMpKSB7CisgICAgICAgIGlmICghc2V0UHJvY2Vzc0dyb3VwTGltaXQodWlkKCksIHBpZF8sIGNvbXB1dGVkX2xpbWl0X2luX2J5dGVzKSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInNldFByb2Nlc3NHcm91cExpbWl0IGZhaWxlZCI7CiAgICAgICAgIH0KICAgICB9CkBAIC01NzksNyArNTc1LDcgQEAKICAgICAgICAgfQogICAgIH0pOwogCi0gICAgaWYgKGlzX3VwZGF0YWJsZSgpICYmICFTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5Jc1NlcnZpY2VzVXBkYXRlZCgpKSB7CisgICAgaWYgKGlzX3VwZGF0YWJsZSgpICYmICFJc0RlZmF1bHRNb3VudE5hbWVzcGFjZVJlYWR5KCkpIHsKICAgICAgICAgU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuRGVsYXlTZXJ2aWNlKCp0aGlzKTsKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNhbm5vdCBzdGFydCBhbiB1cGRhdGFibGUgc2VydmljZSAnIiA8PCBuYW1lXwogICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWZvcmUgY29uZmlncyBmcm9tIEFQRVhlcyBhcmUgYWxsIGxvYWRlZC4gIgpAQCAtNzA1LDIxICs3MDEsMjAgQEAKICAgICBpZiAoQ2dyb3Vwc0F2YWlsYWJsZSgpKSB7CiAgICAgICAgIGJvb2wgdXNlX21lbWNnID0gc3dhcHBpbmVzc18gIT0gLTEgfHwgc29mdF9saW1pdF9pbl9ieXRlc18gIT0gLTEgfHwgbGltaXRfaW5fYnl0ZXNfICE9IC0xIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRfcGVyY2VudF8gIT0gLTEgfHwgIWxpbWl0X3Byb3BlcnR5Xy5lbXB0eSgpOwotICAgICAgICBlcnJubyA9IC1jcmVhdGVQcm9jZXNzR3JvdXAocHJvY19hdHRyXy51aWQsIHBpZF8sIHVzZV9tZW1jZyk7CisgICAgICAgIGVycm5vID0gLWNyZWF0ZVByb2Nlc3NHcm91cCh1aWQoKSwgcGlkXywgdXNlX21lbWNnKTsKICAgICAgICAgaWYgKGVycm5vICE9IDApIHsKICAgICAgICAgICAgIFJlc3VsdDx2b2lkPiByZXN1bHQgPSBjZ3JvdXBzX2FjdGl2YXRlZC5Xcml0ZShrQWN0aXZhdGluZ0Nncm91cHNGYWlsZWQpOwogICAgICAgICAgICAgaWYgKCFyZXN1bHQub2soKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQ6ICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiY3JlYXRlUHJvY2Vzc0dyb3VwKCIgPDwgcHJvY19hdHRyXy51aWQgPDwgIiwgIiA8PCBwaWRfIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHVzZV9tZW1jZyA8PCAiKSBmYWlsZWQgZm9yIHNlcnZpY2UgJyIgPDwgbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJjcmVhdGVQcm9jZXNzR3JvdXAoIiA8PCB1aWQoKSA8PCAiLCAiIDw8IHBpZF8gPDwgIiwgIiA8PCB1c2VfbWVtY2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIGZhaWxlZCBmb3Igc2VydmljZSAnIiA8PCBuYW1lXyA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBXaGVuIHRoZSBibGtpbyBjb250cm9sbGVyIGlzIG1vdW50ZWQgaW4gdGhlIHYxIGhpZXJhcmNoeSwgTm9ybWFsSW9Qcmlvcml0eSBpcwogICAgICAgICAvLyB0aGUgZGVmYXVsdCAoL2Rldi9ibGtpbykuIFdoZW4gdGhlIGJsa2lvIGNvbnRyb2xsZXIgaXMgbW91bnRlZCBpbiB0aGUgdjIgaGllcmFyY2h5LCB0aGUKICAgICAgICAgLy8gTm9ybWFsSW9Qcmlvcml0eSBwcm9maWxlIGhhcyB0byBiZSBhcHBsaWVkIGV4cGxpY2l0bHkuCi0gICAgICAgIFNldFByb2Nlc3NQcm9maWxlcyhwcm9jX2F0dHJfLnVpZCwgcGlkXywgeyJOb3JtYWxJb1ByaW9yaXR5In0pOworICAgICAgICBTZXRQcm9jZXNzUHJvZmlsZXModWlkKCksIHBpZF8sIHsiTm9ybWFsSW9Qcmlvcml0eSJ9KTsKIAogICAgICAgICBpZiAodXNlX21lbWNnKSB7CiAgICAgICAgICAgICBDb25maWd1cmVNZW1jZygpOwpAQCAtNzI3LDcgKzcyMiw3IEBACiAgICAgfQogCiAgICAgaWYgKG9vbV9zY29yZV9hZGp1c3RfICE9IERFRkFVTFRfT09NX1NDT1JFX0FESlVTVCkgewotICAgICAgICBMbWtkUmVnaXN0ZXIobmFtZV8sIHByb2NfYXR0cl8udWlkLCBwaWRfLCBvb21fc2NvcmVfYWRqdXN0Xyk7CisgICAgICAgIExta2RSZWdpc3RlcihuYW1lXywgdWlkKCksIHBpZF8sIG9vbV9zY29yZV9hZGp1c3RfKTsKICAgICB9CiAKICAgICBpZiAoUmVzdWx0PHZvaWQ+IHJlc3VsdCA9IGNncm91cHNfYWN0aXZhdGVkLldyaXRlKGtDZ3JvdXBzQWN0aXZhdGVkKTsgIXJlc3VsdC5vaygpKSB7CkBAIC03OTgsNiArNzkzLDM1IEBACiAgICAgbW91bnRfbmFtZXNwYWNlXyA9IElzRGVmYXVsdE1vdW50TmFtZXNwYWNlUmVhZHkoKSA/IE5TX0RFRkFVTFQgOiBOU19CT09UU1RSQVA7CiB9CiAKK3N0YXRpYyBpbnQgVGhyZWFkQ291bnQoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgZGVjbHR5cGUoJmNsb3NlZGlyKT4gZGlyKG9wZW5kaXIoIi9wcm9jL3NlbGYvdGFzayIpLCBjbG9zZWRpcik7CisgICAgaWYgKCFkaXIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBjb3VudCA9IDA7CisgICAgZGlyZW50KiBlbnRyeTsKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIuZ2V0KCkpKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChlbnRyeS0+ZF9uYW1lWzBdICE9ICcuJykgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8vIE11c3QgYmUgY2FsbGVkIEJFRk9SRSBhbnkgdGhyZWFkcyBhcmUgY3JlYXRlZC4gU2VlIGFsc28gdGhlIHNpZ3Byb2NtYXNrKCkgbWFuIHBhZ2UuCit1bmlxdWVfZmQgU2VydmljZTo6Q3JlYXRlU2lnY2hsZEZkKCkgeworICAgIENIRUNLX0VRKFRocmVhZENvdW50KCksIDEpOworICAgIHNpZ3NldF90IG1hc2s7CisgICAgc2lnZW1wdHlzZXQoJm1hc2spOworICAgIHNpZ2FkZHNldCgmbWFzaywgU0lHQ0hMRCk7CisgICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJm1hc2ssIG51bGxwdHIpIDwgMCkgeworICAgICAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGJsb2NrIFNJR0NITEQiOworICAgIH0KKworICAgIHJldHVybiB1bmlxdWVfZmQoc2lnbmFsZmQoLTEsICZtYXNrLCBTRkRfQ0xPRVhFQykpOworfQorCiB2b2lkIFNlcnZpY2U6OlNldFN0YXJ0ZWRJbkZpcnN0U3RhZ2UocGlkX3QgcGlkKSB7CiAgICAgTE9HKElORk8pIDw8ICJhZGRpbmcgZmlyc3Qtc3RhZ2Ugc2VydmljZSAnIiA8PCBuYW1lXyA8PCAiJy4uLiI7CiAKZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZS5oIGIvaW5pdC9zZXJ2aWNlLmgKaW5kZXggM2VmODkwMi4uNWU5YWYyNSAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlLmgKKysrIGIvaW5pdC9zZXJ2aWNlLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgpAQCAtNTksNyArNjAsNyBAQAogI2RlZmluZSBTVkNfR0VOVExFX0tJTEwgMHgyMDAwICAvLyBUaGlzIHNlcnZpY2Ugc2hvdWxkIGJlIHN0b3BwZWQgd2l0aCBTSUdURVJNIGluc3RlYWQgb2YgU0lHS0lMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWxsIHN0aWxsIGJlIFNJR0tJTExlZCBhZnRlciB0aW1lb3V0IHBlcmlvZCBvZiAyMDAgbXMKIAotI2RlZmluZSBOUl9TVkNfU1VQUF9HSURTIDEyICAgIC8vIHR3ZWx2ZSBzdXBwbGVtZW50YXJ5IGdyb3VwcworI2RlZmluZSBOUl9TVkNfU1VQUF9HSURTIDMyICAgIC8vIHRoaXJ0eSB0d28gc3VwcGxlbWVudGFyeSBncm91cHMKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewpAQCAtNzEsNyArNzIsNyBAQAogICAgIFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFN1YmNvbnRleHQqIHN1YmNvbnRleHRfZm9yX3Jlc3RhcnRfY29tbWFuZHMsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7CiAKLSAgICBTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1bnNpZ25lZCBmbGFncywgdWlkX3QgdWlkLCBnaWRfdCBnaWQsCisgICAgU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgdW5zaWduZWQgZmxhZ3MsIHN0ZDo6b3B0aW9uYWw8dWlkX3Q+IHVpZCwgZ2lkX3QgZ2lkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Z2lkX3Q+JiBzdXBwX2dpZHMsIGludCBuYW1lc3BhY2VfZmxhZ3MsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNsYWJlbCwKICAgICAgICAgICAgIFN1YmNvbnRleHQqIHN1YmNvbnRleHRfZm9yX3Jlc3RhcnRfY29tbWFuZHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7CkBAIC0xMTUsNyArMTE2LDggQEAKICAgICBwaWRfdCBwaWQoKSBjb25zdCB7IHJldHVybiBwaWRfOyB9CiAgICAgYW5kcm9pZDo6YmFzZTo6Ym9vdF9jbG9jazo6dGltZV9wb2ludCB0aW1lX3N0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiB0aW1lX3N0YXJ0ZWRfOyB9CiAgICAgaW50IGNyYXNoX2NvdW50KCkgY29uc3QgeyByZXR1cm4gY3Jhc2hfY291bnRfOyB9Ci0gICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gcHJvY19hdHRyXy51aWQ7IH0KKyAgICBpbnQgd2FzX2xhc3RfZXhpdF9vaygpIGNvbnN0IHsgcmV0dXJuIHdhc19sYXN0X2V4aXRfb2tfOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gcHJvY19hdHRyXy51aWQoKTsgfQogICAgIGdpZF90IGdpZCgpIGNvbnN0IHsgcmV0dXJuIHByb2NfYXR0cl8uZ2lkOyB9CiAgICAgaW50IG5hbWVzcGFjZV9mbGFncygpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZXNfLmZsYWdzOyB9CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Z2lkX3Q+JiBzdXBwX2dpZHMoKSBjb25zdCB7IHJldHVybiBwcm9jX2F0dHJfLnN1cHBfZ2lkczsgfQpAQCAtMTMwLDcgKzEzMiwxNSBAQAogICAgIGJvb2wgcHJvY2Vzc19jZ3JvdXBfZW1wdHkoKSBjb25zdCB7IHJldHVybiBwcm9jZXNzX2Nncm91cF9lbXB0eV87IH0KICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X29yZGVyKCkgY29uc3QgeyByZXR1cm4gc3RhcnRfb3JkZXJfOyB9CiAgICAgdm9pZCBzZXRfc2lnc3RvcChib29sIHZhbHVlKSB7IHNpZ3N0b3BfID0gdmFsdWU7IH0KLSAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyByZXN0YXJ0X3BlcmlvZCgpIGNvbnN0IHsgcmV0dXJuIHJlc3RhcnRfcGVyaW9kXzsgfQorICAgIHN0ZDo6Y2hyb25vOjpzZWNvbmRzIHJlc3RhcnRfcGVyaW9kKCkgY29uc3QgeworICAgICAgICAvLyBJZiB0aGUgc2VydmljZSBleGl0ZWQgYWJub3JtYWxseSBvciBkdWUgdG8gdGltZW91dCwgbGF0ZSBsaW1pdCB0aGUgcmVzdGFydCBldmVuIGlmCisgICAgICAgIC8vIHJlc3RhcnRfcGVyaW9kIGlzIHNldCB0byBhIHZlcnkgc2hvcnQgdmFsdWUuCisgICAgICAgIC8vIElmIG5vdCwgaS5lLiByZXN0YXJ0IGFmdGVyIGEgZGVsaWJlcmF0ZSBhbmQgc3VjY2Vzc2Z1bCBleGl0LCByZXNwZWN0IHRoZSBwZXJpb2QuCisgICAgICAgIGlmICghd2FzX2xhc3RfZXhpdF9va18pIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1heChyZXN0YXJ0X3BlcmlvZF8sIGRlZmF1bHRfcmVzdGFydF9wZXJpb2RfKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdGFydF9wZXJpb2RfOworICAgIH0KICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6Y2hyb25vOjpzZWNvbmRzPiB0aW1lb3V0X3BlcmlvZCgpIGNvbnN0IHsgcmV0dXJuIHRpbWVvdXRfcGVyaW9kXzsgfQogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncygpIGNvbnN0IHsgcmV0dXJuIGFyZ3NfOyB9CiAgICAgYm9vbCBpc191cGRhdGFibGUoKSBjb25zdCB7IHJldHVybiB1cGRhdGFibGVfOyB9CkBAIC0xNDYsMTEgKzE1NiwxNSBAQAogICAgIGNvbnN0IFN1YmNvbnRleHQqIHN1YmNvbnRleHQoKSBjb25zdCB7IHJldHVybiBzdWJjb250ZXh0XzsgfQogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVuYW1lXzsgfQogICAgIHZvaWQgc2V0X2ZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGZpbGVuYW1lXyA9IG5hbWU7IH0KKyAgICBzdGF0aWMgaW50IEdldFNpZ2NobGRGZCgpIHsKKyAgICAgICAgc3RhdGljIGludCBzaWdjaGxkX2ZkID0gQ3JlYXRlU2lnY2hsZEZkKCkucmVsZWFzZSgpOworICAgICAgICByZXR1cm4gc2lnY2hsZF9mZDsKKyAgICB9CiAKICAgcHJpdmF0ZToKICAgICB2b2lkIE5vdGlmeVN0YXRlQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdfc3RhdGUpIGNvbnN0OwogICAgIHZvaWQgU3RvcE9yUmVzZXQoaW50IGhvdyk7Ci0gICAgdm9pZCBLaWxsUHJvY2Vzc0dyb3VwKGludCBzaWduYWwsIGJvb2wgcmVwb3J0X29uZXNob3QgPSBmYWxzZSk7CisgICAgdm9pZCBLaWxsUHJvY2Vzc0dyb3VwKGludCBzaWduYWwpOwogICAgIHZvaWQgU2V0UHJvY2Vzc0F0dHJpYnV0ZXNBbmRDYXBzKEludGVycHJvY2Vzc0ZpZm8gc2V0c2lkX2ZpbmlzaGVkKTsKICAgICB2b2lkIFJlc2V0RmxhZ3NGb3JTdGFydCgpOwogICAgIFJlc3VsdDx2b2lkPiBDaGVja0NvbnNvbGUoKTsKQEAgLTE1OCw2ICsxNzIsOCBAQAogICAgIHZvaWQgUnVuU2VydmljZShjb25zdCBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcnMsIEludGVycHJvY2Vzc0ZpZm8gY2dyb3Vwc19hY3RpdmF0ZWQsCiAgICAgICAgICAgICAgICAgICAgIEludGVycHJvY2Vzc0ZpZm8gc2V0c2lkX2ZpbmlzaGVkKTsKICAgICB2b2lkIFNldE1vdW50TmFtZXNwYWNlKCk7CisgICAgc3RhdGljIDo6YW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIENyZWF0ZVNpZ2NobGRGZCgpOworCiAgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9zdGFydF9vcmRlcl87CiAgICAgc3RhdGljIGJvb2wgaXNfZXhlY19zZXJ2aWNlX3J1bm5pbmdfOwogCkBAIC0xNzIsNiArMTg4LDggQEAKICAgICBib29sIHVwZ3JhZGVkX210ZV8gPSBmYWxzZTsgICAgICAgICAgIC8vIHdoZXRoZXIgd2UgdXBncmFkZWQgYXN5bmMgTVRFIC0+IHN5bmMgTVRFIGJlZm9yZQogICAgIHN0ZDo6Y2hyb25vOjptaW51dGVzIGZhdGFsX2NyYXNoX3dpbmRvd18gPSA0bWluOyAgLy8gZmF0YWwoKSB3aGVuIG1vcmUgdGhhbiA0IGNyYXNoZXMgaW4gaXQKICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBmYXRhbF9yZWJvb3RfdGFyZ2V0XzsgIC8vIHJlYm9vdCB0YXJnZXQgb2YgZmF0YWwgaGFuZGxlcgorICAgIGJvb2wgd2FzX2xhc3RfZXhpdF9va18gPQorICAgICAgICAgICAgdHJ1ZTsgIC8vIHRydWUgaWYgdGhlIHNlcnZpY2UgbmV2ZXIgZXhpdGVkLCBvciBleGl0ZWQgd2l0aCBzdGF0dXMgY29kZSAwCiAKICAgICBzdGQ6Om9wdGlvbmFsPENhcFNldD4gY2FwYWJpbGl0aWVzXzsKICAgICBQcm9jZXNzQXR0cmlidXRlcyBwcm9jX2F0dHJfOwpAQCAtMjE0LDcgKzIzMiw4IEBACiAKICAgICBib29sIHNpZ3N0b3BfID0gZmFsc2U7CiAKLSAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyByZXN0YXJ0X3BlcmlvZF8gPSA1czsKKyAgICBjb25zdCBzdGQ6OmNocm9ubzo6c2Vjb25kcyBkZWZhdWx0X3Jlc3RhcnRfcGVyaW9kXyA9IDVzOworICAgIHN0ZDo6Y2hyb25vOjpzZWNvbmRzIHJlc3RhcnRfcGVyaW9kXyA9IGRlZmF1bHRfcmVzdGFydF9wZXJpb2RfOwogICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpjaHJvbm86OnNlY29uZHM+IHRpbWVvdXRfcGVyaW9kXzsKIAogICAgIGJvb2wgdXBkYXRhYmxlXyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlX2xpc3QuY3BwIGIvaW5pdC9zZXJ2aWNlX2xpc3QuY3BwCmluZGV4IDkzN2Q4MmUuLjFjNTZlOGEgMTAwNjQ0Ci0tLSBhL2luaXQvc2VydmljZV9saXN0LmNwcAorKysgYi9pbml0L3NlcnZpY2VfbGlzdC5jcHAKQEAgLTc2LDEwICs3Niw3IEBACiAgICAgcmV0dXJuIHBvc3RfZGF0YV87CiB9CiAKLXZvaWQgU2VydmljZUxpc3Q6Ok1hcmtTZXJ2aWNlc1VwZGF0ZSgpIHsKLSAgICBzZXJ2aWNlc191cGRhdGVfZmluaXNoZWRfID0gdHJ1ZTsKLQotICAgIC8vIHN0YXJ0IHRoZSBkZWxheWVkIHNlcnZpY2VzCit2b2lkIFNlcnZpY2VMaXN0OjpTdGFydERlbGF5ZWRTZXJ2aWNlcygpIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBkZWxheWVkX3NlcnZpY2VfbmFtZXNfKSB7CiAgICAgICAgIFNlcnZpY2UqIHNlcnZpY2UgPSBGaW5kU2VydmljZShuYW1lKTsKICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbHB0cikgewpAQCAtOTQsNyArOTEsNyBAQAogfQogCiB2b2lkIFNlcnZpY2VMaXN0OjpEZWxheVNlcnZpY2UoY29uc3QgU2VydmljZSYgc2VydmljZSkgewotICAgIGlmIChzZXJ2aWNlc191cGRhdGVfZmluaXNoZWRfKSB7CisgICAgaWYgKElzRGVmYXVsdE1vdW50TmFtZXNwYWNlUmVhZHkoKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZGVsYXkgdGhlIHN0YXJ0IG9mIHNlcnZpY2UgJyIgPDwgc2VydmljZS5uYW1lKCkKICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGFsbCBzZXJ2aWNlcyBhcmUgYWxyZWFkeSB1cGRhdGVkLiBJZ25vcmluZy4iOwogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9pbml0L3NlcnZpY2VfbGlzdC5oIGIvaW5pdC9zZXJ2aWNlX2xpc3QuaAppbmRleCBmODU4YmMzLi40NGU4NDUzIDEwMDY0NAotLS0gYS9pbml0L3NlcnZpY2VfbGlzdC5oCisrKyBiL2luaXQvc2VydmljZV9saXN0LmgKQEAgLTg1LDE0ICs4NSwxMCBAQAogCiAgICAgdm9pZCBNYXJrUG9zdERhdGEoKTsKICAgICBib29sIElzUG9zdERhdGEoKTsKLSAgICB2b2lkIE1hcmtTZXJ2aWNlc1VwZGF0ZSgpOwotICAgIGJvb2wgSXNTZXJ2aWNlc1VwZGF0ZWQoKSBjb25zdCB7IHJldHVybiBzZXJ2aWNlc191cGRhdGVfZmluaXNoZWRfOyB9CiAgICAgdm9pZCBEZWxheVNlcnZpY2UoY29uc3QgU2VydmljZSYgc2VydmljZSk7CisgICAgdm9pZCBTdGFydERlbGF5ZWRTZXJ2aWNlcygpOwogCi0gICAgdm9pZCBSZXNldFN0YXRlKCkgewotICAgICAgICBwb3N0X2RhdGFfID0gZmFsc2U7Ci0gICAgICAgIHNlcnZpY2VzX3VwZGF0ZV9maW5pc2hlZF8gPSBmYWxzZTsKLSAgICB9CisgICAgdm9pZCBSZXNldFN0YXRlKCkgeyBwb3N0X2RhdGFfID0gZmFsc2U7IH0KIAogICAgIGF1dG8gc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXy5zaXplKCk7IH0KIApAQCAtMTAwLDcgKzk2LDYgQEAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U2VydmljZT4+IHNlcnZpY2VzXzsKIAogICAgIGJvb2wgcG9zdF9kYXRhXyA9IGZhbHNlOwotICAgIGJvb2wgc2VydmljZXNfdXBkYXRlX2ZpbmlzaGVkXyA9IGZhbHNlOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZWxheWVkX3NlcnZpY2VfbmFtZXNfOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlX3BhcnNlci5jcHAgYi9pbml0L3NlcnZpY2VfcGFyc2VyLmNwcAppbmRleCAzNTYzMDg0Li45MmUzNTBiIDEwMDY0NAotLS0gYS9pbml0L3NlcnZpY2VfcGFyc2VyLmNwcAorKysgYi9pbml0L3NlcnZpY2VfcGFyc2VyLmNwcApAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8aGlkbC11dGlsL0ZRTmFtZS5oPgogI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuaD4KQEAgLTE3OCw4ICsxNzksOSBAQAogICAgIGlmICghUGFyc2VJbnQoYXJnc1sxXSwgJnNlcnZpY2VfLT5wcm9jX2F0dHJfLnByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihBTkRST0lEX1BSSU9SSVRZX0hJR0hFU1QpLCAgLy8gaGlnaGVzdCBpcyBuZWdhdGl2ZQogICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihBTkRST0lEX1BSSU9SSVRZX0xPV0VTVCkpKSB7Ci0gICAgICAgIHJldHVybiBFcnJvcmYoInByb2Nlc3MgcHJpb3JpdHkgdmFsdWUgbXVzdCBiZSByYW5nZSB7fSAtIHt9IiwgQU5EUk9JRF9QUklPUklUWV9ISUdIRVNULAotICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfTE9XRVNUKTsKKyAgICAgICAgcmV0dXJuIEVycm9yZigicHJvY2VzcyBwcmlvcml0eSB2YWx1ZSBtdXN0IGJlIHJhbmdlIHt9IC0ge30iLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQU5EUk9JRF9QUklPUklUWV9ISUdIRVNUKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KEFORFJPSURfUFJJT1JJVFlfTE9XRVNUKSk7CiAgICAgfQogICAgIHJldHVybiB7fTsKIH0KQEAgLTM2OSw4ICszNzEsOCBAQAogCiBSZXN1bHQ8dm9pZD4gU2VydmljZVBhcnNlcjo6UGFyc2VSZXN0YXJ0UGVyaW9kKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYmIGFyZ3MpIHsKICAgICBpbnQgcGVyaW9kOwotICAgIGlmICghUGFyc2VJbnQoYXJnc1sxXSwgJnBlcmlvZCwgNSkpIHsKLSAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgInJlc3RhcnRfcGVyaW9kIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciA+PSA1IjsKKyAgICBpZiAoIVBhcnNlSW50KGFyZ3NbMV0sICZwZXJpb2QsIDApKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJyZXN0YXJ0X3BlcmlvZCB2YWx1ZSBtdXN0IGJlIGFuIGludGVnZXIgPj0gMCI7CiAgICAgfQogICAgIHNlcnZpY2VfLT5yZXN0YXJ0X3BlcmlvZF8gPSBzdGQ6OmNocm9ubzo6c2Vjb25kcyhwZXJpb2QpOwogICAgIHJldHVybiB7fTsKQEAgLTUzNCw3ICs1MzYsNyBAQAogICAgIGlmICghdWlkLm9rKCkpIHsKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIlVuYWJsZSB0byBmaW5kIFVJRCBmb3IgJyIgPDwgYXJnc1sxXSA8PCAiJzogIiA8PCB1aWQuZXJyb3IoKTsKICAgICB9Ci0gICAgc2VydmljZV8tPnByb2NfYXR0cl8udWlkID0gKnVpZDsKKyAgICBzZXJ2aWNlXy0+cHJvY19hdHRyXy5wYXJzZWRfdWlkID0gKnVpZDsKICAgICByZXR1cm4ge307CiB9CiAKQEAgLTY3Nyw2ICs2NzksMTYgQEAKICAgICAgICAgcmV0dXJuIHt9OwogICAgIH0KIAorICAgIGlmIChzZXJ2aWNlXy0+cHJvY19hdHRyXy5wYXJzZWRfdWlkID09IHN0ZDo6bnVsbG9wdCkgeworICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInJvLnZlbmRvci5hcGlfbGV2ZWwiLCAwKSA+IF9fQU5EUk9JRF9BUElfVV9fKSB7CisgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiTm8gdXNlciBzcGVjaWZpZWQgZm9yIHNlcnZpY2UgJyIgPDwgc2VydmljZV8tPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicuIERlZmF1bHRzIHRvIHJvb3QuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gdXNlciBzcGVjaWZpZWQgZm9yIHNlcnZpY2UgJyIgPDwgc2VydmljZV8tPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLiBEZWZhdWx0cyB0byByb290LiI7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV8pIHsKICAgICAgICAgaWYgKGNvbnN0IGF1dG8mIGNoZWNrX2hpZXJhcmNoeV9yZXN1bHQgPSBDaGVja0ludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5KAogICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlXy0+aW50ZXJmYWNlcygpLCAqaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV8pOwpkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlX3Rlc3QuY3BwIGIvaW5pdC9zZXJ2aWNlX3Rlc3QuY3BwCmluZGV4IDg3YTJjZTUuLmEzNTkwYjUgMTAwNjQ0Ci0tLSBhL2luaXQvc2VydmljZV90ZXN0LmNwcAorKysgYi9pbml0L3NlcnZpY2VfdGVzdC5jcHAKQEAgLTE3LDE4ICsxNyw0NSBAQAogI2luY2x1ZGUgInNlcnZpY2UuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxzeXMvc2lnbmFsZmQuaD4KICNpbmNsdWRlICJsbWtkX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJyZWJvb3QuaCIKKyNpbmNsdWRlICJzZXJ2aWNlLmgiCisjaW5jbHVkZSAic2VydmljZV9saXN0LmgiCisjaW5jbHVkZSAic2VydmljZV9wYXJzZXIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpTdHJpbmdSZXBsYWNlOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GZDsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKIAorc3RhdGljIHN0ZDo6c3RyaW5nIEdldFNlY3VyaXR5Q29udGV4dCgpIHsKKyAgICBjaGFyKiBjdHg7CisgICAgaWYgKGdldGNvbigmY3R4KSA9PSAtMSkgeworICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJGYWlsZWQgdG8gY2FsbCBnZXRjb24gOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0e2N0eH07CisgICAgZnJlZWNvbihjdHgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKIFRFU1Qoc2VydmljZSwgcG9kX2luaXRpYWxpemVkKSB7CiAgICAgY29uc3RleHByIGF1dG8gbWVtb3J5X3NpemUgPSBzaXplb2YoU2VydmljZSk7CiAgICAgYWxpZ25hcyhhbGlnbm9mKFNlcnZpY2UpKSB1bnNpZ25lZCBjaGFyIG9sZF9tZW1vcnlbbWVtb3J5X3NpemVdOwpAQCAtMTkwLDUgKzIxNyw2OSBAQAogICAgIFRlc3RfbWFrZV90ZW1wb3Jhcnlfb25lc2hvdF9zZXJ2aWNlKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiB9CiAKKy8vIFJldHVybnMgdGhlIHBhdGggaW4gdGhlIHYyIGNncm91cCBoaWVyYXJjaHkgZm9yIGEgZ2l2ZW4gcHJvY2VzcyBpbiB0aGUgZm9ybWF0IC91aWRfJWQvcGlkXyVkLgorc3RhdGljIHN0ZDo6c3RyaW5nIENncm91cFBhdGgocGlkX3QgcGlkKSB7CisgICAgc3RkOjpzdHJpbmcgY2dyb3VwX3BhdGggPSBTdHJpbmdQcmludGYoIi9wcm9jLyVkL2Nncm91cCIsIHBpZCk7CisgICAgc3RkOjppZnN0cmVhbSBpcyhjZ3JvdXBfcGF0aCwgc3RkOjppb3M6OmluKTsKKyAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoaXMsIGxpbmUpKSB7CisgICAgICAgIGlmIChsaW5lLnN1YnN0cigwLCAzKSA9PSAiMDo6IikgeworICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyKDMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7fTsKK30KKworY2xhc3MgU2VydmljZVN0b3BUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Ym9vbD4ge307CisKKy8vIEJlZm9yZSBOb3ZlbWJlciAyMDIzLCBwcm9jZXNzZXMgdGhhdCB3ZXJlIG1pZ3JhdGVkIHRvIGFub3RoZXIgdjIgY2dyb3VwIHdlcmUgaWdub3JlZCBieQorLy8gU2VydmljZTo6U3RvcCgpIGlmIHRoZWlyIHVpZF8lZC9waWRfJWQgY2dyb3VwIGRpcmVjdG9yeSBnb3QgcmVtb3ZlZC4gVGhpcyB0ZXN0LCBpZiBydW4gd2l0aCB0aGUKKy8vIHBhcmFtZXRlciBzZXQgdG8gJ3RydWUnLCB2ZXJpZmllcyB0aGF0IHN1Y2ggc2VydmljZXMgYXJlIHN0b3BwZWQuCitURVNUX1AoU2VydmljZVN0b3BUZXN0LCBzdG9wKSB7CisgICAgaWYgKGdldHVpZCgpICE9IDApIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJNdXN0IGJlIHJ1biBhcyByb290LiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6c3RyaW5nX3ZpZXcga1NlcnZpY2VOYW1lID0gIlNlcnZpY2VBIjsKKyAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6c3RyaW5nX3ZpZXcga1NjcmlwdFRlbXBsYXRlID0gUiJpbml0KAorc2VydmljZSAkbmFtZSAvc3lzdGVtL2Jpbi95ZXMKKyAgICB1c2VyIHNoZWxsCisgICAgZ3JvdXAgc2hlbGwKKyAgICBzZWNsYWJlbCAkc2VsYWJlbAorKWluaXQiOworCisgICAgc3RkOjpzdHJpbmcgc2NyaXB0ID0gU3RyaW5nUmVwbGFjZShTdHJpbmdSZXBsYWNlKGtTY3JpcHRUZW1wbGF0ZSwgIiRuYW1lIiwga1NlcnZpY2VOYW1lLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHNlbGFiZWwiLCBHZXRTZWN1cml0eUNvbnRleHQoKSwgZmFsc2UpOworICAgIFNlcnZpY2VMaXN0JiBzZXJ2aWNlX2xpc3QgPSBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKTsKKyAgICBQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJzZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFNlcnZpY2VQYXJzZXI+KCZzZXJ2aWNlX2xpc3QsIG51bGxwdHIsIHN0ZDo6bnVsbG9wdCkpOworCisgICAgVGVtcG9yYXJ5RmlsZSB0ZjsKKyAgICBBU1NFUlRfR0UodGYuZmQsIDApOworICAgIEFTU0VSVF9UUlVFKFdyaXRlU3RyaW5nVG9GZChzY3JpcHQsIHRmLmZkKSk7CisgICAgQVNTRVJUX1RSVUUocGFyc2VyLlBhcnNlQ29uZmlnKHRmLnBhdGgpKTsKKworICAgIFNlcnZpY2UqIGNvbnN0IHNlcnZpY2UgPSBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5GaW5kU2VydmljZShrU2VydmljZU5hbWUpOworICAgIEFTU0VSVF9ORShzZXJ2aWNlLCBudWxscHRyKTsKKyAgICBBU1NFUlRfUkVTVUxUX09LKHNlcnZpY2UtPlN0YXJ0KCkpOworICAgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPklzUnVubmluZygpKTsKKyAgICBpZiAoR2V0UGFyYW0oKSkgeworICAgICAgICBjb25zdCBwaWRfdCBwaWQgPSBzZXJ2aWNlLT5waWQoKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2dyb3VwX3BhdGggPSBDZ3JvdXBQYXRoKHBpZCk7CisgICAgICAgIEVYUEVDVF9ORShjZ3JvdXBfcGF0aCwgIiIpOworICAgICAgICBFWFBFQ1RfTkUoY2dyb3VwX3BhdGgsICIvIik7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBpZF9zdHIgPSBzdGQ6OnRvX3N0cmluZyhwaWQpOworICAgICAgICBFWFBFQ1RfVFJVRShXcml0ZVN0cmluZ1RvRmlsZShwaWRfc3RyLCAiL3N5cy9mcy9jZ3JvdXAvY2dyb3VwLnByb2NzIikpOworICAgICAgICBFWFBFQ1RfRVEoQ2dyb3VwUGF0aChwaWQpLCAiLyIpOworICAgICAgICBFWFBFQ1RfRVEocm1kaXIoKCIvc3lzL2ZzL2Nncm91cCIgKyBjZ3JvdXBfcGF0aCkuY19zdHIoKSksIDApOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMCwgU3RvcFNlcnZpY2VzQW5kTG9nVmlvbGF0aW9ucyh7c2VydmljZS0+bmFtZSgpfSwgMTBzLCAvKnRlcm1pbmF0ZT0qL3RydWUpKTsKKyAgICBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5SZW1vdmVTZXJ2aWNlKCpzZXJ2aWNlKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKHNlcnZpY2UsIFNlcnZpY2VTdG9wVGVzdCwgdGVzdGluZzo6VmFsdWVzKGZhbHNlLCB0cnVlKSk7CisKIH0gIC8vIG5hbWVzcGFjZSBpbml0CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlX3V0aWxzLmNwcCBiL2luaXQvc2VydmljZV91dGlscy5jcHAKaW5kZXggNzAwNGQ4ZC4uMGUxOWJjYyAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlX3V0aWxzLmNwcAorKysgYi9pbml0L3NlcnZpY2VfdXRpbHMuY3BwCkBAIC0yNzEsOCArMjcxLDggQEAKICAgICBpZiAoc2V0Z3JvdXBzKGF0dHIuc3VwcF9naWRzLnNpemUoKSwgY29uc3RfY2FzdDxnaWRfdCo+KCZhdHRyLnN1cHBfZ2lkc1swXSkpICE9IDApIHsKICAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAic2V0Z3JvdXBzIGZhaWxlZCI7CiAgICAgfQotICAgIGlmIChhdHRyLnVpZCkgewotICAgICAgICBpZiAoc2V0dWlkKGF0dHIudWlkKSAhPSAwKSB7CisgICAgaWYgKGF0dHIudWlkKCkpIHsKKyAgICAgICAgaWYgKHNldHVpZChhdHRyLnVpZCgpKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJzZXR1aWQgZmFpbGVkIjsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV91dGlscy5oIGIvaW5pdC9zZXJ2aWNlX3V0aWxzLmgKaW5kZXggZDQxNDNhYS4uMjdlYzQ1MCAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlX3V0aWxzLmgKKysrIGIvaW5pdC9zZXJ2aWNlX3V0aWxzLmgKQEAgLTkxLDExICs5MSwxMyBAQAogICAgIElvU2NoZWRDbGFzcyBpb3ByaW9fY2xhc3M7CiAgICAgaW50IGlvcHJpb19wcmk7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgcmxpbWl0Pj4gcmxpbWl0czsKLSAgICB1aWRfdCB1aWQ7CisgICAgc3RkOjpvcHRpb25hbDx1aWRfdD4gcGFyc2VkX3VpZDsKICAgICBnaWRfdCBnaWQ7CiAgICAgc3RkOjp2ZWN0b3I8Z2lkX3Q+IHN1cHBfZ2lkczsKICAgICBpbnQgcHJpb3JpdHk7CiAgICAgYm9vbCBzdGRpb190b19rbXNnOworCisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gcGFyc2VkX3VpZC52YWx1ZV9vcigwKTsgfQogfTsKIAogaW5saW5lIGJvb2wgUmVxdWlyZXNDb25zb2xlKGNvbnN0IFByb2Nlc3NBdHRyaWJ1dGVzJiBhdHRyKSB7CmRpZmYgLS1naXQgYS9pbml0L3NpZ2NobGRfaGFuZGxlci5jcHAgYi9pbml0L3NpZ2NobGRfaGFuZGxlci5jcHAKaW5kZXggZjhjNTAxZi4uOGU5ZTcxMyAxMDA2NDQKLS0tIGEvaW5pdC9zaWdjaGxkX2hhbmRsZXIuY3BwCisrKyBiL2luaXQvc2lnY2hsZF9oYW5kbGVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbGZkLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CkBAIC0zMSw2ICszMiw3IEBACiAKICNpbmNsdWRlIDx0aHJlYWQ+CiAKKyNpbmNsdWRlICJlcG9sbC5oIgogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJzZXJ2aWNlLmgiCiAjaW5jbHVkZSAic2VydmljZV9saXN0LmgiCkBAIC0xMTYsMzMgKzExOCw3NiBAQAogICAgIHJldHVybiBwaWQ7CiB9CiAKLXZvaWQgUmVhcEFueU91dHN0YW5kaW5nQ2hpbGRyZW4oKSB7Ci0gICAgd2hpbGUgKFJlYXBPbmVQcm9jZXNzKCkgIT0gMCkgeworc3RkOjpzZXQ8cGlkX3Q+IFJlYXBBbnlPdXRzdGFuZGluZ0NoaWxkcmVuKCkgeworICAgIHN0ZDo6c2V0PHBpZF90PiByZWFwZWRfcGlkczsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IHBpZF90IHBpZCA9IFJlYXBPbmVQcm9jZXNzKCk7CisgICAgICAgIGlmIChwaWQgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYXBlZF9waWRzOworICAgICAgICB9CisgICAgICAgIHJlYXBlZF9waWRzLmVtcGxhY2UocGlkKTsKICAgICB9CiB9CiAKLXZvaWQgV2FpdFRvQmVSZWFwZWQoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKK3N0YXRpYyB2b2lkIFJlYXBBbmRSZW1vdmUoc3RkOjp2ZWN0b3I8cGlkX3Q+JiBhbGl2ZV9waWRzKSB7CisgICAgZm9yIChhdXRvIHBpZCA6IFJlYXBBbnlPdXRzdGFuZGluZ0NoaWxkcmVuKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byBpdCA9IHN0ZDo6ZmluZChhbGl2ZV9waWRzLmJlZ2luKCksIGFsaXZlX3BpZHMuZW5kKCksIHBpZCk7CisgICAgICAgIGlmIChpdCAhPSBhbGl2ZV9waWRzLmVuZCgpKSB7CisgICAgICAgICAgICBhbGl2ZV9waWRzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgSGFuZGxlU2lnbmFsKGludCBzaWduYWxfZmQpIHsKKyAgICBzaWduYWxmZF9zaWdpbmZvIHNpZ2luZm87CisgICAgc3NpemVfdCBieXRlc19yZWFkID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoc2lnbmFsX2ZkLCAmc2lnaW5mbywgc2l6ZW9mKHNpZ2luZm8pKSk7CisgICAgaWYgKGJ5dGVzX3JlYWQgIT0gc2l6ZW9mKHNpZ2luZm8pKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5leHBlY3RlZDogIiA8PCBfX2Z1bmNfXyA8PCAiIHJlYWQgIiA8PCBieXRlc19yZWFkIDw8ICIgYnl0ZXMgaW5zdGVhZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBzaXplb2Yoc2lnaW5mbyk7CisgICAgfQorfQorCit2b2lkIFdhaXRUb0JlUmVhcGVkKGludCBzaWdjaGxkX2ZkLCBjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCkgewogICAgIFRpbWVyIHQ7Ci0gICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IGFsaXZlX3BpZHMocGlkcy5iZWdpbigpLCBwaWRzLmVuZCgpKTsKKyAgICBFcG9sbCBlcG9sbDsKKyAgICBpZiAoc2lnY2hsZF9mZCA+PSAwKSB7CisgICAgICAgIGlmIChhdXRvIHJlc3VsdCA9IGVwb2xsLk9wZW4oKTsgcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgIGVwb2xsLlJlZ2lzdGVySGFuZGxlcihzaWdjaGxkX2ZkLCBbc2lnY2hsZF9mZF0oKSB7IEhhbmRsZVNpZ25hbChzaWdjaGxkX2ZkKTsgfSk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdC5vaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgUmVnaXN0ZXJIYW5kbGVyKCkgZmFpbGVkLiBGYWxsaW5nIGJhY2sgdG8gc2xlZXBfZm9yKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgICAgICAgICAgICAgc2lnY2hsZF9mZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgRXBvbGw6Ok9wZW4oKSBmYWlsZWQuIEZhbGxpbmcgYmFjayB0byBzbGVlcF9mb3IoKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdC5lcnJvcigpOworICAgICAgICAgICAgc2lnY2hsZF9mZCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHBpZF90PiBhbGl2ZV9waWRzKHBpZHMpOworICAgIFJlYXBBbmRSZW1vdmUoYWxpdmVfcGlkcyk7CiAgICAgd2hpbGUgKCFhbGl2ZV9waWRzLmVtcHR5KCkgJiYgdC5kdXJhdGlvbigpIDwgdGltZW91dCkgewotICAgICAgICBwaWRfdCBwaWQ7Ci0gICAgICAgIHdoaWxlICgocGlkID0gUmVhcE9uZVByb2Nlc3MoKSkgIT0gMCkgewotICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChhbGl2ZV9waWRzLmJlZ2luKCksIGFsaXZlX3BpZHMuZW5kKCksIHBpZCk7Ci0gICAgICAgICAgICBpZiAoaXQgIT0gYWxpdmVfcGlkcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIGFsaXZlX3BpZHMuZXJhc2UoaXQpOworICAgICAgICBpZiAoc2lnY2hsZF9mZCA+PSAwKSB7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGVwb2xsLldhaXQoc3RkOjptYXgodGltZW91dCAtIHQuZHVyYXRpb24oKSwgMG1zKSk7CisgICAgICAgICAgICBpZiAocmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgICAgICBSZWFwQW5kUmVtb3ZlKGFsaXZlX3BpZHMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkVwb2xsOjpXYWl0KCkgZmFpbGVkICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGFsaXZlX3BpZHMuZW1wdHkoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDUwbXMpOworICAgICAgICBSZWFwQW5kUmVtb3ZlKGFsaXZlX3BpZHMpOwogICAgIH0KICAgICBMT0coSU5GTykgPDwgIldhaXRpbmcgZm9yICIgPDwgcGlkcy5zaXplKCkgPDwgIiBwaWRzIHRvIGJlIHJlYXBlZCB0b29rICIgPDwgdCA8PCAiIHdpdGggIgogICAgICAgICAgICAgICA8PCBhbGl2ZV9waWRzLnNpemUoKSA8PCAiIG9mIHRoZW0gc3RpbGwgcnVubmluZyI7Ci0gICAgZm9yIChwaWRfdCBwaWQgOiBwaWRzKSB7CisgICAgZm9yIChwaWRfdCBwaWQgOiBhbGl2ZV9waWRzKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHN0YXR1cyA9ICIobm8tc3VjaC1waWQpIjsKICAgICAgICAgUmVhZEZpbGVUb1N0cmluZyhTdHJpbmdQcmludGYoIi9wcm9jLyVkL3N0YXR1cyIsIHBpZCksICZzdGF0dXMpOwotICAgICAgICBMT0coSU5GTykgPDwgIlN0aWxsIHJ1bm5pbmc6ICIgPDwgcGlkIDw8ICcgJyA8PCBzdGF0dXM7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU3RpbGwgcnVubmluZzogIiA8PCBwaWQgPDwgJ1xuJyA8PCBzdGF0dXM7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9pbml0L3NpZ2NobGRfaGFuZGxlci5oIGIvaW5pdC9zaWdjaGxkX2hhbmRsZXIuaAppbmRleCBmYWMxMDIwLi41MzUxMzAyIDEwMDY0NAotLS0gYS9pbml0L3NpZ2NobGRfaGFuZGxlci5oCisrKyBiL2luaXQvc2lnY2hsZF9oYW5kbGVyLmgKQEAgLTE4LDE0ICsxOCwxNiBAQAogI2RlZmluZSBfSU5JVF9TSUdDSExEX0hBTkRMRVJfSF8KIAogI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CiAKLXZvaWQgUmVhcEFueU91dHN0YW5kaW5nQ2hpbGRyZW4oKTsKK3N0ZDo6c2V0PHBpZF90PiBSZWFwQW55T3V0c3RhbmRpbmdDaGlsZHJlbigpOwogCi12b2lkIFdhaXRUb0JlUmVhcGVkKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KTsKK3ZvaWQgV2FpdFRvQmVSZWFwZWQoaW50IHNpZ2NobGRfZmQsIGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KTsKIAogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L3NuYXB1c2VyZF90cmFuc2l0aW9uLmNwcCBiL2luaXQvc25hcHVzZXJkX3RyYW5zaXRpb24uY3BwCmluZGV4IDNhOWZmNWIuLjNhNzgzNDMgMTAwNjQ0Ci0tLSBhL2luaXQvc25hcHVzZXJkX3RyYW5zaXRpb24uY3BwCisrKyBiL2luaXQvc25hcHVzZXJkX3RyYW5zaXRpb24uY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8ZmlsZXN5c3RlbT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgpkaWZmIC0tZ2l0IGEvaW5pdC90ZXN0X2tpbGxfc2VydmljZXMvaW5pdF9raWxsX3NlcnZpY2VzX3Rlc3QuY3BwIGIvaW5pdC90ZXN0X2tpbGxfc2VydmljZXMvaW5pdF9raWxsX3NlcnZpY2VzX3Rlc3QuY3BwCmluZGV4IDUzNTU3MDMuLjUxMGFkOGEgMTAwNjQ0Ci0tLSBhL2luaXQvdGVzdF9raWxsX3NlcnZpY2VzL2luaXRfa2lsbF9zZXJ2aWNlc190ZXN0LmNwcAorKysgYi9pbml0L3Rlc3Rfa2lsbF9zZXJ2aWNlcy9pbml0X2tpbGxfc2VydmljZXNfdGVzdC5jcHAKQEAgLTE2LDE0ICsxNiwyNiBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPGlvc3RyZWFtPgogCiB1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5OwogdXNpbmcgOjphbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eTsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5OwordXNpbmcgc3RkOjpsaXRlcmFsczo6Y2hyb25vX2xpdGVyYWxzOjpvcGVyYXRvciIiczsKIAogdm9pZCBFeHBlY3RLaWxsaW5nU2VydmljZVJlY292ZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUpIHsKKyAgICBMT0coSU5GTykgPDwgImJlZm9yZSB3ZSBzYXkgaGkgdG8gIiA8PCBzZXJ2aWNlX25hbWUgPDwgIiwgSSBjYW4ndCBoYXZlIGFwZXhkIGFyb3VuZCEiOworCisgICAgLy8gYi8yODA1MTQwODAgLSBzZXJ2aWNlbWFuYWdlciB3aWxsIHJlc3RhcnQgYXBleGQsIGFuZCBhcGV4ZCB3aWxsIHJlc3RhcnQgdGhlCisgICAgLy8gc3lzdGVtIHdoZW4gY3Jhc2hlZC4gVGhpcyBpcyBmaW5lIGFzIHRoZSBkZXZpY2UgcmVjb3ZlcnMsIGJ1dCBpdCBjYXVzZXMKKyAgICAvLyBmbGFrZXMgaW4gdGhpcyB0ZXN0LgorICAgIEFTU0VSVF9UUlVFKFdhaXRGb3JQcm9wZXJ0eSgiaW5pdC5zdmMuYXBleGQiLCAic3RvcHBlZCIsIDEyMHMpKQorICAgICAgICAgICAgPDwgKHN5c3RlbSgiY2F0IC9kZXYvYmluZGVyZnMvYmluZGVyX2xvZ3Mvc3RhdGUiKSwgImFwZXhkIHdvbid0IHN0b3AiKTsKKworICAgIExPRyhJTkZPKSA8PCAiaGVsbG8gIiA8PCBzZXJ2aWNlX25hbWUgPDwgIiEiOwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0YXR1c19wcm9wID0gImluaXQuc3ZjLiIgKyBzZXJ2aWNlX25hbWU7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcGlkX3Byb3AgPSAiaW5pdC5zdmNfZGVidWdfcGlkLiIgKyBzZXJ2aWNlX25hbWU7CiAKQEAgLTMyLDYgKzQ0LDcgQEAKICAgICBBU1NFUlRfRVEoInJ1bm5pbmciLCBHZXRQcm9wZXJ0eShzdGF0dXNfcHJvcCwgIiIpKSA8PCBzdGF0dXNfcHJvcDsKICAgICBBU1NFUlRfTkUoIiIsIGluaXRpYWxfcGlkKSA8PCBwaWRfcHJvcDsKIAorICAgIExPRyhJTkZPKSA8PCAib2theSwgbm93IGdvb2RieWUgIiA8PCBzZXJ2aWNlX25hbWU7CiAgICAgRVhQRUNUX0VRKDAsIHN5c3RlbSgoImtpbGwgLTkgIiArIGluaXRpYWxfcGlkKS5jX3N0cigpKSk7CiAKICAgICBjb25zdGV4cHIgc2l6ZV90IGtNYXhXYWl0TWlsbGlzZWNvbmRzID0gMTAwMDA7CkBAIC00MiwxMSArNTUsMTYgQEAKICAgICBmb3IgKHNpemVfdCByZXRyeSA9IDA7IHJldHJ5IDwga1JldHJ5VGltZXM7IHJldHJ5KyspIHsKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBpZCA9IEdldFByb3BlcnR5KHBpZF9wcm9wLCAiIik7CiAgICAgICAgIGlmIChwaWQgIT0gaW5pdGlhbF9waWQgJiYgcGlkICE9ICIiKSBicmVhazsKKyAgICAgICAgTE9HKElORk8pIDw8ICJJIHNhaWQgZ29vZGJ5ZSAiIDw8IHNlcnZpY2VfbmFtZSA8PCAiISI7CiAgICAgICAgIHVzbGVlcChrUmV0cnlXYWl0TWlsbGlzZWNvbmRzICogMTAwMCk7CiAgICAgfQogCisgICAgTE9HKElORk8pIDw8ICJhcmUgeW91IHN0aWxsIHRoZXJlICIgPDwgc2VydmljZV9uYW1lIDw8ICI/IjsKKwogICAgIC8vIHN2Y19kZWJ1Z19waWQgaXMgc2V0IGFmdGVyIHN2YyBwcm9wZXJ0eQogICAgIEVYUEVDVF9FUSgicnVubmluZyIsIEdldFByb3BlcnR5KHN0YXR1c19wcm9wLCAiIikpOworCisgICAgTE9HKElORk8pIDw8ICJJJ20gZG9uZSB3aXRoICIgPDwgc2VydmljZV9uYW1lOwogfQogCiBjbGFzcyBJbml0S2lsbFNlcnZpY2VzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjpzdHJpbmc+IHt9OwpkaWZmIC0tZ2l0IGEvaW5pdC91ZXZlbnRkLmNwcCBiL2luaXQvdWV2ZW50ZC5jcHAKaW5kZXggNTg2ZTJjZi4uM2YwZDBlOSAxMDA2NDQKLS0tIGEvaW5pdC91ZXZlbnRkLmNwcAorKysgYi9pbml0L3VldmVudGQuY3BwCkBAIC0yOTcsNiArMjk3LDEwIEBACiB9CiAKIHN0YXRpYyBVZXZlbnRkQ29uZmlndXJhdGlvbiBHZXRDb25maWd1cmF0aW9uKCkgeworICAgIGlmIChJc01pY3JvZHJvaWQoKSkgeworICAgICAgICByZXR1cm4gUGFyc2VDb25maWcoeyIvc3lzdGVtL2V0Yy91ZXZlbnRkLnJjIiwgIi92ZW5kb3IvZXRjL3VldmVudGQucmMifSk7CisgICAgfQorCiAgICAgYXV0byBoYXJkd2FyZSA9IGFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5oYXJkd2FyZSIsICIiKTsKIAogICAgIHN0cnVjdCBMZWdhY3lQYXRoSW5mbyB7CmRpZmYgLS1naXQgYS9pbml0L3V0aWwuY3BwIGIvaW5pdC91dGlsLmNwcAppbmRleCBiYzhlYTZlLi5lNzYwYTU5IDEwMDY0NAotLS0gYS9pbml0L3V0aWwuY3BwCisrKyBiL2luaXQvdXRpbC5jcHAKQEAgLTQyLDYgKzQyLDEwIEBACiAjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KICNpbmNsdWRlIDxzZWxpbnV4L2FuZHJvaWQuaD4KIAorI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisjaW5jbHVkZSA8ZnNfbWdyLmg+CisjZW5kaWYKKwogI2lmZGVmIElOSVRfRlVMTF9TT1VSQ0VTCiAjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KICNpbmNsdWRlIDxzeXMvc3lzdGVtX3Byb3BlcnRpZXMuaD4KQEAgLTYwLDggKzY0LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKIAotY29uc3Qgc3RkOjpzdHJpbmcga0RlZmF1bHRBbmRyb2lkRHREaXIoIi9wcm9jL2RldmljZS10cmVlL2Zpcm13YXJlL2FuZHJvaWQvIik7Ci0KIGNvbnN0IHN0ZDo6c3RyaW5nIGtEYXRhRGlyUHJlZml4KCIvZGF0YS8iKTsKIAogdm9pZCAoKnRyaWdnZXJfc2h1dGRvd24pKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tYW5kKSA9IG51bGxwdHI7CkBAIC0yNDAsMzMgKzI0Miw2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi12b2lkIEltcG9ydEtlcm5lbENtZGxpbmUoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiwgY29uc3Qgc3RkOjpzdHJpbmcmKT4mIGZuKSB7Ci0gICAgc3RkOjpzdHJpbmcgY21kbGluZTsKLSAgICBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKCIvcHJvYy9jbWRsaW5lIiwgJmNtZGxpbmUpOwotCi0gICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGFuZHJvaWQ6OmJhc2U6OlRyaW0oY21kbGluZSksICIgIikpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBpZWNlcyA9IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGVudHJ5LCAiPSIpOwotICAgICAgICBpZiAocGllY2VzLnNpemUoKSA9PSAyKSB7Ci0gICAgICAgICAgICBmbihwaWVjZXNbMF0sIHBpZWNlc1sxXSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgSW1wb3J0Qm9vdGNvbmZpZyhjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYpPiYgZm4pIHsKLSAgICBzdGQ6OnN0cmluZyBib290Y29uZmlnOwotICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2Jvb3Rjb25maWciLCAmYm9vdGNvbmZpZyk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogYW5kcm9pZDo6YmFzZTo6U3BsaXQoYm9vdGNvbmZpZywgIlxuIikpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBpZWNlcyA9IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGVudHJ5LCAiPSIpOwotICAgICAgICBpZiAocGllY2VzLnNpemUoKSA9PSAyKSB7Ci0gICAgICAgICAgICAvLyBnZXQgcmlkIG9mIHRoZSBleHRyYSBzcGFjZSBiZXR3ZWVuIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHJlbW92ZSB0aGUgcXVvdGVzLgotICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdSZXBsYWNlKHBpZWNlc1sxXSwgIlwiLCBcIiIsICIsIiwgdHJ1ZSk7Ci0gICAgICAgICAgICB2YWx1ZS5lcmFzZShzdGQ6OnJlbW92ZSh2YWx1ZS5iZWdpbigpLCB2YWx1ZS5lbmQoKSwgJyInKSwgdmFsdWUuZW5kKCkpOwotICAgICAgICAgICAgZm4oYW5kcm9pZDo6YmFzZTo6VHJpbShwaWVjZXNbMF0pLCBhbmRyb2lkOjpiYXNlOjpUcmltKHZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIGJvb2wgbWFrZV9kaXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIG1vZGVfdCBtb2RlKSB7CiAgICAgc3RkOjpzdHJpbmcgc2Vjb250ZXh0OwogICAgIGlmIChTZWxhYmVsTG9va3VwRmlsZUNvbnRleHQocGF0aCwgbW9kZSwgJnNlY29udGV4dCkgJiYgIXNlY29udGV4dC5lbXB0eSgpKSB7CkBAIC0zNzUsNDUgKzM1MCwxOCBAQAogICAgIHJldHVybiBkc3Q7CiB9CiAKLXN0YXRpYyBzdGQ6OnN0cmluZyBpbml0X2FuZHJvaWRfZHRfZGlyKCkgewotICAgIC8vIFVzZSB0aGUgc3RhbmRhcmQgcHJvY2ZzLWJhc2VkIHBhdGggYnkgZGVmYXVsdAotICAgIHN0ZDo6c3RyaW5nIGFuZHJvaWRfZHRfZGlyID0ga0RlZmF1bHRBbmRyb2lkRHREaXI7Ci0gICAgLy8gVGhlIHBsYXRmb3JtIG1heSBzcGVjaWZ5IGEgY3VzdG9tIEFuZHJvaWQgRFQgcGF0aCBpbiBrZXJuZWwgY21kbGluZQotICAgIEltcG9ydEtlcm5lbENtZGxpbmUoWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICAgICAgICBpZiAoa2V5ID09ICJhbmRyb2lkYm9vdC5hbmRyb2lkX2R0X2RpciIpIHsKLSAgICAgICAgICAgIGFuZHJvaWRfZHRfZGlyID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICAvLyAuLk9yIGJvb3Rjb25maWcKLSAgICBpZiAoYW5kcm9pZF9kdF9kaXIgPT0ga0RlZmF1bHRBbmRyb2lkRHREaXIpIHsKLSAgICAgICAgSW1wb3J0Qm9vdGNvbmZpZyhbJl0oY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09ICJhbmRyb2lkYm9vdC5hbmRyb2lkX2R0X2RpciIpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2R0X2RpciA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBMT0coSU5GTykgPDwgIlVzaW5nIEFuZHJvaWQgRFQgZGlyZWN0b3J5ICIgPDwgYW5kcm9pZF9kdF9kaXI7Ci0gICAgcmV0dXJuIGFuZHJvaWRfZHRfZGlyOwotfQotCi0vLyBGSVhNRTogVGhlIHNhbWUgbG9naWMgaXMgZHVwbGljYXRlZCBpbiBzeXN0ZW0vY29yZS9mc19tZ3IvCi1jb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2FuZHJvaWRfZHRfZGlyKCkgewotICAgIC8vIFNldCBvbmNlIGFuZCBzYXZlcyB0aW1lIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24KLSAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FuZHJvaWREdERpciA9IGluaXRfYW5kcm9pZF9kdF9kaXIoKTsKLSAgICByZXR1cm4ga0FuZHJvaWREdERpcjsKLX0KLQogLy8gUmVhZHMgdGhlIGNvbnRlbnQgb2YgZGV2aWNlIHRyZWUgZmlsZSB1bmRlciB0aGUgcGxhdGZvcm0ncyBBbmRyb2lkIERUIGRpcmVjdG9yeS4KIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVhZCBpcyBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiBib29sIHJlYWRfYW5kcm9pZF9kdF9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfcGF0aCwgc3RkOjpzdHJpbmcqIGR0X2NvbnRlbnQpIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArIHN1Yl9wYXRoOworI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lID0gYW5kcm9pZDo6ZnNfbWdyOjpHZXRBbmRyb2lkRHREaXIoKSArIHN1Yl9wYXRoOwogICAgIGlmIChhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGZpbGVfbmFtZSwgZHRfY29udGVudCkpIHsKICAgICAgICAgaWYgKCFkdF9jb250ZW50LT5lbXB0eSgpKSB7CiAgICAgICAgICAgICBkdF9jb250ZW50LT5wb3BfYmFjaygpOyAgLy8gVHJpbXMgdGhlIHRyYWlsaW5nICdcMCcgb3V0LgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CisjZW5kaWYKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTczMiwxMSArNjgwLDYgQEAKICAgICBpc19kZWZhdWx0X21vdW50X25hbWVzcGFjZV9yZWFkeSA9IHRydWU7CiB9CiAKLWJvb2wgSXNNaWNyb2Ryb2lkKCkgewotICAgIHN0YXRpYyBib29sIGlzX21pY3JvZHJvaWQgPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8uaGFyZHdhcmUiLCAiIikgPT0gIm1pY3JvZHJvaWQiOwotICAgIHJldHVybiBpc19taWNyb2Ryb2lkOwotfQotCiBib29sIEhhczMyQml0QWJpKCkgewogICAgIHN0YXRpYyBib29sIGhhcyA9ICFhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdDMyIiwgIiIpLmVtcHR5KCk7CiAgICAgcmV0dXJuIGhhczsKZGlmZiAtLWdpdCBhL2luaXQvdXRpbC5oIGIvaW5pdC91dGlsLmgKaW5kZXggZTU4ZTcwZS4uMmQwMjE4MiAxMDA2NDQKLS0tIGEvaW5pdC91dGlsLmgKKysrIGIvaW5pdC91dGlsLmgKQEAgLTUzLDE2ICs1MywxMSBAQAogUmVzdWx0PHVpZF90PiBEZWNvZGVVaWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOwogCiBib29sIG1rZGlyX3JlY3Vyc2l2ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aG5hbWUsIG1vZGVfdCBtb2RlKTsKLWludCB3YWl0X2Zvcl9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCk7Ci12b2lkIEltcG9ydEtlcm5lbENtZGxpbmUoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiwgY29uc3Qgc3RkOjpzdHJpbmcmKT4mKTsKLXZvaWQgSW1wb3J0Qm9vdGNvbmZpZyhjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYpPiYpOworaW50IHdhaXRfZm9yX2ZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUsIHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyB0aW1lb3V0KTsKIGJvb2wgbWFrZV9kaXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIG1vZGVfdCBtb2RlKTsKIGJvb2wgaXNfZGlyKGNvbnN0IGNoYXIqIHBhdGhuYW1lKTsKIFJlc3VsdDxzdGQ6OnN0cmluZz4gRXhwYW5kUHJvcHMoY29uc3Qgc3RkOjpzdHJpbmcmIHNyYyk7CiAKLS8vIFJldHVybnMgdGhlIHBsYXRmb3JtJ3MgQW5kcm9pZCBEVCBkaXJlY3RvcnkgYXMgc3BlY2lmaWVkIGluIHRoZSBrZXJuZWwgY21kbGluZS4KLS8vIElmIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBjb25maWd1cmUgYSBjdXN0b20gRFQgcGF0aCwgcmV0dXJucyB0aGUgc3RhbmRhcmQgb25lIChiYXNlZCBpbiBwcm9jZnMpLgotY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9hbmRyb2lkX2R0X2RpcigpOwogLy8gUmVhZHMgb3IgY29tcGFyZXMgdGhlIGNvbnRlbnQgb2YgZGV2aWNlIHRyZWUgZmlsZSB1bmRlciB0aGUgcGxhdGZvcm0ncyBBbmRyb2lkIERUIGRpcmVjdG9yeS4KIGJvb2wgcmVhZF9hbmRyb2lkX2R0X2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9wYXRoLCBzdGQ6OnN0cmluZyogZHRfY29udGVudCk7CiBib29sIGlzX2FuZHJvaWRfZHRfdmFsdWVfZXhwZWN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9wYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfY29udGVudCk7CkBAIC0xMDUsNyArMTAwLDE0IEBACiBib29sIElzRGVmYXVsdE1vdW50TmFtZXNwYWNlUmVhZHkoKTsKIHZvaWQgU2V0RGVmYXVsdE1vdW50TmFtZXNwYWNlUmVhZHkoKTsKIAotYm9vbCBJc01pY3JvZHJvaWQoKTsKK2lubGluZSBjb25zdGV4cHIgYm9vbCBJc01pY3JvZHJvaWQoKSB7CisjaWZkZWYgTUlDUk9EUk9JRAorICAgIHJldHVybiBNSUNST0RST0lEOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwogYm9vbCBIYXMzMkJpdEFiaSgpOwogCiBzdGQ6OnN0cmluZyBHZXRBcGV4TmFtZUZyb21GaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CmRpZmYgLS1naXQgYS9qYW5pdG9ycy9PV05FUlMgYi9qYW5pdG9ycy9PV05FUlMKaW5kZXggZDg3MTIwMS4uYTI4NzM3ZSAxMDA2NDQKLS0tIGEvamFuaXRvcnMvT1dORVJTCisrKyBiL2phbml0b3JzL09XTkVSUwpAQCAtMyw1ICszLDQgQEAKIGNmZXJyaXNAZ29vZ2xlLmNvbQogZHdpbGxlbXNlbkBnb29nbGUuY29tCiBlbmhAZ29vZ2xlLmNvbQotbmFyYXlhbkBnb29nbGUuY29tCiBzYWRhZmVicmFoaW1pQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2xpYmJpbmRlcndyYXBwZXIvQW5kcm9pZC5icCBiL2xpYmJpbmRlcndyYXBwZXIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmNDNlZS4uMDAwMDAwMAotLS0gYS9saWJiaW5kZXJ3cmFwcGVyL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi1wYWNrYWdlIHsKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCi19Ci0KLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGliYmluZGVyd3JhcHBlcl9kZWZhdWx0cyIsCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLQotICAgICAgICAvLyBmb3IgbGliY2hyb21lCi0gICAgICAgICItV25vLXNpZ24tcHJvbW8iLAotICAgIF0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjaHJvbWUiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCi19Ci0KLS8vIGxpYmJpbmRlcndyYXBwZXIgc2hhcmVkIGxpYnJhcnkKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmJpbmRlcndyYXBwZXIiLAotICAgIGRlZmF1bHRzOiBbImxpYmJpbmRlcndyYXBwZXJfZGVmYXVsdHMiXSwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotCi0gICAgc3JjczogWwotICAgICAgICAiYmluZGVyX3dyYXBwZXIuY2MiLAotICAgICAgICAicmVhbF9iaW5kZXJfd3JhcHBlci5jYyIsCi0gICAgXSwKLX0KLQotLy8gbGliYmluZGVyd3JhcHBlcl90ZXN0X3N1cHBvcnQgc3RhdGljIGxpYnJhcnkKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmJpbmRlcndyYXBwZXJfdGVzdF9zdXBwb3J0IiwKLSAgICBkZWZhdWx0czogWyJsaWJiaW5kZXJ3cmFwcGVyX2RlZmF1bHRzIl0sCi0KLSAgICBzdGF0aWNfbGliczogWyJsaWJndGVzdCJdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYmJpbmRlcndyYXBwZXIiXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgImJpbmRlcl90ZXN0X2Jhc2UuY2MiLAotICAgICAgICAic3R1Yl9iaW5kZXJfd3JhcHBlci5jYyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL2xpYmJpbmRlcndyYXBwZXIvYmluZGVyX3Rlc3RfYmFzZS5jYyBiL2xpYmJpbmRlcndyYXBwZXIvYmluZGVyX3Rlc3RfYmFzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5M2EwNC4uMDAwMDAwMAotLS0gYS9saWJiaW5kZXJ3cmFwcGVyL2JpbmRlcl90ZXN0X2Jhc2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlcndyYXBwZXIvYmluZGVyX3Rlc3RfYmFzZS5oPgotCi0jaW5jbHVkZSA8YmluZGVyd3JhcHBlci9iaW5kZXJfd3JhcHBlci5oPgotI2luY2x1ZGUgPGJpbmRlcndyYXBwZXIvc3R1Yl9iaW5kZXJfd3JhcHBlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUJpbmRlclRlc3RCYXNlOjpCaW5kZXJUZXN0QmFzZSgpIDogYmluZGVyX3dyYXBwZXJfKG5ldyBTdHViQmluZGVyV3JhcHBlcigpKSB7Ci0gIC8vIFBhc3Mgb3duZXJzaGlwLgotICBCaW5kZXJXcmFwcGVyOjpJbml0Rm9yVGVzdGluZyhiaW5kZXJfd3JhcHBlcl8pOwotfQotCi1CaW5kZXJUZXN0QmFzZTo6fkJpbmRlclRlc3RCYXNlKCkgewotICBCaW5kZXJXcmFwcGVyOjpEZXN0cm95KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJiaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmNjIGIvbGliYmluZGVyd3JhcHBlci9iaW5kZXJfd3JhcHBlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5YzFkZi4uMDAwMDAwMAotLS0gYS9saWJiaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmg+Ci0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLQotI2luY2x1ZGUgInJlYWxfYmluZGVyX3dyYXBwZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBTaW5nbGV0b24gaW5zdGFuY2UuCi1CaW5kZXJXcmFwcGVyKiBCaW5kZXJXcmFwcGVyOjppbnN0YW5jZV8gPSBudWxscHRyOwotCi0vLyBzdGF0aWMKLXZvaWQgQmluZGVyV3JhcHBlcjo6Q3JlYXRlKCkgewotICBDSEVDSyghaW5zdGFuY2VfKSA8PCAiQWxyZWFkeSBpbml0aWFsaXplZDsgbWlzc2luZyBjYWxsIHRvIERlc3Ryb3koKT8iOwotICBpbnN0YW5jZV8gPSBuZXcgUmVhbEJpbmRlcldyYXBwZXIoKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEJpbmRlcldyYXBwZXI6OkluaXRGb3JUZXN0aW5nKEJpbmRlcldyYXBwZXIqIHdyYXBwZXIpIHsKLSAgQ0hFQ0soIWluc3RhbmNlXykgPDwgIkFscmVhZHkgaW5pdGlhbGl6ZWQ7IG1pc3NpbmcgY2FsbCB0byBEZXN0cm95KCk/IjsKLSAgaW5zdGFuY2VfID0gd3JhcHBlcjsKLX0KLQotLy8gc3RhdGljCi12b2lkIEJpbmRlcldyYXBwZXI6OkRlc3Ryb3koKSB7Ci0gIENIRUNLKGluc3RhbmNlXykgPDwgIk5vdCBpbml0aWFsaXplZDsgbWlzc2luZyBjYWxsIHRvIENyZWF0ZSgpPyI7Ci0gIGRlbGV0ZSBpbnN0YW5jZV87Ci0gIGluc3RhbmNlXyA9IG51bGxwdHI7Ci19Ci0KLS8vIHN0YXRpYwotQmluZGVyV3JhcHBlciogQmluZGVyV3JhcHBlcjo6R2V0KCkgewotICBDSEVDSyhpbnN0YW5jZV8pIDw8ICJOb3QgaW5pdGlhbGl6ZWQ7IG1pc3NpbmcgY2FsbCB0byBDcmVhdGUoKT8iOwotICByZXR1cm4gaW5zdGFuY2VfOwotfQotCi0vLyBzdGF0aWMKLUJpbmRlcldyYXBwZXIqIEJpbmRlcldyYXBwZXI6OkdldE9yQ3JlYXRlSW5zdGFuY2UoKSB7Ci0gIGlmICghaW5zdGFuY2VfKQotICAgIGluc3RhbmNlXyA9IG5ldyBSZWFsQmluZGVyV3JhcHBlcigpOwotICByZXR1cm4gaW5zdGFuY2VfOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGliYmluZGVyd3JhcHBlci9pbmNsdWRlL2JpbmRlcndyYXBwZXIvYmluZGVyX3Rlc3RfYmFzZS5oIGIvbGliYmluZGVyd3JhcHBlci9pbmNsdWRlL2JpbmRlcndyYXBwZXIvYmluZGVyX3Rlc3RfYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU0M2RlLi4wMDAwMDAwCi0tLSBhL2xpYmJpbmRlcndyYXBwZXIvaW5jbHVkZS9iaW5kZXJ3cmFwcGVyL2JpbmRlcl90ZXN0X2Jhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNZU1RFTV9DT1JFX0lOQ0xVREVfQklOREVSV1JBUFBFUl9CSU5ERVJfVEVTVF9CQVNFX0hfCi0jZGVmaW5lIFNZU1RFTV9DT1JFX0lOQ0xVREVfQklOREVSV1JBUFBFUl9CSU5ERVJfVEVTVF9CQVNFX0hfCi0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3R1YkJpbmRlcldyYXBwZXI7Ci0KLS8vIENsYXNzIHRoYXQgY2FuIGJlIGluaGVyaXRlZCBmcm9tIChvciBhbGlhc2VkIHZpYSB0eXBlZGVmL3VzaW5nKSB3aGVuIHdyaXRpbmcKLS8vIHRlc3RzIHRoYXQgdXNlIFN0dWJCaW5kZXJNYW5hZ2VyLgotY2xhc3MgQmluZGVyVGVzdEJhc2UgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIEJpbmRlclRlc3RCYXNlKCk7Ci0gIH5CaW5kZXJUZXN0QmFzZSgpIG92ZXJyaWRlOwotCi0gIFN0dWJCaW5kZXJXcmFwcGVyKiBiaW5kZXJfd3JhcHBlcigpIHsgcmV0dXJuIGJpbmRlcl93cmFwcGVyXzsgfQotCi0gcHJvdGVjdGVkOgotICBTdHViQmluZGVyV3JhcHBlciogYmluZGVyX3dyYXBwZXJfOyAgLy8gTm90IG93bmVkLgotCi0gcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJpbmRlclRlc3RCYXNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU1lTVEVNX0NPUkVfSU5DTFVERV9CSU5ERVJXUkFQUEVSX0JJTkRFUl9URVNUX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2xpYmJpbmRlcndyYXBwZXIvaW5jbHVkZS9iaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmggYi9saWJiaW5kZXJ3cmFwcGVyL2luY2x1ZGUvYmluZGVyd3JhcHBlci9iaW5kZXJfd3JhcHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTA0YmZmLi4wMDAwMDAwCi0tLSBhL2xpYmJpbmRlcndyYXBwZXIvaW5jbHVkZS9iaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTWVNURU1fQ09SRV9JTkNMVURFX0JJTkRFUldSQVBQRVJfQklOREVSX1dSQVBQRVJfSF8KLSNkZWZpbmUgU1lTVEVNX0NPUkVfSU5DTFVERV9CSU5ERVJXUkFQUEVSX0JJTkRFUl9XUkFQUEVSX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQkJpbmRlcjsKLWNsYXNzIElCaW5kZXI7Ci0KLS8vIFdyYXBzIGxpYmJpbmRlciB0byBtYWtlIGl0IHRlc3RhYmxlLgotLy8gTk9URTogU3RhdGljIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBhcmUgbm90IHRocmVhZC1zYWZlLgotY2xhc3MgQmluZGVyV3JhcHBlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5CaW5kZXJXcmFwcGVyKCkge30KLQotICAvLyBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyB0aGUgc2luZ2xldG9uICh1c2luZyBhIHdyYXBwZXIgdGhhdCBjb21tdW5pY2F0ZXMKLSAgLy8gd2l0aCB0aGUgcmVhbCBiaW5kZXIgc3lzdGVtKS4KLSAgc3RhdGljIHZvaWQgQ3JlYXRlKCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZXMgfHdyYXBwZXJ8IGFzIHRoZSBzaW5nbGV0b24sIHRha2luZyBvd25lcnNoaXAgb2YgaXQuIFRlc3RzIHRoYXQKLSAgLy8gd2FudCB0byBpbmplY3QgdGhlaXIgb3duIHdyYXBwZXJzIHNob3VsZCBjYWxsIHRoaXMgaW5zdGVhZCBvZiBDcmVhdGUoKS4KLSAgc3RhdGljIHZvaWQgSW5pdEZvclRlc3RpbmcoQmluZGVyV3JhcHBlciogd3JhcHBlcik7Ci0KLSAgLy8gRGVzdHJveXMgdGhlIHNpbmdsZXRvbi4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgQ3JlYXRlKCkgb3IKLSAgLy8gSW5pdEZvclRlc3RpbmcoKSBhIHNlY29uZCB0aW1lLgotICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIHByZXZpb3VzbHkgY3JlYXRlZCBieSBDcmVhdGUoKSBvciBzZXQgYnkKLSAgLy8gSW5pdEZvclRlc3RpbmcoKS4KLSAgc3RhdGljIEJpbmRlcldyYXBwZXIqIEdldCgpOwotCi0gIC8vIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBpZiBpdCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIGJ5IENyZWF0ZSgpIG9yCi0gIC8vIHNldCBieSBJbml0Rm9yVGVzdGluZygpLCBvciBjcmVhdGVzIGEgbmV3IG9uZSBieSBjYWxsaW5nIENyZWF0ZSgpLgotICBzdGF0aWMgQmluZGVyV3JhcHBlciogR2V0T3JDcmVhdGVJbnN0YW5jZSgpOwotCi0gIC8vIEdldHMgdGhlIGJpbmRlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2aWNlIGlkZW50aWZpZWQgYnkKLSAgLy8gfHNlcnZpY2VfbmFtZXwsIHJldHVybmluZyBudWxsIGltbWVkaWF0ZWx5IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi0gIHZpcnR1YWwgc3A8SUJpbmRlcj4gR2V0U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKSA9IDA7Ci0KLSAgLy8gUmVnaXN0ZXJzIHxiaW5kZXJ8IGFzIHxzZXJ2aWNlX25hbWV8IHdpdGggdGhlIHNlcnZpY2UgbWFuYWdlci4KLSAgdmlydHVhbCBib29sIFJlZ2lzdGVyU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpID0gMDsKLQotICAvLyBDcmVhdGVzIGEgbG9jYWwgYmluZGVyIG9iamVjdC4KLSAgdmlydHVhbCBzcDxCQmluZGVyPiBDcmVhdGVMb2NhbEJpbmRlcigpID0gMDsKLQotICAvLyBSZWdpc3RlcnMgfGNhbGxiYWNrfCB0byBiZSBpbnZva2VkIHdoZW4gfGJpbmRlcnwgZGllcy4gSWYgYW5vdGhlciBjYWxsYmFjawotICAvLyBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgfGJpbmRlcnwsIGl0IHdpbGwgYmUgcmVwbGFjZWQuCi0gIHZpcnR1YWwgYm9vbCBSZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucygKLSAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsCi0gICAgICBjb25zdCA6OmJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSA9IDA7Ci0KLSAgLy8gVW5yZWdpc3RlcnMgdGhlIGNhbGxiYWNrLCBpZiBhbnksIGZvciB8YmluZGVyfC4KLSAgdmlydHVhbCBib29sIFVucmVnaXN0ZXJGb3JEZWF0aE5vdGlmaWNhdGlvbnMoY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikgPSAwOwotCi0gIC8vIFdoZW4gY2FsbGVkIHdoaWxlIGluIGEgdHJhbnNhY3Rpb24sIHJldHVybnMgdGhlIGNhbGxlcidzIFVJRCBvciBQSUQuCi0gIHZpcnR1YWwgdWlkX3QgR2V0Q2FsbGluZ1VpZCgpID0gMDsKLSAgdmlydHVhbCBwaWRfdCBHZXRDYWxsaW5nUGlkKCkgPSAwOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIEJpbmRlcldyYXBwZXIqIGluc3RhbmNlXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU1lTVEVNX0NPUkVfSU5DTFVERV9CSU5ERVJXUkFQUEVSX0JJTkRFUl9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9saWJiaW5kZXJ3cmFwcGVyL2luY2x1ZGUvYmluZGVyd3JhcHBlci9zdHViX2JpbmRlcl93cmFwcGVyLmggYi9saWJiaW5kZXJ3cmFwcGVyL2luY2x1ZGUvYmluZGVyd3JhcHBlci9zdHViX2JpbmRlcl93cmFwcGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDU3OGUuLjAwMDAwMDAKLS0tIGEvbGliYmluZGVyd3JhcHBlci9pbmNsdWRlL2JpbmRlcndyYXBwZXIvc3R1Yl9iaW5kZXJfd3JhcHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNZU1RFTV9DT1JFX0lOQ0xVREVfQklOREVSV1JBUFBFUl9TVFVCX0JJTkRFUl9XUkFQUEVSX0hfCi0jZGVmaW5lIFNZU1RFTV9DT1JFX0lOQ0xVREVfQklOREVSV1JBUFBFUl9TVFVCX0JJTkRFUl9XUkFQUEVSX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyd3JhcHBlci9iaW5kZXJfd3JhcHBlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFN0dWIgaW1wbGVtZW50YXRpb24gb2YgQmluZGVyV3JhcHBlciBmb3IgdGVzdGluZy4KLS8vCi0vLyBFeGFtcGxlIHVzYWdlOgotLy8KLS8vIEZpcnN0LCBhc3N1bWluZyBhIGJhc2UgSUZvbyBiaW5kZXIgaW50ZXJmYWNlLCBjcmVhdGUgYSBzdHViIGNsYXNzIHRoYXQKLS8vIGRlcml2ZXMgZnJvbSBCbkZvbyB0byBpbXBsZW1lbnQgdGhlIHJlY2VpdmVyIHNpZGUgb2YgdGhlIGNvbW11bmljYXRpb246Ci0vLwotLy8gICBjbGFzcyBTdHViRm9vIDogcHVibGljIEJuRm9vIHsKLS8vICAgIHB1YmxpYzoKLS8vICAgICAuLi4KLS8vICAgICBzdGF0dXNfdCBkb1NvbWV0aGluZyhpbnQgYXJnKSBvdmVycmlkZSB7Ci0vLyAgICAgICAvLyBlLmcuIHNhdmUgcGFzc2VkLWluIHZhbHVlIGZvciBsYXRlciBpbnNwZWN0aW9uIGJ5IHRlc3RzLgotLy8gICAgICAgcmV0dXJuIE9LOwotLy8gICAgIH0KLS8vICAgfTsKLS8vCi0vLyBOZXh0LCBmcm9tIHlvdXIgdGVzdCBjb2RlLCBpbmplY3QgYSBTdHViQmluZGVyTWFuYWdlciBlaXRoZXIgZGlyZWN0bHkgb3IgYnkKLS8vIGluaGVyaXRpbmcgZnJvbSB0aGUgQmluZGVyVGVzdEJhc2UgY2xhc3M6Ci0vLwotLy8gICBTdHViQmluZGVyV3JhcHBlciogd3JhcHBlciA9IG5ldyBTdHViQmluZGVyV3JhcHBlcigpOwotLy8gICBCaW5kZXJXcmFwcGVyOjpJbml0Rm9yVGVzdGluZyh3cmFwcGVyKTsgIC8vIFRha2VzIG93bmVyc2hpcC4KLS8vCi0vLyBBbHNvIGZyb20geW91ciB0ZXN0LCBjcmVhdGUgYSBTdHViRm9vIGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSB3cmFwcGVyOgotLy8KLS8vICAgU3R1YkZvbyogZm9vID0gbmV3IFN0dWJGb28oKTsKLS8vICAgc3A8SUJpbmRlcj4gYmluZGVyKGZvbyk7Ci0vLyAgIHdyYXBwZXItPlNldEJpbmRlckZvclNlcnZpY2UoImZvbyIsIGJpbmRlcik7Ci0vLwotLy8gVGhlIGNvZGUgYmVpbmcgdGVzdGVkIGNhbiBub3cgdXNlIHRoZSB3cmFwcGVyIHRvIGdldCB0aGUgc3R1YiBhbmQgY2FsbCBpdDoKLS8vCi0vLyAgIHNwPElCaW5kZXI+IGJpbmRlciA9IEJpbmRlcldyYXBwZXI6OkdldCgpLT5HZXRTZXJ2aWNlKCJmb28iKTsKLS8vICAgQ0hFQ0soYmluZGVyLmdldCgpKTsKLS8vICAgc3A8SUZvbz4gZm9vID0gaW50ZXJmYWNlX2Nhc3Q8SUZvbz4oYmluZGVyKTsKLS8vICAgQ0hFQ0tfRVEoZm9vLT5kb1NvbWV0aGluZygzKSwgT0spOwotLy8KLS8vIFRvIGNyZWF0ZSBhIGxvY2FsIEJCaW5kZXIgb2JqZWN0LCBwcm9kdWN0aW9uIGNvZGUgY2FuIGNhbGwKLS8vIENyZWF0ZUxvY2FsQmluZGVyKCkuIFRoZW4sIGEgdGVzdCBjYW4gZ2V0IHRoZSBCQmluZGVyJ3MgYWRkcmVzcyB2aWEKLS8vIGxvY2FsX2JpbmRlcnMoKSB0byBjaGVjayB0aGF0IHRoZXkncmUgcGFzc2VkIGFzIGV4cGVjdGVkIGluIGJpbmRlciBjYWxscy4KLS8vCi1jbGFzcyBTdHViQmluZGVyV3JhcHBlciA6IHB1YmxpYyBCaW5kZXJXcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIFN0dWJCaW5kZXJXcmFwcGVyKCk7Ci0gIH5TdHViQmluZGVyV3JhcHBlcigpIG92ZXJyaWRlOwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPEJCaW5kZXI+PiYgbG9jYWxfYmluZGVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbG9jYWxfYmluZGVyc187Ci0gIH0KLSAgdm9pZCBjbGVhcl9sb2NhbF9iaW5kZXJzKCkgeyBsb2NhbF9iaW5kZXJzXy5jbGVhcigpOyB9Ci0KLSAgdm9pZCBzZXRfY2FsbGluZ191aWQodWlkX3QgdWlkKSB7IGNhbGxpbmdfdWlkXyA9IHVpZDsgfQotICB2b2lkIHNldF9jYWxsaW5nX3BpZChwaWRfdCBwaWQpIHsgY2FsbGluZ19waWRfID0gcGlkOyB9Ci0KLSAgLy8gU2V0cyB0aGUgYmluZGVyIHRvIHJldHVybiB3aGVuIHxzZXJ2aWNlX25hbWV8IGlzIHBhc3NlZCB0byBHZXRTZXJ2aWNlKCkgb3IKLSAgLy8gV2FpdEZvclNlcnZpY2UoKS4KLSAgdm9pZCBTZXRCaW5kZXJGb3JTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKTsKLQotICAvLyBSZXR1cm5zIHRoZSBiaW5kZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIGZvciB8c2VydmljZV9uYW1lfCB2aWEKLSAgLy8gUmVnaXN0ZXJTZXJ2aWNlKCksIG9yIG51bGwgaWYgdGhlIHNlcnZpY2UgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZC4KLSAgc3A8SUJpbmRlcj4gR2V0UmVnaXN0ZXJlZFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSkgY29uc3Q7Ci0KLSAgLy8gUnVuIHRoZSBjYWxiYWNrIGluIHxkZWF0aF9jYWxsYmFja3NffCBjb3JyZXNwb25kaW5nIHRvIHxiaW5kZXJ8LgotICB2b2lkIE5vdGlmeUFib3V0QmluZGVyRGVhdGgoY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcik7Ci0KLSAgLy8gQmluZGVyV3JhcHBlcjoKLSAgc3A8SUJpbmRlcj4gR2V0U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKSBvdmVycmlkZTsKLSAgYm9vbCBSZWdpc3RlclNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikgb3ZlcnJpZGU7Ci0gIHNwPEJCaW5kZXI+IENyZWF0ZUxvY2FsQmluZGVyKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVnaXN0ZXJGb3JEZWF0aE5vdGlmaWNhdGlvbnMoY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSBvdmVycmlkZTsKLSAgYm9vbCBVbnJlZ2lzdGVyRm9yRGVhdGhOb3RpZmljYXRpb25zKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIG92ZXJyaWRlOwotICB1aWRfdCBHZXRDYWxsaW5nVWlkKCkgb3ZlcnJpZGU7Ci0gIHBpZF90IEdldENhbGxpbmdQaWQoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHVzaW5nIFNlcnZpY2VNYXAgPSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3A8SUJpbmRlcj4+OwotCi0gIC8vIE1hcCBmcm9tIHNlcnZpY2UgbmFtZSB0byBhc3NvY2lhdGVkIGJpbmRlciBoYW5kbGUuIFVzZWQgYnkgR2V0U2VydmljZSgpIGFuZAotICAvLyBXYWl0Rm9yU2VydmljZSgpLgotICBTZXJ2aWNlTWFwIHNlcnZpY2VzX3RvX3JldHVybl87Ci0KLSAgLy8gTWFwIGZyb20gc2VydmljZSBuYW1lIHRvIGFzc29jaWF0ZWQgYmluZGVyIGhhbmRsZS4gVXBkYXRlZCBieQotICAvLyBSZWdpc3RlclNlcnZpY2UoKS4KLSAgU2VydmljZU1hcCByZWdpc3RlcmVkX3NlcnZpY2VzXzsKLQotICAvLyBMb2NhbCBiaW5kZXJzIHJldHVybmVkIGJ5IENyZWF0ZUxvY2FsQmluZGVyKCkuCi0gIHN0ZDo6dmVjdG9yPHNwPEJCaW5kZXI+PiBsb2NhbF9iaW5kZXJzXzsKLQotICAvLyBNYXAgZnJvbSBiaW5kZXIgaGFuZGxlIHRvIHRoZSBjYWxsYmFjayB0aGF0IHNob3VsZCBiZSBpbnZva2VkIG9uIGJpbmRlcgotICAvLyBkZWF0aC4KLSAgc3RkOjptYXA8c3A8SUJpbmRlcj4sIDo6YmFzZTo6Q2xvc3VyZT4gZGVhdGhfY2FsbGJhY2tzXzsKLQotICAvLyBWYWx1ZXMgdG8gcmV0dXJuIGZyb20gR2V0Q2FsbGluZ1VpZCgpIGFuZCBHZXRDYWxsaW5nUGlkKCk7Ci0gIHVpZF90IGNhbGxpbmdfdWlkXzsKLSAgcGlkX3QgY2FsbGluZ19waWRfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdHViQmluZGVyV3JhcHBlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFNZU1RFTV9DT1JFX0lOQ0xVREVfQklOREVSV1JBUFBFUl9TVFVCX0JJTkRFUl9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9saWJiaW5kZXJ3cmFwcGVyL3JlYWxfYmluZGVyX3dyYXBwZXIuY2MgYi9saWJiaW5kZXJ3cmFwcGVyL3JlYWxfYmluZGVyX3dyYXBwZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5M2YxODMuLjAwMDAwMDAKLS0tIGEvbGliYmluZGVyd3JhcHBlci9yZWFsX2JpbmRlcl93cmFwcGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicmVhbF9iaW5kZXJfd3JhcHBlci5oIgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIENsYXNzIHRoYXQgaGFuZGxlcyBiaW5kZXIgZGVhdGggbm90aWZpY2F0aW9ucy4gbGliYmluZGVyIHdhbnRzIHRoZSByZWNpcGllbnQKLS8vIHRvIGJlIHdyYXBwZWQgaW4gc3A8Piwgc28gcmVnaXN0ZXJpbmcgUmVhbEJpbmRlcldyYXBwZXIgYXMgYSByZWNpcGllbnQgd291bGQKLS8vIGJlIGF3a3dhcmQuCi1jbGFzcyBSZWFsQmluZGVyV3JhcHBlcjo6RGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRGVhdGhSZWNpcGllbnQoY29uc3QgOjpiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykKLSAgICAgIDogY2FsbGJhY2tfKGNhbGxiYWNrKSB7fQotICB+RGVhdGhSZWNpcGllbnQoKSA9IGRlZmF1bHQ7Ci0KLSAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ6Ci0gIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSBvdmVycmlkZSB7Ci0gICAgY2FsbGJhY2tfLlJ1bigpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBDYWxsYmFjayB0byBydW4gaW4gcmVzcG9uc2UgdG8gYmluZGVyIGRlYXRoLgotICA6OmJhc2U6OkNsb3N1cmUgY2FsbGJhY2tfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZWF0aFJlY2lwaWVudCk7Ci19OwotCi1SZWFsQmluZGVyV3JhcHBlcjo6UmVhbEJpbmRlcldyYXBwZXIoKSA9IGRlZmF1bHQ7Ci0KLVJlYWxCaW5kZXJXcmFwcGVyOjp+UmVhbEJpbmRlcldyYXBwZXIoKSA9IGRlZmF1bHQ7Ci0KLXNwPElCaW5kZXI+IFJlYWxCaW5kZXJXcmFwcGVyOjpHZXRTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUpIHsKLSAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlX21hbmFnZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgaWYgKCFzZXJ2aWNlX21hbmFnZXIuZ2V0KCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZ2V0IHNlcnZpY2UgbWFuYWdlciI7Ci0gICAgcmV0dXJuIHNwPElCaW5kZXI+KCk7Ci0gIH0KLSAgc3A8SUJpbmRlcj4gYmluZGVyID0KLSAgICAgIHNlcnZpY2VfbWFuYWdlci0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KHNlcnZpY2VfbmFtZS5jX3N0cigpKSk7Ci0gIGlmICghYmluZGVyLmdldCgpKQotICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBnZXQgXCIiIDw8IHNlcnZpY2VfbmFtZSA8PCAiXCIgc2VydmljZSI7Ci0gIHJldHVybiBiaW5kZXI7Ci19Ci0KLWJvb2wgUmVhbEJpbmRlcldyYXBwZXI6OlJlZ2lzdGVyU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlX21hbmFnZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgaWYgKCFzZXJ2aWNlX21hbmFnZXIuZ2V0KCkpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZ2V0IHNlcnZpY2UgbWFuYWdlciI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN0YXR1c190IHN0YXR1cyA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKAotICAgICAgU3RyaW5nMTYoc2VydmljZV9uYW1lLmNfc3RyKCkpLCBiaW5kZXIpOwotICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFwiIiA8PCBzZXJ2aWNlX25hbWUgPDwgIlwiIHdpdGggc2VydmljZSAiCi0gICAgICAgICAgICAgICA8PCAibWFuYWdlciI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zcDxCQmluZGVyPiBSZWFsQmluZGVyV3JhcHBlcjo6Q3JlYXRlTG9jYWxCaW5kZXIoKSB7Ci0gIHJldHVybiBzcDxCQmluZGVyPihuZXcgQkJpbmRlcigpKTsKLX0KLQotYm9vbCBSZWFsQmluZGVyV3JhcHBlcjo6UmVnaXN0ZXJGb3JEZWF0aE5vdGlmaWNhdGlvbnMoCi0gICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwKLSAgICBjb25zdCA6OmJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIHNwPERlYXRoUmVjaXBpZW50PiByZWNpcGllbnQobmV3IERlYXRoUmVjaXBpZW50KGNhbGxiYWNrKSk7Ci0gIGlmIChiaW5kZXItPmxpbmtUb0RlYXRoKHJlY2lwaWVudCkgIT0gT0spIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgZm9yIGRlYXRoIG5vdGlmaWNhdGlvbnMgb24gIgotICAgICAgICAgICAgICAgPDwgYmluZGVyLmdldCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBkZWF0aF9yZWNpcGllbnRzX1tiaW5kZXJdID0gcmVjaXBpZW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSZWFsQmluZGVyV3JhcHBlcjo6VW5yZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucygKLSAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSB7Ci0gIGF1dG8gaXQgPSBkZWF0aF9yZWNpcGllbnRzXy5maW5kKGJpbmRlcik7Ci0gIGlmIChpdCA9PSBkZWF0aF9yZWNpcGllbnRzXy5lbmQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIk5vdCByZWdpc3RlcmVkIGZvciBkZWF0aCBub3RpZmljYXRpb25zIG9uICIgPDwgYmluZGVyLmdldCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoYmluZGVyLT51bmxpbmtUb0RlYXRoKGl0LT5zZWNvbmQpICE9IE9LKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHVucmVnaXN0ZXIgZm9yIGRlYXRoIG5vdGlmaWNhdGlvbnMgb24gIgotICAgICAgICAgICAgICAgPDwgYmluZGVyLmdldCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBkZWF0aF9yZWNpcGllbnRzXy5lcmFzZShpdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi11aWRfdCBSZWFsQmluZGVyV3JhcHBlcjo6R2V0Q2FsbGluZ1VpZCgpIHsKLSAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLX0KLQotcGlkX3QgUmVhbEJpbmRlcldyYXBwZXI6OkdldENhbGxpbmdQaWQoKSB7Ci0gIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJiaW5kZXJ3cmFwcGVyL3JlYWxfYmluZGVyX3dyYXBwZXIuaCBiL2xpYmJpbmRlcndyYXBwZXIvcmVhbF9iaW5kZXJfd3JhcHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTA1MzgzLi4wMDAwMDAwCi0tLSBhL2xpYmJpbmRlcndyYXBwZXIvcmVhbF9iaW5kZXJfd3JhcHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1lTVEVNX0NPUkVfTElCQklOREVSV1JBUFBFUl9SRUFMX0JJTkRFUl9XUkFQUEVSX0hfCi0jZGVmaW5lIFNZU1RFTV9DT1JFX0xJQkJJTkRFUldSQVBQRVJfUkVBTF9CSU5ERVJfV1JBUFBFUl9IXwotCi0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxiaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSUJpbmRlcjsKLQotLy8gUmVhbCBpbXBsZW1lbnRhdGlvbiBvZiBCaW5kZXJXcmFwcGVyLgotY2xhc3MgUmVhbEJpbmRlcldyYXBwZXIgOiBwdWJsaWMgQmluZGVyV3JhcHBlciB7Ci0gcHVibGljOgotICBSZWFsQmluZGVyV3JhcHBlcigpOwotICB+UmVhbEJpbmRlcldyYXBwZXIoKSBvdmVycmlkZTsKLQotICAvLyBCaW5kZXJXcmFwcGVyOgotICBzcDxJQmluZGVyPiBHZXRTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUpIG92ZXJyaWRlOwotICBib29sIFJlZ2lzdGVyU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSBvdmVycmlkZTsKLSAgc3A8QkJpbmRlcj4gQ3JlYXRlTG9jYWxCaW5kZXIoKSBvdmVycmlkZTsKLSAgYm9vbCBSZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucyhjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIG92ZXJyaWRlOwotICBib29sIFVucmVnaXN0ZXJGb3JEZWF0aE5vdGlmaWNhdGlvbnMoY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikgb3ZlcnJpZGU7Ci0gIHVpZF90IEdldENhbGxpbmdVaWQoKSBvdmVycmlkZTsKLSAgcGlkX3QgR2V0Q2FsbGluZ1BpZCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY2xhc3MgRGVhdGhSZWNpcGllbnQ7Ci0KLSAgLy8gTWFwIGZyb20gYmluZGVyIGhhbmRsZSB0byBvYmplY3QgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgb2YgdGhlIGJpbmRlcidzCi0gIC8vIGRlYXRoLgotICBzdGQ6Om1hcDxzcDxJQmluZGVyPiwgc3A8RGVhdGhSZWNpcGllbnQ+PiBkZWF0aF9yZWNpcGllbnRzXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVhbEJpbmRlcldyYXBwZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBTWVNURU1fQ09SRV9MSUJCSU5ERVJfV1JBUFBFUl9SRUFMX0JJTkRFUl9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9saWJiaW5kZXJ3cmFwcGVyL3N0dWJfYmluZGVyX3dyYXBwZXIuY2MgYi9saWJiaW5kZXJ3cmFwcGVyL3N0dWJfYmluZGVyX3dyYXBwZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzVmNjIuLjAwMDAwMDAKLS0tIGEvbGliYmluZGVyd3JhcHBlci9zdHViX2JpbmRlcl93cmFwcGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXJ3cmFwcGVyL3N0dWJfYmluZGVyX3dyYXBwZXIuaD4KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVN0dWJCaW5kZXJXcmFwcGVyOjpTdHViQmluZGVyV3JhcHBlcigpCi0gICAgOiBjYWxsaW5nX3VpZF8oLTEpLAotICAgICAgY2FsbGluZ19waWRfKC0xKSB7fQotCi1TdHViQmluZGVyV3JhcHBlcjo6flN0dWJCaW5kZXJXcmFwcGVyKCkgPSBkZWZhdWx0OwotCi12b2lkIFN0dWJCaW5kZXJXcmFwcGVyOjpTZXRCaW5kZXJGb3JTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgc2VydmljZXNfdG9fcmV0dXJuX1tzZXJ2aWNlX25hbWVdID0gYmluZGVyOwotfQotCi1zcDxJQmluZGVyPiBTdHViQmluZGVyV3JhcHBlcjo6R2V0UmVnaXN0ZXJlZFNlcnZpY2UoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSkgY29uc3QgewotICBjb25zdCBhdXRvIGl0ID0gcmVnaXN0ZXJlZF9zZXJ2aWNlc18uZmluZChzZXJ2aWNlX25hbWUpOwotICByZXR1cm4gaXQgIT0gcmVnaXN0ZXJlZF9zZXJ2aWNlc18uZW5kKCkgPyBpdC0+c2Vjb25kIDogc3A8SUJpbmRlcj4oKTsKLX0KLQotdm9pZCBTdHViQmluZGVyV3JhcHBlcjo6Tm90aWZ5QWJvdXRCaW5kZXJEZWF0aChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSB7Ci0gIGNvbnN0IGF1dG8gaXQgPSBkZWF0aF9jYWxsYmFja3NfLmZpbmQoYmluZGVyKTsKLSAgaWYgKGl0ICE9IGRlYXRoX2NhbGxiYWNrc18uZW5kKCkpCi0gICAgaXQtPnNlY29uZC5SdW4oKTsKLX0KLQotc3A8SUJpbmRlcj4gU3R1YkJpbmRlcldyYXBwZXI6OkdldFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSkgewotICBjb25zdCBhdXRvIGl0ID0gc2VydmljZXNfdG9fcmV0dXJuXy5maW5kKHNlcnZpY2VfbmFtZSk7Ci0gIHJldHVybiBpdCAhPSBzZXJ2aWNlc190b19yZXR1cm5fLmVuZCgpID8gaXQtPnNlY29uZCA6IHNwPElCaW5kZXI+KCk7Ci19Ci0KLWJvb2wgU3R1YkJpbmRlcldyYXBwZXI6OlJlZ2lzdGVyU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgcmVnaXN0ZXJlZF9zZXJ2aWNlc19bc2VydmljZV9uYW1lXSA9IGJpbmRlcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXNwPEJCaW5kZXI+IFN0dWJCaW5kZXJXcmFwcGVyOjpDcmVhdGVMb2NhbEJpbmRlcigpIHsKLSAgc3A8QkJpbmRlcj4gYmluZGVyKG5ldyBCQmluZGVyKCkpOwotICBsb2NhbF9iaW5kZXJzXy5wdXNoX2JhY2soYmluZGVyKTsKLSAgcmV0dXJuIGJpbmRlcjsKLX0KLQotYm9vbCBTdHViQmluZGVyV3JhcHBlcjo6UmVnaXN0ZXJGb3JEZWF0aE5vdGlmaWNhdGlvbnMoCi0gICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwKLSAgICBjb25zdCA6OmJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Ci0gIGRlYXRoX2NhbGxiYWNrc19bYmluZGVyXSA9IGNhbGxiYWNrOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHViQmluZGVyV3JhcHBlcjo6VW5yZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucygKLSAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSB7Ci0gIGRlYXRoX2NhbGxiYWNrc18uZXJhc2UoYmluZGVyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpZF90IFN0dWJCaW5kZXJXcmFwcGVyOjpHZXRDYWxsaW5nVWlkKCkgewotICByZXR1cm4gY2FsbGluZ191aWRfOwotfQotCi1waWRfdCBTdHViQmluZGVyV3JhcHBlcjo6R2V0Q2FsbGluZ1BpZCgpIHsKLSAgcmV0dXJuIGNhbGxpbmdfcGlkXzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9BbmRyb2lkLmJwIGIvbGliY3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggMGI1YzEyNS4uOGFlN2Q5ZSAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbGliY3V0aWxzL0FuZHJvaWQuYnAKQEAgLTE2Miw3ICsxNjIsNiBAQAogICAgICAgICAicHJvcGVydGllcy5jcHAiLAogICAgICAgICAicmVjb3JkX3N0cmVhbS5jcHAiLAogICAgICAgICAic3RybGNweS5jIiwKLSAgICAgICAgInRocmVhZHMuY3BwIiwKICAgICBdLAogCiAgICAgdGFyZ2V0OiB7CkBAIC0xNzIsMTEgKzE3MSwxNSBAQAogICAgICAgICAgICAgICAgICJsaWJhc3luY19zYWZlIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGxpbnV4OiB7CisgICAgICAgICAgICBzcmNzOiBbCisgICAgICAgICAgICAgICAgImNhbm5lZF9mc19jb25maWcuY3BwIiwKKyAgICAgICAgICAgICAgICAiZnNfY29uZmlnLmNwcCIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAogICAgICAgICBub3Rfd2luZG93czogewogICAgICAgICAgICAgc3JjczogbGliY3V0aWxzX25vbndpbmRvd3Nfc291cmNlcyArIFsKICAgICAgICAgICAgICAgICAiYXNobWVtLWhvc3QuY3BwIiwKLSAgICAgICAgICAgICAgICAiY2FubmVkX2ZzX2NvbmZpZy5jcHAiLAotICAgICAgICAgICAgICAgICJmc19jb25maWcuY3BwIiwKICAgICAgICAgICAgICAgICAidHJhY2UtaG9zdC5jcHAiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKQEAgLTIwMiw4ICsyMDUsNiBAQAogICAgICAgICAgICAgc3JjczogbGliY3V0aWxzX25vbndpbmRvd3Nfc291cmNlcyArIFsKICAgICAgICAgICAgICAgICAiYW5kcm9pZF9yZWJvb3QuY3BwIiwKICAgICAgICAgICAgICAgICAiYXNobWVtLWRldi5jcHAiLAotICAgICAgICAgICAgICAgICJjYW5uZWRfZnNfY29uZmlnLmNwcCIsCi0gICAgICAgICAgICAgICAgImZzX2NvbmZpZy5jcHAiLAogICAgICAgICAgICAgICAgICJrbG9nLmNwcCIsCiAgICAgICAgICAgICAgICAgInBhcnRpdGlvbl91dGlscy5jcHAiLAogICAgICAgICAgICAgICAgICJxdGFndWlkLmNwcCIsCkBAIC0yMTksMTEgKzIyMCwxOSBAQAogICAgICAgICAgICAgZXhjbHVkZV9zcmNzOiBbCiAgICAgICAgICAgICAgICAgInF0YWd1aWQuY3BwIiwKICAgICAgICAgICAgIF0sCisgICAgICAgICAgICBoZWFkZXJfYWJpX2NoZWNrZXI6IHsKKyAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgICAgIHJlZl9kdW1wX2RpcnM6IFsiYWJpLWR1bXBzIl0sCisgICAgICAgICAgICB9LAogICAgICAgICB9LAogICAgICAgICBwcm9kdWN0OiB7CiAgICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKICAgICAgICAgICAgICAgICAicXRhZ3VpZC5jcHAiLAogICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogeworICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgcmVmX2R1bXBfZGlyczogWyJhYmktZHVtcHMiXSwKKyAgICAgICAgICAgIH0sCiAgICAgICAgIH0sCiAgICAgfSwKIApkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL0tlcm5lbExpYmN1dGlsc1Rlc3QueG1sIGIvbGliY3V0aWxzL0tlcm5lbExpYmN1dGlsc1Rlc3QueG1sCmluZGV4IDQwZTRlZjQuLjk3NTBjYmYgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9LZXJuZWxMaWJjdXRpbHNUZXN0LnhtbAorKysgYi9saWJjdXRpbHMvS2VybmVsTGliY3V0aWxzVGVzdC54bWwKQEAgLTIyLDExICsyMiwxMSBAQAogCiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iS2VybmVsTGliY3V0aWxzVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0tlcm5lbExpYmN1dGlsc1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Iktlcm5lbExpYmN1dGlsc1Rlc3QtPi9kYXRhL2xvY2FsL3Rlc3RzL3VucmVzdHJpY3RlZC9LZXJuZWxMaWJjdXRpbHNUZXN0IiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90ZXN0cy91bnJlc3RyaWN0ZWQiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJLZXJuZWxMaWJjdXRpbHNUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImluY2x1ZGUtZmlsdGVyIiB2YWx1ZT0iKkFzaG1lbVRlc3QqIiAvPgogICAgIDwvdGVzdD4KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9PV05FUlMgYi9saWJjdXRpbHMvT1dORVJTCmluZGV4IDc1MjljYjkuLmUxY2JlNGEgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9PV05FUlMKKysrIGIvbGliY3V0aWxzL09XTkVSUwpAQCAtMSArMSwyIEBACisjIEJ1ZyBjb21wb25lbnQ6IDEyODU3NwogaW5jbHVkZSBwbGF0Zm9ybS9zeXN0ZW0vY29yZTovamFuaXRvcnMvT1dORVJTCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvVEVTVF9NQVBQSU5HIGIvbGliY3V0aWxzL1RFU1RfTUFQUElORwppbmRleCBlYjYzYWE1Li43OGIzZTQ0IDEwMDY0NAotLS0gYS9saWJjdXRpbHMvVEVTVF9NQVBQSU5HCisrKyBiL2xpYmN1dGlscy9URVNUX01BUFBJTkcKQEAgLTEyLDYgKzEyLDkgQEAKICAgImtlcm5lbC1wcmVzdWJtaXQiOiBbCiAgICAgewogICAgICAgIm5hbWUiOiAibGliY3V0aWxzX3Rlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJLZXJuZWxMaWJjdXRpbHNUZXN0IgogICAgIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FiaS1kdW1wcy9hcm02NC9zb3VyY2UtYmFzZWQvbGliY3V0aWxzLnNvLmxzZHVtcCBiL2xpYmN1dGlscy9hYmktZHVtcHMvYXJtNjQvc291cmNlLWJhc2VkL2xpYmN1dGlscy5zby5sc2R1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzZTYxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmN1dGlscy9hYmktZHVtcHMvYXJtNjQvc291cmNlLWJhc2VkL2xpYmN1dGlscy5zby5sc2R1bXAKQEAgLTAsMCArMSwyNjkwIEBACit7CisgImFycmF5X3R5cGVzIiA6CisgWworICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElBMF9pIiwKKyAgICJuYW1lIiA6ICJpbnRbMF0iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUEwX2kiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9CisgXSwKKyAiYnVpbHRpbl90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElhIiwKKyAgICJuYW1lIiA6ICJzaWduZWQgY2hhciIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJYSIsCisgICAic2l6ZSIgOiAxCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEliIiwKKyAgICJuYW1lIiA6ICJib29sIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVEliIiwKKyAgICJzaXplIiA6IDEKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWMiLAorICAgIm5hbWUiIDogImNoYXIiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWMiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSWMiLAorICAgInNpemUiIDogMQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElmIiwKKyAgICJuYW1lIiA6ICJmbG9hdCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJZiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJZiIsCisgICAic2l6ZSIgOiA0CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJaSIsCisgICAibmFtZSIgOiAiaW50IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElpIiwKKyAgICJzaXplIiA6IDQKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWoiLAorICAgIm5hbWUiIDogInVuc2lnbmVkIGludCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJaiIsCisgICAic2l6ZSIgOiA0CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJbCIsCisgICAibmFtZSIgOiAibG9uZyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJbCIsCisgICAic2l6ZSIgOiA4CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEltIiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBsb25nIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVEltIiwKKyAgICJzaXplIiA6IDgKKyAgfSwKKyAgeworICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJdiIsCisgICAibmFtZSIgOiAidm9pZCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJdiIKKyAgfQorIF0sCisgImVsZl9mdW5jdGlvbnMiIDoKKyBbCisgIHsKKyAgICJuYW1lIiA6ICJfWjIzc29ja2V0X21ha2Vfc29ja2FkZHJfdW5QS2NpUDExc29ja2FkZHJfdW5QaiIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNGJhc2U0VHJpbUlSTlN0M19fMTEyYmFzaWNfc3RyaW5nSWNOUzJfMTFjaGFyX3RyYWl0c0ljRUVOUzJfOWFsbG9jYXRvckljRUVFRUVFUzhfT1RfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTNiYXNpY19maWxlYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUU0c3luY0V2IgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTNiYXNpY19maWxlYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUU1aW1idWVFUktOU182bG9jYWxlRSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTEzYmFzaWNfZmlsZWJ1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVFNnNldGJ1ZkVQY2wiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRTdzZWVrb2ZmRXhOU184aW9zX2Jhc2U3c2Vla2RpckVqIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTNiYXNpY19maWxlYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUU3c2Vla3Bvc0VOU180ZnBvc0k5bWJzdGF0ZV90RUVqIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTNiYXNpY19maWxlYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUU4b3ZlcmZsb3dFaSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTEzYmFzaWNfZmlsZWJ1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVFOXBiYWNrZmFpbEVpIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTNiYXNpY19maWxlYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUU5dW5kZXJmbG93RXYiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUMyRXYiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUQwRXYiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUQyRXYiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzEyNF9fcHV0X2NoYXJhY3Rlcl9zZXF1ZW5jZUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRVJOU18xM2Jhc2ljX29zdHJlYW1JVF9UMF9FRVM3X1BLUzRfbSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTZ2ZWN0b3JJNUVudHJ5TlNfOWFsbG9jYXRvcklTMV9FRUUyNF9fZW1wbGFjZV9iYWNrX3Nsb3dfcGF0aElKUzFfRUVFdkRwT1RfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xN2dldGxpbmVJY05TXzExY2hhcl90cmFpdHNJY0VFTlNfOWFsbG9jYXRvckljRUVFRVJOU18xM2Jhc2ljX2lzdHJlYW1JVF9UMF9FRVM5X1JOU18xMmJhc2ljX3N0cmluZ0lTNl9TN19UMV9FRVM2XyIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMWxzSU5TXzExY2hhcl90cmFpdHNJY0VFRUVSTlNfMTNiYXNpY19vc3RyZWFtSWNUX0VFUzZfUEtjIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYW5kcm9pZF9nZXRfY29udHJvbF9maWxlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhbmRyb2lkX2dldF9pb3ByaW8iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhbmRyb2lkX3JlYm9vdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFuZHJvaWRfc2V0X2lvcHJpbyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV9jcmVhdGVfcmVnaW9uIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXNobWVtX2dldF9zaXplX3JlZ2lvbiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV9waW5fcmVnaW9uIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXNobWVtX3NldF9wcm90X3JlZ2lvbiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV91bnBpbl9yZWdpb24iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhc2htZW1fdmFsaWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfYXN5bmNfYmVnaW5fYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9hc3luY19lbmRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfZW5kX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfYmVnaW5fYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9lbmRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9nZXRfZW5hYmxlZF90YWdzIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2luaXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaW5zdGFudF9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2luc3RhbnRfZm9yX3RyYWNrX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaW50NjRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9pbnRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9zZXRfdHJhY2luZ19lbmFibGVkIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX3NldHVwIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX3VwZGF0ZV90YWdzIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY2FubmVkX2ZzX2NvbmZpZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19ib29sIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX2ZpbmQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfZnJlZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19sb2FkIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX2xvYWRfZmlsZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19ub2RlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX3NldCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19zdHIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19jb25maWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19ta2RpcnMiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19wcmVwYXJlX2RpciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX3ByZXBhcmVfZGlyX3N0cmljdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX3ByZXBhcmVfZmlsZV9zdHJpY3QiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19yZWFkX2F0b21pY19pbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc193cml0ZV9hdG9taWNfaW50IgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcENyZWF0ZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBGb3JFYWNoIgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcEZyZWUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwR2V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcEhhc2giCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwTG9jayIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBQdXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwUmVtb3ZlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcFVubG9jayIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImtsb2dfc2V0X2xldmVsIgorICB9LAorICB7CisgICAibmFtZSIgOiAia2xvZ193cml0ZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImtsb2dfd3JpdGV2IgorICB9LAorICB7CisgICAibmFtZSIgOiAibG9hZF9jYW5uZWRfZnNfY29uZmlnIgorICB9LAorICB7CisgICAibmFtZSIgOiAibG9hZF9maWxlIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2NvbnZlcnRfc2RrX3NhbmRib3hfdG9fYXBwX3VpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfYXBwX2lkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9jYWNoZV9naWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2V4dF9jYWNoZV9naWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2V4dF9naWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3Nka19zYW5kYm94X3VpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfc2hhcmVkX2FwcF9naWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3NoYXJlZF9naWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3VpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfdXNlcl9pZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY2xvbmUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jbG9zZV93aXRoX3RhZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY3JlYXRlIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9kZWxldGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2luaXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX3NldF9mZHNhbl90YWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX3Vuc2V0X2Zkc2FuX3RhZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInBhcnRpdGlvbl93aXBlZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInByb3BlcnR5X2dldCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInByb3BlcnR5X2dldF9ib29sIgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfZ2V0X2ludDMyIgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfZ2V0X2ludDY0IgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfbGlzdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInByb3BlcnR5X3NldCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInJlY29yZF9zdHJlYW1fZnJlZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInJlY29yZF9zdHJlYW1fZ2V0X25leHQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJyZWNvcmRfc3RyZWFtX25ldyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9jbG9zZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9nZXRfbG9jYWxfcG9ydCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9pbmFkZHJfYW55X3NlcnZlciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9sb2NhbF9jbGllbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbG9jYWxfY2xpZW50X2Nvbm5lY3QiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyIgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2xvY2FsX3NlcnZlcl9iaW5kIgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X25ldHdvcmtfY2xpZW50IgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X25ldHdvcmtfY2xpZW50X3RpbWVvdXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfc2VuZF9idWZmZXJzIgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9mbG9hdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19hZGRfaW50IgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9zdHIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfY3JlYXRlIgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2NyZWF0ZV9zdHIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfZGVsIgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2Rlc3Ryb3kiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfZHVtcCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19nZXRfZmxvYXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfZ2V0X2ludCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19nZXRfc3RyIgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2hhc19rZXkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfdG9fc3RyIgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfcmVjdiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInVldmVudF9rZXJuZWxfbXVsdGljYXN0X3VpZF9yZWN2IgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X2tlcm5lbF9yZWN2IgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X29wZW5fc29ja2V0IgorICB9CisgXSwKKyAiZWxmX29iamVjdHMiIDoKKyBbCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWlRDTlN0M19fMTE0YmFzaWNfaWZzdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUwX05TXzEzYmFzaWNfaXN0cmVhbUljUzJfRUUiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWlRUTlN0M19fMTE0YmFzaWNfaWZzdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWlRWTlN0M19fMTEzYmFzaWNfZmlsZWJ1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aVFZOU3QzX18xMTRiYXNpY19pZnN0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9lbmFibGVkX3RhZ3MiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaXNfcmVhZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfbWFya2VyX2ZkIgorICB9CisgXSwKKyAiZW51bV90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAorICAgICAibmFtZSIgOiAiSW9TY2hlZENsYXNzX05PTkUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3NfUlQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDIsCisgICAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3NfQkUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDMsCisgICAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3NfSURMRSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTJJb1NjaGVkQ2xhc3MiLAorICAgIm5hbWUiIDogIklvU2NoZWRDbGFzcyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTJJb1NjaGVkQ2xhc3MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSTEySW9TY2hlZENsYXNzIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9pb3NjaGVkX3BvbGljeS5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9CisgXSwKKyAiZnVuY3Rpb25fdHlwZXMiIDoKKyBbCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUZiUHZTX0UiLAorICAgIm5hbWUiIDogImJvb2wgKHZvaWQgKiwgdm9pZCAqKSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGYlB2U19FIiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUZiUHZTX0UiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElGYlB2U19TX0UiLAorICAgIm5hbWUiIDogImJvb2wgKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmJQdlNfU19FIiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUZiUHZTX1NfRSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUZpUHZFIiwKKyAgICJuYW1lIiA6ICJpbnQgKHZvaWQgKikiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUHZFIiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUHZFIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJRnZQS2NTMF9QdkUiLAorICAgIm5hbWUiIDogInZvaWQgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2b2lkICopIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGdlBLY1MwX1B2RSIsCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElGdlBLY1MwX1B2RSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0KKyBdLAorICJmdW5jdGlvbnMiIDoKKyBbCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkX2dldF9jb250cm9sX2ZpbGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhbmRyb2lkX2dldF9jb250cm9sX2ZpbGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYW5kcm9pZF9nZXRfY29udHJvbF9maWxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkX2dldF9jb250cm9sX3NvY2tldCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWRfZ2V0X2lvcHJpbyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfZ2V0X2lvcHJpbyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTJJb1NjaGVkQ2xhc3MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9pb3NjaGVkX3BvbGljeS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZF9yZWJvb3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhbmRyb2lkX3JlYm9vdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FuZHJvaWRfcmVib290LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkX3NldF9pb3ByaW8iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhbmRyb2lkX3NldF9pb3ByaW8iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTJJb1NjaGVkQ2xhc3MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhc2htZW1fY3JlYXRlX3JlZ2lvbiIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFzaG1lbV9jcmVhdGVfcmVnaW9uIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hc2htZW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV9nZXRfc2l6ZV9yZWdpb24iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhc2htZW1fZ2V0X3NpemVfcmVnaW9uIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hc2htZW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV9waW5fcmVnaW9uIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXNobWVtX3Bpbl9yZWdpb24iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYXNobWVtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhc2htZW1fc2V0X3Byb3RfcmVnaW9uIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXNobWVtX3NldF9wcm90X3JlZ2lvbiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FzaG1lbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXNobWVtX3VucGluX3JlZ2lvbiIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFzaG1lbV91bnBpbl9yZWdpb24iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYXNobWVtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhc2htZW1fdmFsaWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhc2htZW1fdmFsaWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FzaG1lbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2FzeW5jX2JlZ2luX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfYXN5bmNfYmVnaW5fYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9hc3luY19lbmRfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9hc3luY19lbmRfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfZW5kX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2VuZF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2JlZ2luX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfYmVnaW5fYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2VuZF9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2VuZF9ib2R5IiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9nZXRfZW5hYmxlZF90YWdzIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2dldF9lbmFibGVkX3RhZ3MiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJbSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2luaXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaW5pdCIsCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfaW5zdGFudF9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2luc3RhbnRfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2luc3RhbnRfZm9yX3RyYWNrX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2tfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2ludDY0X2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaW50NjRfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWwiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9pbnRfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pbnRfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9zZXRfdHJhY2luZ19lbmFibGVkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX3NldF90cmFjaW5nX2VuYWJsZWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2Vfc2V0dXAiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2Vfc2V0dXAiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX3VwZGF0ZV90YWdzIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX3VwZGF0ZV90YWdzIiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNhbm5lZF9mc19jb25maWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjYW5uZWRfZnNfY29uZmlnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBtIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9jYW5uZWRfZnNfY29uZmlnLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfYm9vbCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNvbmZpZ19ib29sIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfZmluZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNvbmZpZ19maW5kIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDVjbm9kZSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19mcmVlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX2ZyZWUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY29uZmlnX2xvYWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfbG9hZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19sb2FkX2ZpbGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfbG9hZF9maWxlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19ub2RlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX25vZGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVA1Y25vZGUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfc2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX3NldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfc3RyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX3N0ciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBLYyIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX2NvbmZpZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX2NvbmZpZyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvZnNfY29uZmlnLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc19ta2RpcnMiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJmc19ta2RpcnMiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc19wcmVwYXJlX2RpciIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3ByZXBhcmVfZGlyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc19wcmVwYXJlX2Rpcl9zdHJpY3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJmc19wcmVwYXJlX2Rpcl9zdHJpY3QiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX3ByZXBhcmVfZmlsZV9zdHJpY3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJmc19wcmVwYXJlX2ZpbGVfc3RyaWN0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc19yZWFkX2F0b21pY19pbnQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJmc19yZWFkX2F0b21pY19pbnQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9mcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiZnNfd3JpdGVfYXRvbWljX2ludCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3dyaXRlX2F0b21pY19pbnQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwQ3JlYXRlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcENyZWF0ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQRmlQdkUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQRmJQdlNfRSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDdIYXNobWFwIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBGb3JFYWNoIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcEZvckVhY2giLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQN0hhc2htYXAiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQRmJQdlNfU19FIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiaGFzaG1hcEZyZWUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwRnJlZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwR2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcEdldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwSGFzaCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImhhc2htYXBIYXNoIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBMb2NrIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcExvY2siLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQN0hhc2htYXAiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiaGFzaG1hcFB1dCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImhhc2htYXBQdXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQN0hhc2htYXAiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwUmVtb3ZlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcFJlbW92ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwVW5sb2NrIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcFVubG9jayIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJrbG9nX3NldF9sZXZlbCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImtsb2dfc2V0X2xldmVsIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9rbG9nLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJrbG9nX3dyaXRlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAia2xvZ193cml0ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMva2xvZy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAia2xvZ193cml0ZXYiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJrbG9nX3dyaXRldiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzVpb3ZlYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMva2xvZy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibG9hZF9jYW5uZWRfZnNfY29uZmlnIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibG9hZF9jYW5uZWRfZnNfY29uZmlnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9jYW5uZWRfZnNfY29uZmlnLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJsb2FkX2ZpbGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJsb2FkX2ZpbGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUHYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbWlzYy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2NvbnZlcnRfc2RrX3NhbmRib3hfdG9fYXBwX3VpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9jb252ZXJ0X3Nka19zYW5kYm94X3RvX2FwcF91aWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9hcHBfaWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X2FwcF9pZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2NhY2hlX2dpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfY2FjaGVfZ2lkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2V4dF9jYWNoZV9naWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X2V4dF9jYWNoZV9naWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfZXh0X2dpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfZXh0X2dpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9zZGtfc2FuZGJveF91aWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X3Nka19zYW5kYm94X3VpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfYXBwX2dpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfc2hhcmVkX2FwcF9naWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfZ2lkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfZ2lkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3VpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfdWlkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3VzZXJfaWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X3VzZXJfaWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jbG9uZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfY2xvbmUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9jbG9zZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2Vfd2l0aF90YWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlX3dpdGhfdGFnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jcmVhdGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX2NyZWF0ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm5hdGl2ZV9oYW5kbGVfZGVsZXRlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9kZWxldGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm5hdGl2ZV9oYW5kbGVfaW5pdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfaW5pdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9zZXRfZmRzYW5fdGFnIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9zZXRfZmRzYW5fdGFnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV91bnNldF9mZHNhbl90YWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX3Vuc2V0X2Zkc2FuX3RhZyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInBhcnRpdGlvbl93aXBlZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInBhcnRpdGlvbl93aXBlZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wYXJ0aXRpb25fdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X2dldCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInByb3BlcnR5X2dldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X2dldF9ib29sIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfZ2V0X2Jvb2wiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElhIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElhIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X2dldF9pbnQzMiIsCisgICAibGlua2VyX3NldF9rZXkiIDogInByb3BlcnR5X2dldF9pbnQzMiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfZ2V0X2ludDY0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfZ2V0X2ludDY0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJwcm9wZXJ0eV9saXN0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfbGlzdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGdlBLY1MwX1B2RSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X3NldCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInByb3BlcnR5X3NldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJyZWNvcmRfc3RyZWFtX2ZyZWUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJyZWNvcmRfc3RyZWFtX2ZyZWUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTJSZWNvcmRTdHJlYW0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcmVjb3JkX3N0cmVhbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicmVjb3JkX3N0cmVhbV9nZXRfbmV4dCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInJlY29yZF9zdHJlYW1fZ2V0X25leHQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTJSZWNvcmRTdHJlYW0iCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJyZWNvcmRfc3RyZWFtX25ldyIsCisgICAibGlua2VyX3NldF9rZXkiIDogInJlY29yZF9zdHJlYW1fbmV3IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfY2xvc2UiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfY2xvc2UiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9nZXRfbG9jYWxfcG9ydCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9nZXRfbG9jYWxfcG9ydCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X2luYWRkcl9hbnlfc2VydmVyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X2luYWRkcl9hbnlfc2VydmVyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X2xvY2FsX2NsaWVudCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9sb2NhbF9jbGllbnQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbG9jYWxfY2xpZW50X2Nvbm5lY3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfbG9jYWxfY2xpZW50X2Nvbm5lY3QiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X2xvY2FsX3NlcnZlciIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnRfdGltZW91dCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudF90aW1lb3V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X3NlbmRfYnVmZmVycyIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9zZW5kX2J1ZmZlcnMiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19hZGRfZmxvYXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfYWRkX2Zsb2F0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9pbnQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfYWRkX2ludCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19hZGRfc3RyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2FkZF9zdHIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19jcmVhdGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfY3JlYXRlIiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2NyZWF0ZV9zdHIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfY3JlYXRlX3N0ciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZGVsIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2RlbCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2Rlc3Ryb3kiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfZGVzdHJveSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2R1bXAiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfZHVtcCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2dldF9mbG9hdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19nZXRfZmxvYXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBmIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2dldF9pbnQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfZ2V0X2ludCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZ2V0X3N0ciIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19nZXRfc3RyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfaGFzX2tleSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19oYXNfa2V5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfdG9fc3RyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX3RvX3N0ciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQYyIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInVldmVudF9rZXJuZWxfbXVsdGljYXN0X3JlY3YiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJ1ZXZlbnRfa2VybmVsX211bHRpY2FzdF9yZWN2IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy91ZXZlbnQuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInVldmVudF9rZXJuZWxfbXVsdGljYXN0X3VpZF9yZWN2IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfdWlkX3JlY3YiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1ZXZlbnRfa2VybmVsX3JlY3YiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJ1ZXZlbnRfa2VybmVsX3JlY3YiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAidWV2ZW50X29wZW5fc29ja2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAidWV2ZW50X29wZW5fc29ja2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgiCisgIH0KKyBdLAorICJnbG9iYWxfdmFycyIgOgorIFsKKyAgeworICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfZW5hYmxlZF90YWdzIiwKKyAgICJuYW1lIiA6ICJhdHJhY2VfZW5hYmxlZF90YWdzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2lzX3JlYWR5IiwKKyAgICJuYW1lIiA6ICJhdHJhY2VfaXNfcmVhZHkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU5TdDNfXzE2YXRvbWljSWJFRSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9tYXJrZXJfZmQiLAorICAgIm5hbWUiIDogImF0cmFjZV9tYXJrZXJfZmQiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfQorIF0sCisgImx2YWx1ZV9yZWZlcmVuY2VfdHlwZXMiIDogW10sCisgInBvaW50ZXJfdHlwZXMiIDoKKyBbCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVAxMklvU2NoZWRDbGFzcyIsCisgICAibmFtZSIgOiAiSW9TY2hlZENsYXNzICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTEySW9TY2hlZENsYXNzIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQMTJJb1NjaGVkQ2xhc3MiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIsCisgICAibmFtZSIgOiAiUmVjb3JkU3RyZWFtICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTEyUmVjb3JkU3RyZWFtIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQMTJSZWNvcmRTdHJlYW0iLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3JlY29yZF9zdHJlYW0uaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDVjbm9kZSIsCisgICAibmFtZSIgOiAiY25vZGUgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJNWNub2RlIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQNWNub2RlIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDdIYXNobWFwIiwKKyAgICJuYW1lIiA6ICJIYXNobWFwICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTdIYXNobWFwIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQN0hhc2htYXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDlzdHJfcGFybXMiLAorICAgIm5hbWUiIDogInN0cl9wYXJtcyAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk5c3RyX3Bhcm1zIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBGYlB2U19FIiwKKyAgICJuYW1lIiA6ICJib29sICgqKSh2b2lkICosIHZvaWQgKikiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZiUHZTX0UiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGYlB2U19FIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBGYlB2U19TX0UiLAorICAgIm5hbWUiIDogImJvb2wgKCopKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGYlB2U19TX0UiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGYlB2U19TX0UiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZpUHZFIiwKKyAgICJuYW1lIiA6ICJpbnQgKCopKHZvaWQgKikiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUHZFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQRmlQdkUiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZ2UEtjUzBfUHZFIiwKKyAgICJuYW1lIiA6ICJ2b2lkICgqKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRnZQS2NTMF9QdkUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGdlBLY1MwX1B2RSIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIsCisgICAibmFtZSIgOiAiY29uc3QgbmF0aXZlX2hhbmRsZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQSzIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAibmFtZSIgOiAiY29uc3QgY3V0aWxzX3NvY2tldF9idWZmZXJfdCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQSzIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQSzVpb3ZlYyIsCisgICAibmFtZSIgOiAiY29uc3QgaW92ZWMgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJSzVpb3ZlYyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEs1aW92ZWMiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2tsb2cuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtjIiwKKyAgICJuYW1lIiA6ICJjb25zdCBjaGFyICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtjIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQS2MiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS3YiLAorICAgIm5hbWUiIDogImNvbnN0IHZvaWQgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS3YiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLdiIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQUHYiLAorICAgIm5hbWUiIDogInZvaWQgKioiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQUHYiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3JlY29yZF9zdHJlYW0uaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUGMiLAorICAgIm5hbWUiIDogImNoYXIgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUGMiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQZiIsCisgICAibmFtZSIgOiAiZmxvYXQgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJZiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUGYiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQaSIsCisgICAibmFtZSIgOiAiaW50ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBpIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9pb3NjaGVkX3BvbGljeS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQaiIsCisgICAibmFtZSIgOiAidW5zaWduZWQgaW50ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBqIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9taXNjLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBtIiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBsb25nICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBtIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVB2IiwKKyAgICJuYW1lIiA6ICJ2b2lkICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXYiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVB2IiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9taXNjLmgiCisgIH0KKyBdLAorICJxdWFsaWZpZWRfdHlwZXMiIDoKKyBbCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJSzEzbmF0aXZlX2hhbmRsZSIsCisgICAibmFtZSIgOiAiY29uc3QgbmF0aXZlX2hhbmRsZSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzaXplIiA6IDEyLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUsyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgIm5hbWUiIDogImNvbnN0IGN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJSzIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAic2l6ZSIgOiAxNiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImlzX2NvbnN0IiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLNWlvdmVjIiwKKyAgICJuYW1lIiA6ICJjb25zdCBpb3ZlYyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJNWlvdmVjIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLNWlvdmVjIiwKKyAgICJzaXplIiA6IDE2LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMva2xvZy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtjIiwKKyAgICJuYW1lIiA6ICJjb25zdCBjaGFyIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEljIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLYyIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS3YiLAorICAgIm5hbWUiIDogImNvbnN0IHZvaWQiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXYiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUt2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfQorIF0sCisgInJlY29yZF90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogInZlcnNpb24iLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogIm51bUZkcyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMzIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibnVtSW50cyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogNjQsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAiZGF0YSIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogOTYsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElBMF9pIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAorICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTEzbmF0aXZlX2hhbmRsZSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzaXplIiA6IDEyLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAiZGF0YSIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJsZW5ndGgiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDY0LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJuYW1lIiA6ICJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSTIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAic2l6ZSIgOiAxNiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogIm5leHQiLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogImZpcnN0X2NoaWxkIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiA2NCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJsYXN0X2NoaWxkIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAxMjgsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibmFtZSIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMTkyLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAidmFsdWUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDI1NiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJNWNub2RlIiwKKyAgICJuYW1lIiA6ICJjbm9kZSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJNWNub2RlIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVEk1Y25vZGUiLAorICAgInNpemUiIDogNDAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfQorIF0sCisgInJ2YWx1ZV9yZWZlcmVuY2VfdHlwZXMiIDogW10KK30KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9hYmktZHVtcHMvYXJtX2FybTY0L3NvdXJjZS1iYXNlZC9saWJjdXRpbHMuc28ubHNkdW1wIGIvbGliY3V0aWxzL2FiaS1kdW1wcy9hcm1fYXJtNjQvc291cmNlLWJhc2VkL2xpYmN1dGlscy5zby5sc2R1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMmZiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmN1dGlscy9hYmktZHVtcHMvYXJtX2FybTY0L3NvdXJjZS1iYXNlZC9saWJjdXRpbHMuc28ubHNkdW1wCkBAIC0wLDAgKzEsMjcwMCBAQAoreworICJhcnJheV90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJQTBfaSIsCisgICAibmFtZSIgOiAiaW50WzBdIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElBMF9pIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfQorIF0sCisgImJ1aWx0aW5fdHlwZXMiIDoKKyBbCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJYSIsCisgICAibmFtZSIgOiAic2lnbmVkIGNoYXIiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWEiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSWEiLAorICAgInNpemUiIDogMQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJpc191bnNpZ25lZCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJYiIsCisgICAibmFtZSIgOiAiYm9vbCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJYiIsCisgICAic2l6ZSIgOiAxCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEljIiwKKyAgICJuYW1lIiA6ICJjaGFyIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEljIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVEljIiwKKyAgICJzaXplIiA6IDEKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJZiIsCisgICAibmFtZSIgOiAiZmxvYXQiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWYiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSWYiLAorICAgInNpemUiIDogNAorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWkiLAorICAgIm5hbWUiIDogImludCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJaSIsCisgICAic2l6ZSIgOiA0CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElqIiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBpbnQiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSWoiLAorICAgInNpemUiIDogNAorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDIsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJpc191bnNpZ25lZCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJdCIsCisgICAibmFtZSIgOiAidW5zaWduZWQgc2hvcnQiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXQiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSXQiLAorICAgInNpemUiIDogMgorICB9LAorICB7CisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEl2IiwKKyAgICJuYW1lIiA6ICJ2b2lkIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVEl2IgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSXgiLAorICAgIm5hbWUiIDogImxvbmcgbG9uZyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJeCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJeCIsCisgICAic2l6ZSIgOiA4CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEl5IiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBsb25nIGxvbmciLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSXkiLAorICAgInNpemUiIDogOAorICB9CisgXSwKKyAiZWxmX2Z1bmN0aW9ucyIgOgorIFsKKyAgeworICAgIm5hbWUiIDogIl9aMjNzb2NrZXRfbWFrZV9zb2NrYWRkcl91blBLY2lQMTFzb2NrYWRkcl91blBpIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pON2FuZHJvaWQ0YmFzZTRUcmltSVJOU3QzX18xMTJiYXNpY19zdHJpbmdJY05TMl8xMWNoYXJfdHJhaXRzSWNFRU5TMl85YWxsb2NhdG9ySWNFRUVFRUVTOF9PVF8iCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRTRzeW5jRXYiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRTVpbWJ1ZUVSS05TXzZsb2NhbGVFIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTNiYXNpY19maWxlYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUU2c2V0YnVmRVBjaSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTEzYmFzaWNfZmlsZWJ1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVFN3NlZWtvZmZFeE5TXzhpb3NfYmFzZTdzZWVrZGlyRWoiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRTdzZWVrcG9zRU5TXzRmcG9zSTltYnN0YXRlX3RFRWoiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRThvdmVyZmxvd0VpIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTNiYXNpY19maWxlYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUU5cGJhY2tmYWlsRWkiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExM2Jhc2ljX2ZpbGVidWZJY05TXzExY2hhcl90cmFpdHNJY0VFRTl1bmRlcmZsb3dFdiIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTEzYmFzaWNfZmlsZWJ1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVFQzJFdiIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTEzYmFzaWNfZmlsZWJ1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRDBFdiIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTEzYmFzaWNfZmlsZWJ1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRDJFdiIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTI0X19wdXRfY2hhcmFjdGVyX3NlcXVlbmNlSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFUk5TXzEzYmFzaWNfb3N0cmVhbUlUX1QwX0VFUzdfUEtTNF9qIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xNnZlY3Rvckk1RW50cnlOU185YWxsb2NhdG9ySVMxX0VFRTI0X19lbXBsYWNlX2JhY2tfc2xvd19wYXRoSUpTMV9FRUV2RHBPVF8iCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzE3Z2V0bGluZUljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFUk5TXzEzYmFzaWNfaXN0cmVhbUlUX1QwX0VFUzlfUk5TXzEyYmFzaWNfc3RyaW5nSVM2X1M3X1QxX0VFUzZfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xbHNJTlNfMTFjaGFyX3RyYWl0c0ljRUVFRVJOU18xM2Jhc2ljX29zdHJlYW1JY1RfRUVTNl9QS2MiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhbmRyb2lkX2dldF9jb250cm9sX2ZpbGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhbmRyb2lkX2dldF9jb250cm9sX3NvY2tldCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFuZHJvaWRfZ2V0X2lvcHJpbyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFuZHJvaWRfcmVib290IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYW5kcm9pZF9zZXRfaW9wcmlvIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXNobWVtX2NyZWF0ZV9yZWdpb24iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhc2htZW1fZ2V0X3NpemVfcmVnaW9uIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXNobWVtX3Bpbl9yZWdpb24iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhc2htZW1fc2V0X3Byb3RfcmVnaW9uIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXNobWVtX3VucGluX3JlZ2lvbiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV92YWxpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9hc3luY19iZWdpbl9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2FzeW5jX2VuZF9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2FzeW5jX2Zvcl90cmFja19iZWdpbl9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2FzeW5jX2Zvcl90cmFja19lbmRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9iZWdpbl9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2VuZF9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2dldF9lbmFibGVkX3RhZ3MiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaW5pdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9pbnN0YW50X2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2tfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9pbnQ2NF9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2ludF9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX3NldF90cmFjaW5nX2VuYWJsZWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2Vfc2V0dXAiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfdXBkYXRlX3RhZ3MiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjYW5uZWRfZnNfY29uZmlnIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX2Jvb2wiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfZmluZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19mcmVlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX2xvYWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfbG9hZF9maWxlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX25vZGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfc2V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX3N0ciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX2NvbmZpZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX21rZGlycyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX3ByZXBhcmVfZGlyIgorICB9LAorICB7CisgICAibmFtZSIgOiAiZnNfcHJlcGFyZV9kaXJfc3RyaWN0IgorICB9LAorICB7CisgICAibmFtZSIgOiAiZnNfcHJlcGFyZV9maWxlX3N0cmljdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX3JlYWRfYXRvbWljX2ludCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX3dyaXRlX2F0b21pY19pbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwQ3JlYXRlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcEZvckVhY2giCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwRnJlZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBHZXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwSGFzaCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBMb2NrIgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcFB1dCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBSZW1vdmUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwVW5sb2NrIgorICB9LAorICB7CisgICAibmFtZSIgOiAia2xvZ19zZXRfbGV2ZWwiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJrbG9nX3dyaXRlIgorICB9LAorICB7CisgICAibmFtZSIgOiAia2xvZ193cml0ZXYiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJsb2FkX2Nhbm5lZF9mc19jb25maWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJsb2FkX2ZpbGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfY29udmVydF9zZGtfc2FuZGJveF90b19hcHBfdWlkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9hcHBfaWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2NhY2hlX2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfZXh0X2NhY2hlX2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfZXh0X2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfc2RrX3NhbmRib3hfdWlkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfYXBwX2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfc2hhcmVkX2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfdWlkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF91c2VyX2lkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jbG9uZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2UiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlX3dpdGhfdGFnIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jcmVhdGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2RlbGV0ZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfaW5pdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfc2V0X2Zkc2FuX3RhZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfdW5zZXRfZmRzYW5fdGFnIgorICB9LAorICB7CisgICAibmFtZSIgOiAicGFydGl0aW9uX3dpcGVkIgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfZ2V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfZ2V0X2Jvb2wiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9nZXRfaW50MzIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9nZXRfaW50NjQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9saXN0IgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfc2V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAicmVjb3JkX3N0cmVhbV9mcmVlIgorICB9LAorICB7CisgICAibmFtZSIgOiAicmVjb3JkX3N0cmVhbV9nZXRfbmV4dCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInJlY29yZF9zdHJlYW1fbmV3IgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2Nsb3NlIgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2dldF9sb2NhbF9wb3J0IgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2luYWRkcl9hbnlfc2VydmVyIgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2xvY2FsX2NsaWVudCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnRfdGltZW91dCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9zZW5kX2J1ZmZlcnMiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfYWRkX2Zsb2F0IgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9pbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfYWRkX3N0ciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19jcmVhdGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfY3JlYXRlX3N0ciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19kZWwiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfZGVzdHJveSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19kdW1wIgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2dldF9mbG9hdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19nZXRfaW50IgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2dldF9zdHIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfaGFzX2tleSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc190b19zdHIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJ1ZXZlbnRfa2VybmVsX211bHRpY2FzdF9yZWN2IgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfdWlkX3JlY3YiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJ1ZXZlbnRfa2VybmVsX3JlY3YiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJ1ZXZlbnRfb3Blbl9zb2NrZXQiCisgIH0KKyBdLAorICJlbGZfb2JqZWN0cyIgOgorIFsKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aVENOU3QzX18xMTRiYXNpY19pZnN0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRTBfTlNfMTNiYXNpY19pc3RyZWFtSWNTMl9FRSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aVFROU3QzX18xMTRiYXNpY19pZnN0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aVFZOU3QzX18xMTNiYXNpY19maWxlYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pUVk5TdDNfXzExNGJhc2ljX2lmc3RyZWFtSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2VuYWJsZWRfdGFncyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9pc19yZWFkeSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9tYXJrZXJfZmQiCisgIH0KKyBdLAorICJlbnVtX3R5cGVzIiA6CisgWworICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCisgICAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3NfTk9ORSIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogIklvU2NoZWRDbGFzc19SVCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMiwKKyAgICAgIm5hbWUiIDogIklvU2NoZWRDbGFzc19CRSIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMywKKyAgICAgIm5hbWUiIDogIklvU2NoZWRDbGFzc19JRExFIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxMklvU2NoZWRDbGFzcyIsCisgICAibmFtZSIgOiAiSW9TY2hlZENsYXNzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxMklvU2NoZWRDbGFzcyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJMTJJb1NjaGVkQ2xhc3MiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0KKyBdLAorICJmdW5jdGlvbl90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJRmJQdlNfRSIsCisgICAibmFtZSIgOiAiYm9vbCAodm9pZCAqLCB2b2lkICopIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZiUHZTX0UiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJRmJQdlNfRSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUZiUHZTX1NfRSIsCisgICAibmFtZSIgOiAiYm9vbCAodm9pZCAqLCB2b2lkICosIHZvaWQgKikiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGYlB2U19TX0UiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJRmJQdlNfU19FIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJRmlQdkUiLAorICAgIm5hbWUiIDogImludCAodm9pZCAqKSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQdkUiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJRmlQdkUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElGdlBLY1MwX1B2RSIsCisgICAibmFtZSIgOiAidm9pZCAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHZvaWQgKikiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZ2UEtjUzBfUHZFIiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUZ2UEtjUzBfUHZFIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfQorIF0sCisgImZ1bmN0aW9ucyIgOgorIFsKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfZmlsZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfZmlsZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hbmRyb2lkX2dldF9jb250cm9sX2ZpbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZF9nZXRfaW9wcmlvIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYW5kcm9pZF9nZXRfaW9wcmlvIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxMklvU2NoZWRDbGFzcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkX3JlYm9vdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfcmVib290IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYW5kcm9pZF9yZWJvb3QuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWRfc2V0X2lvcHJpbyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfc2V0X2lvcHJpbyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxMklvU2NoZWRDbGFzcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaW9zY2hlZF9wb2xpY3kuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV9jcmVhdGVfcmVnaW9uIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXNobWVtX2NyZWF0ZV9yZWdpb24iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FzaG1lbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXNobWVtX2dldF9zaXplX3JlZ2lvbiIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFzaG1lbV9nZXRfc2l6ZV9yZWdpb24iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FzaG1lbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXNobWVtX3Bpbl9yZWdpb24iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhc2htZW1fcGluX3JlZ2lvbiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hc2htZW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV9zZXRfcHJvdF9yZWdpb24iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhc2htZW1fc2V0X3Byb3RfcmVnaW9uIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYXNobWVtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhc2htZW1fdW5waW5fcmVnaW9uIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXNobWVtX3VucGluX3JlZ2lvbiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hc2htZW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV92YWxpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFzaG1lbV92YWxpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYXNobWVtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfYXN5bmNfYmVnaW5fYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9hc3luY19iZWdpbl9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2FzeW5jX2VuZF9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2FzeW5jX2VuZF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2FzeW5jX2Zvcl90cmFja19iZWdpbl9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2FzeW5jX2Zvcl90cmFja19iZWdpbl9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2FzeW5jX2Zvcl90cmFja19lbmRfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfZW5kX2JvZHkiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfYmVnaW5fYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9iZWdpbl9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfZW5kX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfZW5kX2JvZHkiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2dldF9lbmFibGVkX3RhZ3MiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfZ2V0X2VuYWJsZWRfdGFncyIsCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl5IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfaW5pdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pbml0IiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9pbnN0YW50X2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaW5zdGFudF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2tfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pbnN0YW50X2Zvcl90cmFja19ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfaW50NjRfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pbnQ2NF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJeCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2ludF9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2ludF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX3NldF90cmFjaW5nX2VuYWJsZWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2Vfc2V0X3RyYWNpbmdfZW5hYmxlZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9zZXR1cCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9zZXR1cCIsCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfdXBkYXRlX3RhZ3MiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfdXBkYXRlX3RhZ3MiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY2FubmVkX2ZzX2NvbmZpZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNhbm5lZF9mc19jb25maWciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2Nhbm5lZF9mc19jb25maWcuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19ib29sIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX2Jvb2wiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19maW5kIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX2ZpbmQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQNWNub2RlIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY29uZmlnX2ZyZWUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfZnJlZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfbG9hZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNvbmZpZ19sb2FkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY29uZmlnX2xvYWRfZmlsZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNvbmZpZ19sb2FkX2ZpbGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY29uZmlnX25vZGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfbm9kZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDVjbm9kZSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19zZXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfc2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19zdHIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfc3RyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUEtjIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiZnNfY29uZmlnIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiZnNfY29uZmlnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB5IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9mc19jb25maWcuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX21rZGlycyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX21rZGlycyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXQiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX3ByZXBhcmVfZGlyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiZnNfcHJlcGFyZV9kaXIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl0IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX3ByZXBhcmVfZGlyX3N0cmljdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3ByZXBhcmVfZGlyX3N0cmljdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXQiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9mcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiZnNfcHJlcGFyZV9maWxlX3N0cmljdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3ByZXBhcmVfZmlsZV9zdHJpY3QiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl0IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX3JlYWRfYXRvbWljX2ludCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3JlYWRfYXRvbWljX2ludCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc193cml0ZV9hdG9taWNfaW50IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiZnNfd3JpdGVfYXRvbWljX2ludCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBDcmVhdGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwQ3JlYXRlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGaVB2RSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGYlB2U19FIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQN0hhc2htYXAiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiaGFzaG1hcEZvckVhY2giLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwRm9yRWFjaCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGYlB2U19TX0UiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwRnJlZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImhhc2htYXBGcmVlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDdIYXNobWFwIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBHZXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwR2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDdIYXNobWFwIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBIYXNoIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcEhhc2giLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiaGFzaG1hcExvY2siLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwTG9jayIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwUHV0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcFB1dCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBSZW1vdmUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwUmVtb3ZlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDdIYXNobWFwIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBVbmxvY2siLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwVW5sb2NrIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDdIYXNobWFwIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImtsb2dfc2V0X2xldmVsIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAia2xvZ19zZXRfbGV2ZWwiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2tsb2cuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImtsb2dfd3JpdGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJrbG9nX3dyaXRlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9rbG9nLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJrbG9nX3dyaXRldiIsCisgICAibGlua2VyX3NldF9rZXkiIDogImtsb2dfd3JpdGV2IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLNWlvdmVjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9rbG9nLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJsb2FkX2Nhbm5lZF9mc19jb25maWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJsb2FkX2Nhbm5lZF9mc19jb25maWciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2Nhbm5lZF9mc19jb25maWcuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImxvYWRfZmlsZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImxvYWRfZmlsZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9taXNjLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfY29udmVydF9zZGtfc2FuZGJveF90b19hcHBfdWlkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2NvbnZlcnRfc2RrX3NhbmRib3hfdG9fYXBwX3VpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2FwcF9pZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfYXBwX2lkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfY2FjaGVfZ2lkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF9jYWNoZV9naWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfZXh0X2NhY2hlX2dpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfZXh0X2NhY2hlX2dpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9leHRfZ2lkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF9leHRfZ2lkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3Nka19zYW5kYm94X3VpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfc2RrX3NhbmRib3hfdWlkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3NoYXJlZF9hcHBfZ2lkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfYXBwX2dpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3NoYXJlZF9naWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X3NoYXJlZF9naWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfdWlkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF91aWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfdXNlcl9pZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfdXNlcl9pZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2Nsb25lIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9jbG9uZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2UiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jbG9zZV93aXRoX3RhZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2Vfd2l0aF90YWciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2NyZWF0ZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfY3JlYXRlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9kZWxldGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX2RlbGV0ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9pbml0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9pbml0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX3NldF9mZHNhbl90YWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX3NldF9mZHNhbl90YWciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX3Vuc2V0X2Zkc2FuX3RhZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfdW5zZXRfZmRzYW5fdGFnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicGFydGl0aW9uX3dpcGVkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicGFydGl0aW9uX3dpcGVkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3BhcnRpdGlvbl91dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfZ2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfZ2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfZ2V0X2Jvb2wiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJwcm9wZXJ0eV9nZXRfYm9vbCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWEiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWEiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfZ2V0X2ludDMyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfZ2V0X2ludDMyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJwcm9wZXJ0eV9nZXRfaW50NjQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJwcm9wZXJ0eV9nZXRfaW50NjQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl4IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl4IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X2xpc3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJwcm9wZXJ0eV9saXN0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEZ2UEtjUzBfUHZFIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfc2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfc2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInJlY29yZF9zdHJlYW1fZnJlZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInJlY29yZF9zdHJlYW1fZnJlZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJyZWNvcmRfc3RyZWFtX2dldF9uZXh0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicmVjb3JkX3N0cmVhbV9nZXRfbmV4dCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3JlY29yZF9zdHJlYW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInJlY29yZF9zdHJlYW1fbmV3IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicmVjb3JkX3N0cmVhbV9uZXciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDEyUmVjb3JkU3RyZWFtIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3JlY29yZF9zdHJlYW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9jbG9zZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9jbG9zZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X2dldF9sb2NhbF9wb3J0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X2dldF9sb2NhbF9wb3J0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfaW5hZGRyX2FueV9zZXJ2ZXIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfaW5hZGRyX2FueV9zZXJ2ZXIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbG9jYWxfY2xpZW50IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X2xvY2FsX2NsaWVudCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X2xvY2FsX3NlcnZlciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXJfYmluZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXJfYmluZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudF90aW1lb3V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X25ldHdvcmtfY2xpZW50X3RpbWVvdXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfc2VuZF9idWZmZXJzIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X3NlbmRfYnVmZmVycyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9mbG9hdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19hZGRfZmxvYXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfYWRkX2ludCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19hZGRfaW50IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9zdHIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfYWRkX3N0ciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2NyZWF0ZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19jcmVhdGUiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfY3JlYXRlX3N0ciIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19jcmVhdGVfc3RyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19kZWwiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfZGVsIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZGVzdHJveSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19kZXN0cm95IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZHVtcCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19kdW1wIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZ2V0X2Zsb2F0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2dldF9mbG9hdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZ2V0X2ludCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19nZXRfaW50IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19nZXRfc3RyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2dldF9zdHIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19oYXNfa2V5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2hhc19rZXkiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc190b19zdHIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfdG9fc3RyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBjIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfcmVjdiIsCisgICAibGlua2VyX3NldF9rZXkiIDogInVldmVudF9rZXJuZWxfbXVsdGljYXN0X3JlY3YiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfdWlkX3JlY3YiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJ1ZXZlbnRfa2VybmVsX211bHRpY2FzdF91aWRfcmVjdiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy91ZXZlbnQuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInVldmVudF9rZXJuZWxfcmVjdiIsCisgICAibGlua2VyX3NldF9rZXkiIDogInVldmVudF9rZXJuZWxfcmVjdiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1ZXZlbnRfb3Blbl9zb2NrZXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJ1ZXZlbnRfb3Blbl9zb2NrZXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy91ZXZlbnQuaCIKKyAgfQorIF0sCisgImdsb2JhbF92YXJzIiA6CisgWworICB7CisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9lbmFibGVkX3RhZ3MiLAorICAgIm5hbWUiIDogImF0cmFjZV9lbmFibGVkX3RhZ3MiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaXNfcmVhZHkiLAorICAgIm5hbWUiIDogImF0cmFjZV9pc19yZWFkeSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTlN0M19fMTZhdG9taWNJYkVFIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX21hcmtlcl9mZCIsCisgICAibmFtZSIgOiAiYXRyYWNlX21hcmtlcl9mZCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9CisgXSwKKyAibHZhbHVlX3JlZmVyZW5jZV90eXBlcyIgOiBbXSwKKyAicG9pbnRlcl90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDEySW9TY2hlZENsYXNzIiwKKyAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3MgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTJJb1NjaGVkQ2xhc3MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVAxMklvU2NoZWRDbGFzcyIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaW9zY2hlZF9wb2xpY3kuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDEyUmVjb3JkU3RyZWFtIiwKKyAgICJuYW1lIiA6ICJSZWNvcmRTdHJlYW0gKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTJSZWNvcmRTdHJlYW0iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcmVjb3JkX3N0cmVhbS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTEzbmF0aXZlX2hhbmRsZSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQNWNub2RlIiwKKyAgICJuYW1lIiA6ICJjbm9kZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk1Y25vZGUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVA1Y25vZGUiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQN0hhc2htYXAiLAorICAgIm5hbWUiIDogIkhhc2htYXAgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJN0hhc2htYXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQOXN0cl9wYXJtcyIsCisgICAibmFtZSIgOiAic3RyX3Bhcm1zICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTlzdHJfcGFybXMiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZiUHZTX0UiLAorICAgIm5hbWUiIDogImJvb2wgKCopKHZvaWQgKiwgdm9pZCAqKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmJQdlNfRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEZiUHZTX0UiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZiUHZTX1NfRSIsCisgICAibmFtZSIgOiAiYm9vbCAoKikodm9pZCAqLCB2b2lkICosIHZvaWQgKikiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZiUHZTX1NfRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEZiUHZTX1NfRSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRmlQdkUiLAorICAgIm5hbWUiIDogImludCAoKikodm9pZCAqKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQdkUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGaVB2RSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRnZQS2NTMF9QdkUiLAorICAgIm5hbWUiIDogInZvaWQgKCopKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2b2lkICopIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGdlBLY1MwX1B2RSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEZ2UEtjUzBfUHZFIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJuYW1lIiA6ICJjb25zdCBuYXRpdmVfaGFuZGxlICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUsxM25hdGl2ZV9oYW5kbGUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJuYW1lIiA6ICJjb25zdCBjdXRpbHNfc29ja2V0X2J1ZmZlcl90ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUsyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLNWlvdmVjIiwKKyAgICJuYW1lIiA6ICJjb25zdCBpb3ZlYyAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLNWlvdmVjIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQSzVpb3ZlYyIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMva2xvZy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS2MiLAorICAgIm5hbWUiIDogImNvbnN0IGNoYXIgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLYyIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLdiIsCisgICAibmFtZSIgOiAiY29uc3Qgdm9pZCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLdiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEt2IiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBQdiIsCisgICAibmFtZSIgOiAidm9pZCAqKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBQdiIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcmVjb3JkX3N0cmVhbS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQYyIsCisgICAibmFtZSIgOiAiY2hhciAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEljIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQYyIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBmIiwKKyAgICJuYW1lIiA6ICJmbG9hdCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQZiIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBpIiwKKyAgICJuYW1lIiA6ICJpbnQgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUGkiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBqIiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBpbnQgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUGoiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL21pc2MuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUHYiLAorICAgIm5hbWUiIDogInZvaWQgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUHYiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL21pc2MuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUHkiLAorICAgIm5hbWUiIDogInVuc2lnbmVkIGxvbmcgbG9uZyAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl5IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQeSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2Nhbm5lZF9mc19jb25maWcuaCIKKyAgfQorIF0sCisgInF1YWxpZmllZF90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImlzX2NvbnN0IiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJuYW1lIiA6ICJjb25zdCBuYXRpdmVfaGFuZGxlIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUsxM25hdGl2ZV9oYW5kbGUiLAorICAgInNpemUiIDogMTIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJSzIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAibmFtZSIgOiAiY29uc3QgY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJSzVpb3ZlYyIsCisgICAibmFtZSIgOiAiY29uc3QgaW92ZWMiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTVpb3ZlYyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJSzVpb3ZlYyIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMva2xvZy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtjIiwKKyAgICJuYW1lIiA6ICJjb25zdCBjaGFyIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEljIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLYyIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS3YiLAorICAgIm5hbWUiIDogImNvbnN0IHZvaWQiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXYiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUt2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfQorIF0sCisgInJlY29yZF90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogInZlcnNpb24iLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogIm51bUZkcyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMzIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibnVtSW50cyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogNjQsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAiZGF0YSIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogOTYsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElBMF9pIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAorICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTEzbmF0aXZlX2hhbmRsZSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzaXplIiA6IDEyLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAiZGF0YSIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJsZW5ndGgiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDMyLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJuYW1lIiA6ICJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSTIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibmV4dCIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAiZmlyc3RfY2hpbGQiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDMyLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogImxhc3RfY2hpbGQiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDY0LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogIm5hbWUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDk2LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAidmFsdWUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDEyOCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJNWNub2RlIiwKKyAgICJuYW1lIiA6ICJjbm9kZSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJNWNub2RlIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVEk1Y25vZGUiLAorICAgInNpemUiIDogMjAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfQorIF0sCisgInJ2YWx1ZV9yZWZlcmVuY2VfdHlwZXMiIDogW10KK30KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9hcmNoLXg4Ni9jYWNoZS5oIGIvbGliY3V0aWxzL2FyY2gteDg2L2NhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjJmZWEuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL2FyY2gteDg2L2NhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmIGRlZmluZWQoX19zbG1fXykKLS8qIFZhbHVlcyBhcmUgb3B0aW1pemVkIGZvciBTaWx2ZXJtb250ICovCi0jZGVmaW5lIFNIQVJFRF9DQUNIRV9TSVpFICAgKDEwMjQqMTAyNCkgICAgICAgICAvKiBTaWx2ZXJtb250IEwyIENhY2hlICovCi0jZGVmaW5lIERBVEFfQ0FDSEVfU0laRSAgICAgKDI0KjEwMjQpICAgICAgICAgICAvKiBTaWx2ZXJtb250IEwxIERhdGEgQ2FjaGUgKi8KLSNlbHNlCi0vKiBWYWx1ZXMgYXJlIG9wdGltaXplZCBmb3IgQXRvbSAqLwotI2RlZmluZSBTSEFSRURfQ0FDSEVfU0laRSAgICg1MTIqMTAyNCkgICAgICAgICAgLyogQXRvbSBMMiBDYWNoZSAqLwotI2RlZmluZSBEQVRBX0NBQ0hFX1NJWkUgICAgICgyNCoxMDI0KSAgICAgICAgICAgLyogQXRvbSBMMSBEYXRhIENhY2hlICovCi0jZW5kaWYKLQotI2RlZmluZSBTSEFSRURfQ0FDSEVfU0laRV9IQUxGICAoU0hBUkVEX0NBQ0hFX1NJWkUgLyAyKQotI2RlZmluZSBEQVRBX0NBQ0hFX1NJWkVfSEFMRiAgICAoREFUQV9DQUNIRV9TSVpFIC8gMikKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9hcmNoLXg4Nl82NC9jYWNoZS5oIGIvbGliY3V0aWxzL2FyY2gteDg2XzY0L2NhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNDQzMDkuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL2FyY2gteDg2XzY0L2NhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyogVmFsdWVzIGFyZSBvcHRpbWl6ZWQgZm9yIFNpbHZlcm1vbnQgKi8KLSNkZWZpbmUgU0hBUkVEX0NBQ0hFX1NJWkUJKDEwMjQqMTAyNCkJCQkvKiBTaWx2ZXJtb250IEwyIENhY2hlICovCi0jZGVmaW5lIERBVEFfQ0FDSEVfU0laRQkJKDI0KjEwMjQpCQkJLyogU2lsdmVybW9udCBMMSBEYXRhIENhY2hlICovCi0KLSNkZWZpbmUgU0hBUkVEX0NBQ0hFX1NJWkVfSEFMRgkoU0hBUkVEX0NBQ0hFX1NJWkUgLyAyKQotI2RlZmluZSBEQVRBX0NBQ0hFX1NJWkVfSEFMRgkoREFUQV9DQUNIRV9TSVpFIC8gMikKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9hc2htZW0tZGV2LmNwcCBiL2xpYmN1dGlscy9hc2htZW0tZGV2LmNwcAppbmRleCA2YTI3ZjlhLi40MTBkYmZkIDEwMDY0NAotLS0gYS9saWJjdXRpbHMvYXNobWVtLWRldi5jcHAKKysrIGIvbGliY3V0aWxzL2FzaG1lbS1kZXYuY3BwCkBAIC00NCwxNiArNDQsNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogCi0vKiBXaWxsIGJlIGFkZGVkIHRvIFVBUEkgb25jZSB1cHN0cmVhbSBjaGFuZ2UgaXMgbWVyZ2VkICovCi0jZGVmaW5lIEZfU0VBTF9GVVRVUkVfV1JJVEUgMHgwMDEwCi0KLS8qCi0gKiBUaGUgbWluaW11bSB2ZW5kb3IgQVBJIGxldmVsIGF0IGFuZCBhZnRlciB3aGljaCBpdCBpcyBzYWZlIHRvIHVzZSBtZW1mZC4KLSAqIFRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBkZXByZWNhdGlvbiBvZiBhc2htZW0uCi0gKi8KLSNkZWZpbmUgTUlOX01FTUZEX1ZFTkRPUl9BUElfTEVWRUwgMjkKLSNkZWZpbmUgTUlOX01FTUZEX1ZFTkRPUl9BUElfTEVWRUxfQ0hBUiAnUScKLQogLyogYXNobWVtIGlkZW50aXR5ICovCiBzdGF0aWMgZGV2X3QgX19hc2htZW1fcmRldjsKIC8qCkBAIC05MSw1NSArODEsMTcgQEAKIAogLyogRGV0ZXJtaW5lIGlmIHZlbmRvciBwcm9jZXNzZXMgd291bGQgYmUgb2sgd2l0aCBtZW1mZCBpbiB0aGUgc3lzdGVtOgogICoKLSAqIElmIFZOREsgaXMgdXNpbmcgb2xkZXIgbGliY3V0aWxzLCBkb24ndCB1c2UgbWVtZmQuIFRoaXMgaXMgc28gdGhhdCB0aGUKLSAqIHNhbWUgc2hhcmVkIG1lbW9yeSBtZWNoYW5pc20gaXMgdXNlZCBhY3Jvc3MgYmluZGVyIHRyYW5zYWN0aW9ucyBiZXR3ZWVuCi0gKiB2ZW5kb3IgcGFydGl0aW9uIHByb2Nlc3NlcyBhbmQgc3lzdGVtIHBhcnRpdGlvbiBwcm9jZXNzZXMuCisgKiBQcmV2aW91c2x5IHRoaXMgZnVuY3Rpb24gY2hlY2tlZCBpZiBtZW1mZCBpcyBzdXBwb3J0ZWQgYnkgY2hlY2tpbmcgaWYKKyAqIHZlbmRvciBWTkRLIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIFEuIEFzIHdlIGNhbiBhc3N1bWUgYWxsIHRyZWJsZWxpemVkCisgKiBkZXZpY2UgdXNpbmcgdGhpcyBjb2RlIGlzIHVwIHRvIGRhdGUgZW5vdWdoIHRvIHVzZSBtZW1mZCwgbWVtZmQgaXMgYWxsb3dlZAorICogaWYgdGhlIGRldmljZSBpcyB0cmVibGVsaXplZC4KICAqLwogc3RhdGljIGJvb2wgY2hlY2tfdmVuZG9yX21lbWZkX2FsbG93ZWQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgdm5ka192ZXJzaW9uID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLnZuZGsudmVyc2lvbiIsICIiKTsKKyAgICBzdGF0aWMgYm9vbCBpc190cmVibGVsaXplZCA9IGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8udHJlYmxlLmVuYWJsZWQiLCBmYWxzZSk7CiAKLSAgICBpZiAodm5ka192ZXJzaW9uID09ICIiKSB7Ci0gICAgICAgIEFMT0dFKCJtZW1mZDogcm8udm5kay52ZXJzaW9uIG5vdCBkZWZpbmVkIG9yIGludmFsaWQgKCVzKSwgdGhpcyBpcyBtYW5kYXRlZCBzaW5jZSBQLlxuIiwKLSAgICAgICAgICAgICAgdm5ka192ZXJzaW9uLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogTm8gaXNzdWVzIGlmIHZlbmRvciBpcyB0YXJnZXR0aW5nIGN1cnJlbnQgRGVzc2VydCAqLwotICAgIGlmICh2bmRrX3ZlcnNpb24gPT0gImN1cnJlbnQiKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiBWTkRLIHZlcnNpb24gaXMgYSBudW1iZXIgYW5kIGFjdCBvbiBpdCAqLwotICAgIGNoYXIqIHA7Ci0gICAgbG9uZyBpbnQgdmVycyA9IHN0cnRvbCh2bmRrX3ZlcnNpb24uY19zdHIoKSwgJnAsIDEwKTsKLSAgICBpZiAoKnAgPT0gMCkgewotICAgICAgICBpZiAodmVycyA8IE1JTl9NRU1GRF9WRU5ET1JfQVBJX0xFVkVMKSB7Ci0gICAgICAgICAgICBBTE9HSSgibWVtZmQ6IGRldmljZSBWTkRLIHZlcnNpb24gKCVzKSBpcyA8IFEgc28gdXNpbmcgYXNobWVtLlxuIiwKLSAgICAgICAgICAgICAgICAgIHZuZGtfdmVyc2lvbi5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIE5vbi1udW1lcmljIHNob3VsZCBiZSBhIHNpbmdsZSBBU0NJSSBjaGFyYWN0ZXIuIENoYXJhY3RlcnMgYWZ0ZXIgdGhlCi0gICAgLy8gZmlyc3QgYXJlIGlnbm9yZWQuCi0gICAgaWYgKHRvbG93ZXIodm5ka192ZXJzaW9uWzBdKSA8ICdhJyB8fCB0b2xvd2VyKHZuZGtfdmVyc2lvblswXSkgPiAneicpIHsKLSAgICAgICAgQUxPR0UoIm1lbWZkOiByby52bmRrLnZlcnNpb24gbm90IGRlZmluZWQgb3IgaW52YWxpZCAoJXMpLCB0aGlzIGlzIG1hbmRhdGVkIHNpbmNlIFAuXG4iLAotICAgICAgICAgICAgICB2bmRrX3ZlcnNpb24uY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodG9sb3dlcih2bmRrX3ZlcnNpb25bMF0pIDwgdG9sb3dlcihNSU5fTUVNRkRfVkVORE9SX0FQSV9MRVZFTF9DSEFSKSkgewotICAgICAgICBBTE9HSSgibWVtZmQ6IGRldmljZSBpcyB1c2luZyBWTkRLIHZlcnNpb24gKCVzKSB3aGljaCBpcyBsZXNzIHRoYW4gUS4gVXNlIGFzaG1lbSBvbmx5LlxuIiwKLSAgICAgICAgICAgICAgdm5ka192ZXJzaW9uLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGlzX3RyZWJsZWxpemVkOwogfQogCi0KIC8qIERldGVybWluZSBpZiBtZW1mZCBjYW4gYmUgc3VwcG9ydGVkLiBUaGlzIGlzIGp1c3Qgb25lLXRpbWUgaGFyZHdvcmsKICAqIHdoaWNoIHdpbGwgYmUgY2FjaGVkIGJ5IHRoZSBjYWxsZXIuCiAgKi8KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9mc19jb25maWcuY3BwIGIvbGliY3V0aWxzL2ZzX2NvbmZpZy5jcHAKaW5kZXggZjkwYTFiYy4uOTE5YmUyZiAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL2ZzX2NvbmZpZy5jcHAKKysrIGIvbGliY3V0aWxzL2ZzX2NvbmZpZy5jcHAKQEAgLTQxLDEwICs0MSw2IEBACiAKICNpbmNsdWRlICJmc19jb25maWcuaCIKIAotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYKLQogdXNpbmcgYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGg7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoOwogCkBAIC0yMTQsNiArMjEwLDcgQEAKICNlbmRpZgogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJmaXJzdF9zdGFnZV9yYW1kaXNrL3N5c3RlbS9iaW4vcmVzaXplMmZzIiB9LAogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJmaXJzdF9zdGFnZV9yYW1kaXNrL3N5c3RlbS9iaW4vc25hcHVzZXJkIiB9LAorICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJmaXJzdF9zdGFnZV9yYW1kaXNrL3N5c3RlbS9iaW4vc25hcHVzZXJkX3JhbWRpc2siIH0sCiAgICAgeyAwMDc1NSwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgImZpcnN0X3N0YWdlX3JhbWRpc2svc3lzdGVtL2Jpbi90dW5lMmZzIiB9LAogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJmaXJzdF9zdGFnZV9yYW1kaXNrL3N5c3RlbS9iaW4vZnNjay5mMmZzIiB9LAogICAgIC8vIGdlbmVyaWMgZGVmYXVsdHMKQEAgLTI1NiwxMiArMjUzLDEyIEBACiAgICAgICAgIGxlbiA9IHN0cmlwKHRhcmdldF9vdXRfcGF0aCwgbGVuLCAiLyIpOwogICAgICAgICBsZW4gPSBzdHJpcCh0YXJnZXRfb3V0X3BhdGgsIGxlbiwgIi9zeXN0ZW0iKTsKICAgICAgICAgaWYgKGFzcHJpbnRmKCZuYW1lLCAiJS4qcyVzIiwgKGludClsZW4sIHRhcmdldF9vdXRfcGF0aCwgY29uZlt3aGljaF1bZGlyXSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4obmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSkpOworICAgICAgICAgICAgZmQgPSBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihuYW1lLCBPX1JET05MWSkpOwogICAgICAgICAgICAgZnJlZShuYW1lKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oY29uZlt3aGljaF1bZGlyXSwgT19SRE9OTFkgfCBPX0JJTkFSWSkpOworICAgICAgICBmZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGNvbmZbd2hpY2hdW2Rpcl0sIE9fUkRPTkxZKSk7CiAgICAgfQogICAgIHJldHVybiBmZDsKIH0KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90aHJlYWRzLmggYi9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdGhyZWFkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDgyYzZjLi4wMDAwMDAwCi0tLSBhL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90aHJlYWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMikKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vCi0vLyBEZXByZWNhdGVkOiB1c2UgYW5kcm9pZDo6YmFzZTo6R2V0VGhyZWFkSWQgaW5zdGVhZCwgd2hpY2ggZG9lc24ndCB0cnVuY2F0ZSBvbiBNYWMvV2luZG93cy4KLS8vCi0jaWYgIWRlZmluZWQoX19HTElCQ19fKSB8fCBfX0dMSUJDX18gPj0gMiAmJiBfX0dMSUJDX01JTk9SX18gPCAzMgotZXh0ZXJuIHBpZF90IGdldHRpZCgpOwotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCBiL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oCmluZGV4IDM4NjdmMzQuLjdmNTc2MzcgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oCisrKyBiL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oCkBAIC04OSw2ICs4OSwzNiBAQAogI2Vycm9yIEFUUkFDRV9UQUcgbXVzdCBiZSBkZWZpbmVkIHRvIGJlIG9uZSBvZiB0aGUgdGFncyBkZWZpbmVkIGluIGN1dGlscy90cmFjZS5oCiAjZW5kaWYKIAorLyoqIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbC4gRG8gbm90IHVzZS4gKi8KK3ZvaWQgYXRyYWNlX2JlZ2luX2JvZHkoY29uc3QgY2hhciopOworCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfZW5kX2JvZHkoKTsKKworLyoqIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbC4gRG8gbm90IHVzZS4gKi8KK3ZvaWQgYXRyYWNlX2FzeW5jX2JlZ2luX2JvZHkoY29uc3QgY2hhciosIGludDMyX3QpOworCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfYXN5bmNfZW5kX2JvZHkoY29uc3QgY2hhciosIGludDMyX3QpOworCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2JlZ2luX2JvZHkoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQzMl90KTsKKworLyoqIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbC4gRG8gbm90IHVzZS4gKi8KK3ZvaWQgYXRyYWNlX2FzeW5jX2Zvcl90cmFja19lbmRfYm9keShjb25zdCBjaGFyKiwgaW50MzJfdCk7CisKKy8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIERvIG5vdCB1c2UuICovCit2b2lkIGF0cmFjZV9pbnN0YW50X2JvZHkoY29uc3QgY2hhciopOworCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2tfYm9keShjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfaW50X2JvZHkoY29uc3QgY2hhciosIGludDMyX3QpOworCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfaW50NjRfYm9keShjb25zdCBjaGFyKiwgaW50NjRfdCk7CisKIC8qKgogICogT3BlbnMgdGhlIHRyYWNlIGZpbGUgZm9yIHdyaXRpbmcgYW5kIHJlYWRzIHRoZSBwcm9wZXJ0eSBmb3IgaW5pdGlhbCB0YWdzLgogICogVGhlIGF0cmFjZS50YWdzLmVuYWJsZWZsYWdzIHByb3BlcnR5IHNldHMgdGhlIHRhZ3MgdG8gdHJhY2UuCkBAIC0xNTksNyArMTg5LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHJhY2VfYmVnaW4odWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfYmVnaW5fYm9keShjb25zdCBjaGFyKik7CiAgICAgICAgIGF0cmFjZV9iZWdpbl9ib2R5KG5hbWUpOwogICAgIH0KIH0KQEAgLTE3Miw3ICsyMDEsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGF0cmFjZV9lbmQodWludDY0X3QgdGFnKQogewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfZW5kX2JvZHkoKTsKICAgICAgICAgYXRyYWNlX2VuZF9ib2R5KCk7CiAgICAgfQogfQpAQCAtMTkwLDcgKzIxOCw2IEBACiAgICAgICAgIGludDMyX3QgY29va2llKQogewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfYXN5bmNfYmVnaW5fYm9keShjb25zdCBjaGFyKiwgaW50MzJfdCk7CiAgICAgICAgIGF0cmFjZV9hc3luY19iZWdpbl9ib2R5KG5hbWUsIGNvb2tpZSk7CiAgICAgfQogfQpAQCAtMjAzLDcgKzIzMCw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYXRyYWNlX2FzeW5jX2VuZCh1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgY29va2llKQogewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfYXN5bmNfZW5kX2JvZHkoY29uc3QgY2hhciosIGludDMyX3QpOwogICAgICAgICBhdHJhY2VfYXN5bmNfZW5kX2JvZHkobmFtZSwgY29va2llKTsKICAgICB9CiB9CkBAIC0yMjEsNyArMjQ3LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2JlZ2luKHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciogdHJhY2tfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgY29va2llKSB7CiAgICAgaWYgKENDX1VOTElLRUxZKGF0cmFjZV9pc190YWdfZW5hYmxlZCh0YWcpKSkgewotICAgICAgICB2b2lkIGF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludDMyX3QpOwogICAgICAgICBhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2JlZ2luX2JvZHkodHJhY2tfbmFtZSwgbmFtZSwgY29va2llKTsKICAgICB9CiB9CkBAIC0yMzUsNyArMjYwLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2VuZCh1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIHRyYWNrX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb29raWUpIHsKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXRyYWNlX2lzX3RhZ19lbmFibGVkKHRhZykpKSB7Ci0gICAgICAgIHZvaWQgYXRyYWNlX2FzeW5jX2Zvcl90cmFja19lbmRfYm9keShjb25zdCBjaGFyKiwgaW50MzJfdCk7CiAgICAgICAgIGF0cmFjZV9hc3luY19mb3JfdHJhY2tfZW5kX2JvZHkodHJhY2tfbmFtZSwgY29va2llKTsKICAgICB9CiB9CkBAIC0yNTIsNyArMjc2LDYgQEAKICNkZWZpbmUgQVRSQUNFX0lOU1RBTlQobmFtZSkgYXRyYWNlX2luc3RhbnQoQVRSQUNFX1RBRywgbmFtZSkKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHJhY2VfaW5zdGFudCh1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIG5hbWUpIHsKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXRyYWNlX2lzX3RhZ19lbmFibGVkKHRhZykpKSB7Ci0gICAgICAgIHZvaWQgYXRyYWNlX2luc3RhbnRfYm9keShjb25zdCBjaGFyKik7CiAgICAgICAgIGF0cmFjZV9pbnN0YW50X2JvZHkobmFtZSk7CiAgICAgfQogfQpAQCAtMjY5LDcgKzI5Miw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYXRyYWNlX2luc3RhbnRfZm9yX3RyYWNrKHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciogdHJhY2tfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkgewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2tfYm9keShjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOwogICAgICAgICBhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2tfYm9keSh0cmFja19uYW1lLCBuYW1lKTsKICAgICB9CiB9CkBAIC0yODIsNyArMzA0LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHJhY2VfaW50KHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkKIHsKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXRyYWNlX2lzX3RhZ19lbmFibGVkKHRhZykpKSB7Ci0gICAgICAgIHZvaWQgYXRyYWNlX2ludF9ib2R5KGNvbnN0IGNoYXIqLCBpbnQzMl90KTsKICAgICAgICAgYXRyYWNlX2ludF9ib2R5KG5hbWUsIHZhbHVlKTsKICAgICB9CiB9CkBAIC0yOTUsNyArMzE2LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHJhY2VfaW50NjQodWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQ2NF90IHZhbHVlKQogewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfaW50NjRfYm9keShjb25zdCBjaGFyKiwgaW50NjRfdCk7CiAgICAgICAgIGF0cmFjZV9pbnQ2NF9ib2R5KG5hbWUsIHZhbHVlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jYXBhYmlsaXR5LmggYi9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jYXBhYmlsaXR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjdiMWQuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY2FwYWJpbGl0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGFrZW4gZnJvbSBsaW51eC9jYXBhYmlsaXR5LmgsIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucwotICovCi0KLSNpZm5kZWYgX1NZU1RFTV9DT1JFX0lOQ0xVREVfUFJJVkFURV9BTkRST0lEX0ZJTEVTWVNURU1fQ0FQQUJJTElUWV9ICi0jZGVmaW5lIF9TWVNURU1fQ09SRV9JTkNMVURFX1BSSVZBVEVfQU5EUk9JRF9GSUxFU1lTVEVNX0NBUEFCSUxJVFlfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNkZWZpbmUgX191c2VyCi0jZGVmaW5lIF9fdTMyIHVpbnQzMl90Ci0jZGVmaW5lIF9fbGUzMiB1aW50MzJfdAotCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMSAweDE5OTgwMzMwCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMSAxCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMiAweDIwMDcxMDI2Ci0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMiAyCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMyAweDIwMDgwNTIyCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMyAyCi0KLXR5cGVkZWYgc3RydWN0IF9fdXNlcl9jYXBfaGVhZGVyX3N0cnVjdCB7Ci0gICAgX191MzIgdmVyc2lvbjsKLSAgICBpbnQgcGlkOwotfSBfX3VzZXIqIGNhcF91c2VyX2hlYWRlcl90OwotCi10eXBlZGVmIHN0cnVjdCBfX3VzZXJfY2FwX2RhdGFfc3RydWN0IHsKLSAgICBfX3UzMiBlZmZlY3RpdmU7Ci0gICAgX191MzIgcGVybWl0dGVkOwotICAgIF9fdTMyIGluaGVyaXRhYmxlOwotfSBfX3VzZXIqIGNhcF91c2VyX2RhdGFfdDsKLQotI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OX01BU0sgMHhGRjAwMDAwMAotI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OX1NISUZUIDI0Ci0jZGVmaW5lIFZGU19DQVBfRkxBR1NfTUFTSyB+VkZTX0NBUF9SRVZJU0lPTl9NQVNLCi0jZGVmaW5lIFZGU19DQVBfRkxBR1NfRUZGRUNUSVZFIDB4MDAwMDAxCi0jZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fMSAweDAxMDAwMDAwCi0jZGVmaW5lIFZGU19DQVBfVTMyXzEgMQotI2RlZmluZSBYQVRUUl9DQVBTX1NaXzEgKHNpemVvZihfX2xlMzIpICogKDEgKyAyICogVkZTX0NBUF9VMzJfMSkpCi0jZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fMiAweDAyMDAwMDAwCi0jZGVmaW5lIFZGU19DQVBfVTMyXzIgMgotI2RlZmluZSBYQVRUUl9DQVBTX1NaXzIgKHNpemVvZihfX2xlMzIpICogKDEgKyAyICogVkZTX0NBUF9VMzJfMikpCi0jZGVmaW5lIFhBVFRSX0NBUFNfU1ogWEFUVFJfQ0FQU19TWl8yCi0jZGVmaW5lIFZGU19DQVBfVTMyIFZGU19DQVBfVTMyXzIKLSNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTiBWRlNfQ0FQX1JFVklTSU9OXzIKLQotc3RydWN0IHZmc19jYXBfZGF0YSB7Ci0gICAgX19sZTMyIG1hZ2ljX2V0YzsKLSAgICBzdHJ1Y3QgewotICAgICAgICBfX2xlMzIgcGVybWl0dGVkOwotICAgICAgICBfX2xlMzIgaW5oZXJpdGFibGU7Ci0gICAgfSBkYXRhW1ZGU19DQVBfVTMyXTsKLX07Ci0KLSNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTiBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OXzEKLSNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVTMyUyBfTElOVVhfQ0FQQUJJTElUWV9VMzJTXzEKLSNkZWZpbmUgQ0FQX0NIT1dOIDAKLSNkZWZpbmUgQ0FQX0RBQ19PVkVSUklERSAxCi0jZGVmaW5lIENBUF9EQUNfUkVBRF9TRUFSQ0ggMgotI2RlZmluZSBDQVBfRk9XTkVSIDMKLSNkZWZpbmUgQ0FQX0ZTRVRJRCA0Ci0jZGVmaW5lIENBUF9LSUxMIDUKLSNkZWZpbmUgQ0FQX1NFVEdJRCA2Ci0jZGVmaW5lIENBUF9TRVRVSUQgNwotI2RlZmluZSBDQVBfU0VUUENBUCA4Ci0jZGVmaW5lIENBUF9MSU5VWF9JTU1VVEFCTEUgOQotI2RlZmluZSBDQVBfTkVUX0JJTkRfU0VSVklDRSAxMAotI2RlZmluZSBDQVBfTkVUX0JST0FEQ0FTVCAxMQotI2RlZmluZSBDQVBfTkVUX0FETUlOIDEyCi0jZGVmaW5lIENBUF9ORVRfUkFXIDEzCi0jZGVmaW5lIENBUF9JUENfTE9DSyAxNAotI2RlZmluZSBDQVBfSVBDX09XTkVSIDE1Ci0jZGVmaW5lIENBUF9TWVNfTU9EVUxFIDE2Ci0jZGVmaW5lIENBUF9TWVNfUkFXSU8gMTcKLSNkZWZpbmUgQ0FQX1NZU19DSFJPT1QgMTgKLSNkZWZpbmUgQ0FQX1NZU19QVFJBQ0UgMTkKLSNkZWZpbmUgQ0FQX1NZU19QQUNDVCAyMAotI2RlZmluZSBDQVBfU1lTX0FETUlOIDIxCi0jZGVmaW5lIENBUF9TWVNfQk9PVCAyMgotI2RlZmluZSBDQVBfU1lTX05JQ0UgMjMKLSNkZWZpbmUgQ0FQX1NZU19SRVNPVVJDRSAyNAotI2RlZmluZSBDQVBfU1lTX1RJTUUgMjUKLSNkZWZpbmUgQ0FQX1NZU19UVFlfQ09ORklHIDI2Ci0jZGVmaW5lIENBUF9NS05PRCAyNwotI2RlZmluZSBDQVBfTEVBU0UgMjgKLSNkZWZpbmUgQ0FQX0FVRElUX1dSSVRFIDI5Ci0jZGVmaW5lIENBUF9BVURJVF9DT05UUk9MIDMwCi0jZGVmaW5lIENBUF9TRVRGQ0FQIDMxCi0jZGVmaW5lIENBUF9NQUNfT1ZFUlJJREUgMzIKLSNkZWZpbmUgQ0FQX01BQ19BRE1JTiAzMwotI2RlZmluZSBDQVBfU1lTTE9HIDM0Ci0jZGVmaW5lIENBUF9XQUtFX0FMQVJNIDM1Ci0jZGVmaW5lIENBUF9CTE9DS19TVVNQRU5EIDM2Ci0jZGVmaW5lIENBUF9BVURJVF9SRUFEIDM3Ci0jZGVmaW5lIENBUF9MQVNUX0NBUCBDQVBfQVVESVRfUkVBRAotI2RlZmluZSBjYXBfdmFsaWQoeCkgKCh4KSA+PSAwICYmICh4KSA8PSBDQVBfTEFTVF9DQVApCi0jZGVmaW5lIENBUF9UT19JTkRFWCh4KSAoKHgpID4+IDUpCi0jZGVmaW5lIENBUF9UT19NQVNLKHgpICgxIDw8ICgoeCkmMzEpKQotCi0jdW5kZWYgX191c2VyCi0jdW5kZWYgX191MzIKLSN1bmRlZiBfX2xlMzIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCBiL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCmluZGV4IDFlMDM1YmIuLjhjNmU1NDggMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCisrKyBiL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCkBAIC0xNDEsNiArMTQxLDcgQEAKICNkZWZpbmUgQUlEX1NES19TQU5EQk9YIDEwOTAgICAgICAvKiBTREsgc2FuZGJveCB2aXJ0dWFsIFVJRCAqLwogI2RlZmluZSBBSURfU0VDVVJJVFlfTE9HX1dSSVRFUiAxMDkxIC8qIHdyaXRlIHRvIHNlY3VyaXR5IGxvZyAqLwogI2RlZmluZSBBSURfUFJOR19TRUVERVIgMTA5MiAgICAgICAgIC8qIFBSTkcgc2VlZGVyIGRhZW1vbiAqLworI2RlZmluZSBBSURfVVBST0JFU1RBVFMgMTA5MyAgICAgICAgIC8qIHVpZCBmb3IgdXByb2Jlc3RhdHMgKi8KIC8qIENoYW5nZXMgdG8gdGhpcyBmaWxlIG11c3QgYmUgbWFkZSBpbiBBT1NQLCAqbm90KiBpbiBpbnRlcm5hbCBicmFuY2hlcy4gKi8KIAogI2RlZmluZSBBSURfU0hFTEwgMjAwMCAvKiBhZGIgYW5kIGRlYnVnIHNoZWxsIHVzZXIgKi8KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvZnNfY29uZmlnLmggYi9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2ZzX2NvbmZpZy5oCmluZGV4IDhhOWExZmYuLjQ1ZjQ2ZTUgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvZnNfY29uZmlnLmgKKysrIGIvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9mc19jb25maWcuaApAQCAtMjQsMTEgKzI0LDcgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotI2lmIGRlZmluZWQoX19CSU9OSUNfXykKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jZWxzZSAgLy8gZGVmaW5lZChfX0JJT05JQ19fKQotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NhcGFiaWxpdHkuaD4KLSNlbmRpZiAgLy8gZGVmaW5lZChfX0JJT05JQ19fKQogCiAvKiBSdWxlcyBmb3IgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGhhcyBtb3ZlZCB0byBzeXN0ZW0vY29kZS9saWJjdXRpbHMvZnNfY29uZmlnLmMgKi8KIApkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2luY2x1ZGVfb3V0c2lkZV9zeXN0ZW0vY3V0aWxzL3RocmVhZHMuaCBiL2xpYmN1dGlscy9pbmNsdWRlX291dHNpZGVfc3lzdGVtL2N1dGlscy90aHJlYWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDk5MzMwZmYuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL2luY2x1ZGVfb3V0c2lkZV9zeXN0ZW0vY3V0aWxzL3RocmVhZHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL2luY2x1ZGUvY3V0aWxzL3RocmVhZHMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9pb3NjaGVkX3BvbGljeS5jcHAgYi9saWJjdXRpbHMvaW9zY2hlZF9wb2xpY3kuY3BwCmluZGV4IDAxMmM1MzcuLmY3YzcyNGQgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9pb3NjaGVkX3BvbGljeS5jcHAKKysrIGIvbGliY3V0aWxzL2lvc2NoZWRfcG9saWN5LmNwcApAQCAtMjQsOCArMjQsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSNkZWZpbmUgSU9QUklPX1dIT19QUk9DRVNTICgxKQotI2RlZmluZSBJT1BSSU9fQ0xBU1NfU0hJRlQgKDEzKQorI2luY2x1ZGUgPGxpbnV4L2lvcHJpby5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjZGVmaW5lIF9fYW5kcm9pZF91bnVzZWQKICNlbHNlCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvc29ja2V0X2xvY2FsX3VuaXguaCBiL2xpYmN1dGlscy9zb2NrZXRfbG9jYWxfdW5peC5oCmluZGV4IDQ1Yjk4NTYuLmVhOThjMDggMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9zb2NrZXRfbG9jYWxfdW5peC5oCisrKyBiL2xpYmN1dGlscy9zb2NrZXRfbG9jYWxfdW5peC5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIF9fU09DS0VUX0xPQ0FMX0gKICNkZWZpbmUgX19TT0NLRVRfTE9DQUxfSAogCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCiAjZGVmaW5lIEZJTEVTWVNURU1fU09DS0VUX1BSRUZJWCAiL3RtcC8iIAogI2RlZmluZSBBTkRST0lEX1JFU0VSVkVEX1NPQ0tFVF9QUkVGSVggIi9kZXYvc29ja2V0LyIKIApkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL3NvY2tldHNfd2luZG93cy5jcHAgYi9saWJjdXRpbHMvc29ja2V0c193aW5kb3dzLmNwcAppbmRleCA0YWRiNzk2Li45OWEyZTJkIDEwMDY0NAotLS0gYS9saWJjdXRpbHMvc29ja2V0c193aW5kb3dzLmNwcAorKysgYi9saWJjdXRpbHMvc29ja2V0c193aW5kb3dzLmNwcApAQCAtMzUsNyArMzUsNyBAQAogLy8gY2FuIGJlIGV4dHJlbWVseSB0cmlja3kgYW5kIGNhdXNlIGRlYWRsb2NrIHdoZW4gdXNpbmcgdGhyZWFkcyBvciBhdGV4aXQoKS4KIC8vCiAvLyBCb3RoIGFkYiAoMSkgYW5kIENocm9tZSAoMikgcHVycG9zZWZ1bGx5IGF2b2lkIFdTQUNsZWFudXAoKSB3aXRoIG5vIGlzc3Vlcy4KLS8vICgxKSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vY29yZS5naXQvKy9tYXN0ZXIvYWRiL3N5c2RlcHNfd2luMzIuY3BwCisvLyAoMSkgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vcGFja2FnZXMvbW9kdWxlcy9hZGIuZ2l0LysvbWFpbi9zeXNkZXBzX3dpbjMyLmNwcAogLy8gKDIpIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vY29kZXNlYXJjaCNjaHJvbWl1bS9zcmMvbmV0L2Jhc2Uvd2luc29ja19pbml0LmNjCiBib29sIGluaXRpYWxpemVfd2luZG93c19zb2NrZXRzKCkgewogICAgIC8vIFRoZXJlJ3Mgbm8gaGFybSBpbiBjYWxsaW5nIFdTQVN0YXJ0dXAoKSBtdWx0aXBsZSB0aW1lcyBidXQgbm8gYmVuZWZpdApkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL3RocmVhZHMuY3BwIGIvbGliY3V0aWxzL3RocmVhZHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlN2EzLi4wMDAwMDAwCi0tLSBhL2xpYmN1dGlscy90aHJlYWRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgKEMpIDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxjdXRpbHMvdGhyZWFkcy5oPgotCi0jaWYgZGVmaW5lZChfX0FQUExFX18pCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZWxpZiBkZWZpbmVkKF9fbGludXhfXykKLSNpbmNsdWRlIDxzeXNjYWxsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZWxpZiBkZWZpbmVkKF9XSU4zMikKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19CSU9OSUNfXykgfHwgZGVmaW5lZChfX0dMSUJDX18pICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAzMgotLy8gTm8gZGVmaW5pdGlvbiBuZWVkZWQgZm9yIEFuZHJvaWQgYmVjYXVzZSB3ZSdsbCBqdXN0IHBpY2sgdXAgYmlvbmljJ3MgY29weS4KLS8vIE5vIGRlZmluaXRpb24gbmVlZGVkIGZvciBHbGliYyA+PSAyLjMyIGJlY2F1c2UgaXQgZXhwb3NlcyBpdHMgb3duIGNvcHkuCi0jZWxzZQotcGlkX3QgZ2V0dGlkKCkgewotI2lmIGRlZmluZWQoX19BUFBMRV9fKQotICB1aW50NjRfdCB0aWQ7Ci0gIHB0aHJlYWRfdGhyZWFkaWRfbnAoTlVMTCwgJnRpZCk7Ci0gIHJldHVybiB0aWQ7Ci0jZWxpZiBkZWZpbmVkKF9fbGludXhfXykKLSAgcmV0dXJuIHN5c2NhbGwoX19OUl9nZXR0aWQpOwotI2VsaWYgZGVmaW5lZChfV0lOMzIpCi0gIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKLSNlbmRpZgotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvdHJhY2UtaG9zdC5jcHAgYi9saWJjdXRpbHMvdHJhY2UtaG9zdC5jcHAKaW5kZXggZTlmNThjMy4uMmJmNTdlYiAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL3RyYWNlLWhvc3QuY3BwCisrKyBiL2xpYmN1dGlscy90cmFjZS1ob3N0LmNwcApAQCAtMjAsNyArMjAsNiBAQAogaW50ICAgICAgICAgICAgICAgICAgICAgYXRyYWNlX21hcmtlcl9mZCAgICAgPSAtMTsKIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGF0cmFjZV9lbmFibGVkX3RhZ3MgID0gMDsKIAotdm9pZCBhdHJhY2Vfc2V0X2RlYnVnZ2FibGUoYm9vbCAvKmRlYnVnZ2FibGUqLykge30KIHZvaWQgYXRyYWNlX3NldF90cmFjaW5nX2VuYWJsZWQoYm9vbCAvKmVuYWJsZWQqLykge30KIHZvaWQgYXRyYWNlX3VwZGF0ZV90YWdzKCkgeyB9CiB2b2lkIGF0cmFjZV9zZXR1cCgpIHsgfQpkaWZmIC0tZ2l0IGEvbGliZGlza2NvbmZpZy9BbmRyb2lkLmJwIGIvbGliZGlza2NvbmZpZy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTIzZDRlLi4wMDAwMDAwCi0tLSBhL2xpYmRpc2tjb25maWcvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXBhY2thZ2UgewotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKLX0KLQotY2NfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYmRpc2tjb25maWciLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCi0gICAgc3JjczogWwotICAgICAgICAiZGlza2NvbmZpZy5jIiwKLSAgICAgICAgImRpc2t1dGlscy5jIiwKLSAgICAgICAgIndyaXRlX2xzdC5jIiwKLSAgICAgICAgImNvbmZpZ19tYnIuYyIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgICAgICBob3N0X2xpbnV4OiB7Ci0gICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLURfTEFSR0VGSUxFNjRfU09VUkNFIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLX0KZGlmZiAtLWdpdCBhL2xpYmRpc2tjb25maWcvY29uZmlnX21ici5jIGIvbGliZGlza2NvbmZpZy9jb25maWdfbWJyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTliYmYuLjAwMDAwMDAKLS0tIGEvbGliZGlza2NvbmZpZy9jb25maWdfbWJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyogbGlicy9kaXNrY29uZmlnL2Rpc2tjb25maWcuYwotICoKLSAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJjb25maWdfbWJyIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGRpc2tjb25maWcvZGlza2NvbmZpZy5oPgotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLQotLyogc3RhcnQgYW5kIGxlbiBhcmUgaW4gTEJBIHVuaXRzICovCi1zdGF0aWMgdm9pZAotY2ZnX3BlbnRyeShzdHJ1Y3QgcGNfcGFydGl0aW9uICpwZW50cnksIHVpbnQ4X3Qgc3RhdHVzLCB1aW50OF90IHR5cGUsCi0gICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pCi17Ci0gICAgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgLyogc2VlbXMgdGhhdCBzb21lcyBCSU9TZW5zIGNhbiBnZXQgd2VkZ2VkIG9uIGJvb3Qgd2hpbGUgdmVyaWZ5aW5nCi0gICAgICAgICAqIHRoZSBtYnIgaWYgdGhlc2UgYXJlIDAgKi8KLSAgICAgICAgbWVtc2V0KCZwZW50cnktPnN0YXJ0LCAweGZmLCBzaXplb2Yoc3RydWN0IGNocykpOwotICAgICAgICBtZW1zZXQoJnBlbnRyeS0+ZW5kLCAweGZmLCBzaXplb2Yoc3RydWN0IGNocykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIHplcm8gb3V0IHRoZSBjL2gvcyBlbnRyaWVzLi4gdGhleSBhcmUgbm90IHVzZWQgKi8KLSAgICAgICAgbWVtc2V0KCZwZW50cnktPnN0YXJ0LCAwLCBzaXplb2Yoc3RydWN0IGNocykpOwotICAgICAgICBtZW1zZXQoJnBlbnRyeS0+ZW5kLCAwLCBzaXplb2Yoc3RydWN0IGNocykpOwotICAgIH0KLQotICAgIHBlbnRyeS0+c3RhdHVzID0gc3RhdHVzOwotICAgIHBlbnRyeS0+dHlwZSA9IHR5cGU7Ci0gICAgcGVudHJ5LT5zdGFydF9sYmEgPSBzdGFydDsKLSAgICBwZW50cnktPmxlbl9sYmEgPSBsZW47Ci0KLSAgICBBTE9HSSgiQ29uZmlndXJpbmcgcGVudHJ5LiBzdGF0dXM9MHgleCB0eXBlPTB4JXggc3RhcnRfbGJhPSV1IGxlbl9sYmE9JXUiLAotICAgICAgICAgcGVudHJ5LT5zdGF0dXMsIHBlbnRyeS0+dHlwZSwgcGVudHJ5LT5zdGFydF9sYmEsIHBlbnRyeS0+bGVuX2xiYSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1aW50MzJfdAota2JfdG9fbGJhKHVpbnQzMl90IGxlbl9rYiwgdWludDMyX3Qgc2VjdF9zaXplKQotewotICAgIHVpbnQ2NF90IGxiYTsKLQotICAgIGxiYSA9ICh1aW50NjRfdClsZW5fa2IgKiAxMDI0OwotICAgIC8qIGJ1bXAgaXQgdXAgdG8gdGhlIG5leHQgTEJBIGJvdW5kYXJ5IGp1c3QgaW4gY2FzZSAgKi8KLSAgICBsYmEgPSAobGJhICsgKHVpbnQ2NF90KXNlY3Rfc2l6ZSAtIDEpICYgfigodWludDY0X3Qpc2VjdF9zaXplIC0gMSk7Ci0gICAgbGJhIC89ICh1aW50NjRfdClzZWN0X3NpemU7Ci0gICAgaWYgKGxiYSA+PSAweGZmZmZmZmZmVUxMKQotICAgICAgICBBTE9HRSgiRXJyb3IgY29udmVydGluZyBrYiAtPiBsYmEuIDMyYml0IG92ZXJmbG93LCBleHBlY3Qgd2VpcmRuZXNzIik7Ci0gICAgcmV0dXJuICh1aW50MzJfdCkobGJhICYgMHhmZmZmZmZmZlVMTCk7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCB3cml0ZV9saXN0ICoKLW1rX3ByaV9wZW50cnkoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8sIHN0cnVjdCBwYXJ0X2luZm8gKnBpbmZvLCBpbnQgcG51bSwKLSAgICAgICAgICAgICAgdWludDMyX3QgKmxiYSkKLXsKLSAgICBzdHJ1Y3Qgd3JpdGVfbGlzdCAqaXRlbTsKLSAgICBzdHJ1Y3QgcGNfcGFydGl0aW9uICpwZW50cnk7Ci0KLSAgICBpZiAocG51bSA+PSBQQ19OVU1fQk9PVF9SRUNPUkRfUEFSVFMpIHsKLSAgICAgICAgQUxPR0UoIk1heGltdW0gbnVtYmVyIG9mIHByaW1hcnkgcGFydGl0aW9uIGV4Y2VlZGVkLiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIShpdGVtID0gYWxsb2Nfd2woc2l6ZW9mKHN0cnVjdCBwY19wYXJ0aXRpb24pKSkpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhcnRpdGlvbiBlbnRyeS4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgewotICAgICAgICAvKiBETyBOT1QgREVSRUZFUkVOQ0UgKi8KLSAgICAgICAgc3RydWN0IHBjX2Jvb3RfcmVjb3JkICptYnIgPSAodm9pZCAqKVBDX01CUl9ESVNLX09GRlNFVDsgCi0gICAgICAgIC8qIGdyYWIgdGhlIG9mZnNldCBpbiBtYnIgd2hlcmUgdG8gd3JpdGUgdGhpcyBwYXJ0aXRpb24gZW50cnkuICovCi0gICAgICAgIGl0ZW0tPm9mZnNldCA9IChsb2ZmX3QpKCh1aW50cHRyX3QpKCh1aW50OF90ICopKCZtYnItPnB0YWJsZVtwbnVtXSkpKTsKLSAgICB9Ci0KLSAgICBwZW50cnkgPSAoc3RydWN0IHBjX3BhcnRpdGlvbiAqKSAmaXRlbS0+ZGF0YTsKLQotICAgIC8qIG5lZWQgYSBzdGFuZGFyZCBwcmltYXJ5IHBhcnRpdGlvbiBlbnRyeSAqLwotICAgIGlmIChwaW5mbykgewotICAgICAgICAvKiBuZWVkIHRoaXMgdG8gYmUgNjQgYml0IGluIGNhc2UgbGVuX2tiIGlzIGxhcmdlICovCi0gICAgICAgIHVpbnQ2NF90IGxlbl9sYmE7IAotCi0gICAgICAgIGlmIChwaW5mby0+bGVuX2tiICE9ICh1aW50MzJfdCktMSkgewotICAgICAgICAgICAgLyogYnVtcCBpdCB1cCB0byB0aGUgbmV4dCBMQkEgYm91bmRhcnkganVzdCBpbiBjYXNlICovCi0gICAgICAgICAgICBsZW5fbGJhID0gKCh1aW50NjRfdClwaW5mby0+bGVuX2tiICogMTAyNCk7Ci0gICAgICAgICAgICBsZW5fbGJhICs9ICgodWludDY0X3QpZGluZm8tPnNlY3Rfc2l6ZSAtIDEpOwotICAgICAgICAgICAgbGVuX2xiYSAmPSB+KCh1aW50NjRfdClkaW5mby0+c2VjdF9zaXplIC0gMSk7Ci0gICAgICAgICAgICBsZW5fbGJhIC89ICh1aW50NjRfdClkaW5mby0+c2VjdF9zaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogbWFrZSBpdCBmaWxsIHRoZSByZXN0IG9mIGRpc2sgKi8KLSAgICAgICAgICAgIGxlbl9sYmEgPSBkaW5mby0+bnVtX2xiYSAtICpsYmE7Ci0gICAgICAgIH0KLQotICAgICAgICBjZmdfcGVudHJ5KHBlbnRyeSwgKChwaW5mby0+ZmxhZ3MgJiBQQVJUX0FDVElWRV9GTEFHKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUENfUEFSVF9BQ1RJVkUgOiBQQ19QQVJUX05PUk1BTCksCi0gICAgICAgICAgICAgICAgICAgcGluZm8tPnR5cGUsICpsYmEsICh1aW50MzJfdClsZW5fbGJhKTsKLQotICAgICAgICBwaW5mby0+c3RhcnRfbGJhID0gKmxiYTsKLSAgICAgICAgKmxiYSArPSAodWludDMyX3QpbGVuX2xiYTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiB0aGlzIHNob3VsZCBiZSBtYWRlIGFuIGV4dGVuZGVkIHBhcnRpdGlvbiwgYW5kIHNob3VsZCB0YWtlCi0gICAgICAgICAqIHVwIHRoZSByZXN0IG9mIHRoZSBkaXNrIGFzIGEgcHJpbWFyeSBwYXJ0aXRpb24gKi8KLSAgICAgICAgY2ZnX3BlbnRyeShwZW50cnksIFBDX1BBUlRfTk9STUFMLCBQQ19QQVJUX1RZUEVfRVhURU5ERUQsCi0gICAgICAgICAgICAgICAgICAgKmxiYSwgZGluZm8tPm51bV9sYmEgLSAqbGJhKTsKLQotICAgICAgICAvKiBub3RlIHRoYXQgd2UgZG8gbm90IHVwZGF0ZSB0aGUgKmxiYSBiZWNhdXNlIHdlIG5vdyBoYXZlIHRvCi0gICAgICAgICAqIGNyZWF0ZSBhIGNoYWluIG9mIGV4dGVuZGVkIHBhcnRpdGlvbiB0YWJsZXMsIGFuZCBmaXJzdCBvbmUgaXMgYXQKLSAgICAgICAgICogKmxiYSAqLwotICAgIH0KLQotICAgIHJldHVybiBpdGVtOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBhbiBleHRlbmRlZCBib290IHJlY29yZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuCi0gKiBleHRlbmRlZCBwYXJ0aXRpb24uIFRoaXMgY3JlYXRlcyBhIGxvZ2ljYWwgcGFydGl0aW9uIGFuZCBhIHBvaW50ZXIgdG8KLSAqIHRoZSBuZXh0IEVCUi4KLSAqCi0gKiBleHRfbGJhID09IFRoZSBzdGFydCBvZiB0aGUgdG9wbGV2ZWwgZXh0ZW5kZWQgcGFydGl0aW9uIChwb2ludGVkIHRvIGJ5IHRoZQotICogZW50cnkgaW4gdGhlIE1CUikuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgd3JpdGVfbGlzdCAqCi1ta19leHRfcGVudHJ5KHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvLCBzdHJ1Y3QgcGFydF9pbmZvICpwaW5mbywgdWludDMyX3QgKmxiYSwKLSAgICAgICAgICAgICAgdWludDMyX3QgZXh0X2xiYSwgc3RydWN0IHBhcnRfaW5mbyAqcG5leHQpCi17Ci0gICAgc3RydWN0IHdyaXRlX2xpc3QgKml0ZW07Ci0gICAgc3RydWN0IHBjX2Jvb3RfcmVjb3JkICplYnI7Ci0gICAgdWludDMyX3QgbGVuOyAvKiBpbiBsYmEgdW5pdHMgKi8KLQotICAgIGlmICghKGl0ZW0gPSBhbGxvY193bChzaXplb2Yoc3RydWN0IHBjX2Jvb3RfcmVjb3JkKSkpKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFQlIuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0aGUgZWJyIGF0IHRoZSBjdXJyZW50IExCQSwgYW5kIHRoZW4gYnVtcCB0aGUKLSAgICAgKiBsYmEgY291bnRlciBzaW5jZSB0aGF0IGlzIHdoZXJlIHRoZSBsb2dpY2FsIGRhdGEgcGFydGl0aW9uIHdpbGwgc3RhcnQgKi8KLSAgICBpdGVtLT5vZmZzZXQgPSAoKGxvZmZfdCkoKmxiYSkpICogZGluZm8tPnNlY3Rfc2l6ZTsKLSAgICAoKmxiYSkrKzsKLQotICAgIGViciA9IChzdHJ1Y3QgcGNfYm9vdF9yZWNvcmQgKikgJml0ZW0tPmRhdGE7Ci0gICAgbWVtc2V0KGViciwgMCwgc2l6ZW9mKHN0cnVjdCBwY19ib290X3JlY29yZCkpOwotICAgIGVici0+bWJyX3NpZyA9IFBDX0JJT1NfQk9PVF9TSUc7Ci0KLSAgICBpZiAocGluZm8tPmxlbl9rYiAhPSAodWludDMyX3QpLTEpCi0gICAgICAgIGxlbiA9IGtiX3RvX2xiYShwaW5mby0+bGVuX2tiLCBkaW5mby0+c2VjdF9zaXplKTsKLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKHBuZXh0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiT25seSB0aGUgbGFzdCBwYXJ0aXRpb24gY2FuIGJlIHNwZWNpZmllZCB0byBmaWxsIHRoZSBkaXNrICIKLSAgICAgICAgICAgICAgICAgIihuYW1lID0gJyVzJykiLCBwaW5mby0+bmFtZSk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuID0gZGluZm8tPm51bV9sYmEgLSAqbGJhOwotICAgICAgICAvKiB1cGRhdGUgdGhlIHBpbmZvIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSBuZXcgc2l6ZSwgZm9yCi0gICAgICAgICAqIGJvb2trZWVwaW5nICovCi0gICAgICAgIHBpbmZvLT5sZW5fa2IgPQotICAgICAgICAgICAgKHVpbnQzMl90KSgoKHVpbnQ2NF90KWxlbiAqICh1aW50NjRfdClkaW5mby0+c2VjdF9zaXplKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpMTAyNCkpOwotICAgIH0KLQotICAgIGNmZ19wZW50cnkoJmVici0+cHRhYmxlW1BDX0VCUl9MT0dJQ0FMX1BBUlRdLCBQQ19QQVJUX05PUk1BTCwKLSAgICAgICAgICAgICAgIHBpbmZvLT50eXBlLCAxLCBsZW4pOwotCi0gICAgcGluZm8tPnN0YXJ0X2xiYSA9ICpsYmE7Ci0gICAgKmxiYSArPSBsZW47Ci0KLSAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBwYXJ0aXRpb24sIHdlIGhhdmUgdG8gY3JlYXRlIGEgbGluayB0byB0aGUKLSAgICAgKiBuZXh0IGV4dGVuZGVkIHBhcnRpdGlvbi4KLSAgICAgKgotICAgICAqIE90aGVyd2lzZSwgdGhlcmUncyBub3RoaW5nIHRvIGRvIHNpbmNlIHRoZSAicG9pbnRlciBlbnRyeSIgaXMKLSAgICAgKiBhbHJlYWR5IHplcm8tZmlsbGVkLgotICAgICAqLwotICAgIGlmIChwbmV4dCkgewotICAgICAgICAvKiBUaGUgc3RhcnQgbGJhIGZvciBuZXh0IHBhcnRpdGlvbiBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAqIG9mIHRoZSB0b3AtbGV2ZWwgZXh0ZW5kZWQgcGFydGl0aW9uICovCi0gICAgICAgIHVpbnQzMl90IG5leHRfc3RhcnRfbGJhID0gKmxiYSAtIGV4dF9sYmE7Ci0gICAgICAgIHVpbnQzMl90IG5leHRfbGVuX2xiYTsKLSAgICAgICAgaWYgKHBuZXh0LT5sZW5fa2IgIT0gKHVpbnQzMl90KS0xKQotICAgICAgICAgICAgbmV4dF9sZW5fbGJhID0gMSArIGtiX3RvX2xiYShwbmV4dC0+bGVuX2tiLCBkaW5mby0+c2VjdF9zaXplKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV4dF9sZW5fbGJhID0gZGluZm8tPm51bV9sYmEgLSAqbGJhOwotICAgICAgICBjZmdfcGVudHJ5KCZlYnItPnB0YWJsZVtQQ19FQlJfTkVYVF9QVFJfUEFSVF0sIFBDX1BBUlRfTk9STUFMLAotICAgICAgICAgICAgICAgICAgIFBDX1BBUlRfVFlQRV9FWFRFTkRFRCwgbmV4dF9zdGFydF9sYmEsIG5leHRfbGVuX2xiYSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGl0ZW07Ci0KLWZhaWw6Ci0gICAgZnJlZV93bChpdGVtKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHdyaXRlX2xpc3QgKgotbWtfbWJyX3NpZygpCi17Ci0gICAgc3RydWN0IHdyaXRlX2xpc3QgKml0ZW07Ci0gICAgaWYgKCEoaXRlbSA9IGFsbG9jX3dsKHNpemVvZih1aW50MTZfdCkpKSkgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTUJSIHNpZ25hdHVyZS4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgewotICAgICAgICAvKiBETyBOT1QgREVSRUZFUkVOQ0UgKi8KLSAgICAgICAgc3RydWN0IHBjX2Jvb3RfcmVjb3JkICptYnIgPSAodm9pZCAqKVBDX01CUl9ESVNLX09GRlNFVDsKLSAgICAgICAgLyogZ3JhYiB0aGUgb2Zmc2V0IGluIG1iciB3aGVyZSB0byB3cml0ZSBtYnIgc2lnbmF0dXJlLiAqLwotICAgICAgICBpdGVtLT5vZmZzZXQgPSAobG9mZl90KSgodWludHB0cl90KSgodWludDhfdCAqKSgmbWJyLT5tYnJfc2lnKSkpOwotICAgIH0KLQotICAgICooKHVpbnQxNl90KilpdGVtLT5kYXRhKSA9IFBDX0JJT1NfQk9PVF9TSUc7Ci0gICAgcmV0dXJuIGl0ZW07Ci19Ci0KLXN0cnVjdCB3cml0ZV9saXN0ICoKLWNvbmZpZ19tYnIoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8pCi17Ci0gICAgc3RydWN0IHBhcnRfaW5mbyAqcGluZm87Ci0gICAgdWludDMyX3QgY3VyX2xiYSA9IGRpbmZvLT5za2lwX2xiYTsKLSAgICB1aW50MzJfdCBleHRfbGJhID0gMDsKLSAgICBzdHJ1Y3Qgd3JpdGVfbGlzdCAqd3JfbGlzdCA9IE5VTEw7Ci0gICAgc3RydWN0IHdyaXRlX2xpc3QgKnRlbXBfd3IgPSBOVUxMOwotICAgIGludCBjbnQgPSAwOwotICAgIGludCBleHRlbmRlZCA9IDA7Ci0KLSAgICBpZiAoIWRpbmZvLT5wYXJ0X2xzdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKGNudCA9IDA7IGNudCA8IGRpbmZvLT5udW1fcGFydHM7ICsrY250KSB7Ci0gICAgICAgIHBpbmZvID0gJmRpbmZvLT5wYXJ0X2xzdFtjbnRdOwotCi0gICAgICAgIC8qIFNob3VsZCB3ZSBjcmVhdGUgYW4gZXh0ZWRuZWQgcGFydGl0aW9uPyAqLwotICAgICAgICBpZiAoY250ID09IChQQ19OVU1fQk9PVF9SRUNPUkRfUEFSVFMgLSAxKSkgewotICAgICAgICAgICAgaWYgKGNudCArIDEgPCBkaW5mby0+bnVtX3BhcnRzKSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5kZWQgPSAxOwotICAgICAgICAgICAgICAgIGV4dF9sYmEgPSBjdXJfbGJhOwotICAgICAgICAgICAgICAgIGlmICgodGVtcF93ciA9IG1rX3ByaV9wZW50cnkoZGluZm8sIE5VTEwsIGNudCwgJmN1cl9sYmEpKSkKLSAgICAgICAgICAgICAgICAgICAgd2xpc3RfYWRkKCZ3cl9saXN0LCB0ZW1wX3dyKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgcHJpbWFyeSBleHRlbmRlZCBwYXJ0aXRpb24uIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiBleHRlbmRlZCwgbmVlZCAxIGxiYSBmb3IgZWJyICovCi0gICAgICAgIGlmICgoY3VyX2xiYSArIGV4dGVuZGVkKSA+PSBkaW5mby0+bnVtX2xiYSkKLSAgICAgICAgICAgIGdvdG8gbm9zcGFjZTsKLSAgICAgICAgZWxzZSBpZiAocGluZm8tPmxlbl9rYiAhPSAodWludDMyX3QpLTEpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHN6X2xiYSA9IChwaW5mby0+bGVuX2tiIC8gZGluZm8tPnNlY3Rfc2l6ZSkgKiAxMDI0OwotICAgICAgICAgICAgaWYgKChjdXJfbGJhICsgc3pfbGJhICsgZXh0ZW5kZWQpID4gZGluZm8tPm51bV9sYmEpCi0gICAgICAgICAgICAgICAgZ290byBub3NwYWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFleHRlbmRlZCkKLSAgICAgICAgICAgIHRlbXBfd3IgPSBta19wcmlfcGVudHJ5KGRpbmZvLCBwaW5mbywgY250LCAmY3VyX2xiYSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc3RydWN0IHBhcnRfaW5mbyAqcG5leHQ7Ci0gICAgICAgICAgICBwbmV4dCA9IGNudCArIDEgPCBkaW5mby0+bnVtX3BhcnRzID8gJmRpbmZvLT5wYXJ0X2xzdFtjbnQrMV0gOiBOVUxMOwotICAgICAgICAgICAgdGVtcF93ciA9IG1rX2V4dF9wZW50cnkoZGluZm8sIHBpbmZvLCAmY3VyX2xiYSwgZXh0X2xiYSwgcG5leHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRlbXBfd3IpCi0gICAgICAgICAgICB3bGlzdF9hZGQoJndyX2xpc3QsIHRlbXBfd3IpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIHBhcnRpdGlvbiAlZCAoJXMpLiIsIGNudCwgcGluZm8tPm5hbWUpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUgTUJSIHdpdGggZW1wdHkgcGFydHMgKGlmIG5lZWRlZCkuICovCi0gICAgZm9yICg7IGNudCA8IFBDX05VTV9CT09UX1JFQ09SRF9QQVJUUzsgKytjbnQpIHsKLSAgICAgICAgc3RydWN0IHBhcnRfaW5mbyBibGFuazsKLSAgICAgICAgY3VyX2xiYSA9IDA7Ci0gICAgICAgIG1lbXNldCgmYmxhbmssIDAsIHNpemVvZihzdHJ1Y3QgcGFydF9pbmZvKSk7Ci0gICAgICAgIGlmICghKHRlbXBfd3IgPSBta19wcmlfcGVudHJ5KGRpbmZvLCAmYmxhbmssIGNudCwgJmN1cl9sYmEpKSkgewotICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgYmxhbmsgcGFydGl0aW9uICVkLiIsIGNudCk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgd2xpc3RfYWRkKCZ3cl9saXN0LCB0ZW1wX3dyKTsKLSAgICB9Ci0KLSAgICBpZiAoKHRlbXBfd3IgPSBta19tYnJfc2lnKCkpKQotICAgICAgICB3bGlzdF9hZGQoJndyX2xpc3QsIHRlbXBfd3IpOwotICAgIGVsc2UgewotICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCBNQlIgc2lnbmF0dXJlIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gd3JfbGlzdDsKLQotbm9zcGFjZToKLSAgICBBTE9HRSgiTm90IGVub3VnaCBzcGFjZSB0byBhZGQgcGFydHRpb24gJyVzJy4iLCBwaW5mby0+bmFtZSk7Ci0KLWZhaWw6Ci0gICAgd2xpc3RfZnJlZSh3cl9saXN0KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBSZXR1cm5zIHRoZSBkZXZpY2UgcGF0aCBvZiB0aGUgcGFydGl0aW9uIHJlZmVycmVkIHRvIGJ5ICduYW1lJwotICogTXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICovCi1jaGFyICoKLWZpbmRfbWJyX3BhcnQoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8sIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgc3RydWN0IHBhcnRfaW5mbyAqcGxpc3QgPSBkaW5mby0+cGFydF9sc3Q7Ci0gICAgaW50IG51bSA9IDA7Ci0gICAgY2hhciAqZGV2X25hbWUgPSBOVUxMOwotICAgIGludCBoYXNfZXh0ZW5kZWQgPSAoZGluZm8tPm51bV9wYXJ0cyA+IFBDX05VTV9CT09UX1JFQ09SRF9QQVJUUyk7Ci0KLSAgICBmb3IobnVtID0gMTsgbnVtIDw9IGRpbmZvLT5udW1fcGFydHM7ICsrbnVtKSB7Ci0gICAgICAgIGlmICghc3RyY21wKHBsaXN0W251bS0xXS5uYW1lLCBuYW1lKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChudW0gPiBkaW5mby0+bnVtX3BhcnRzKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmIChoYXNfZXh0ZW5kZWQgJiYgKG51bSA+PSBQQ19OVU1fQk9PVF9SRUNPUkRfUEFSVFMpKQotICAgICAgICBudW0rKzsKLQotICAgIGlmICghKGRldl9uYW1lID0gbWFsbG9jKE1BWF9OQU1FX0xFTikpKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5LiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBudW0gPSBzbnByaW50ZihkZXZfbmFtZSwgTUFYX05BTUVfTEVOLCAiJXMlZCIsIGRpbmZvLT5kZXZpY2UsIG51bSk7Ci0gICAgaWYgKG51bSA+PSBNQVhfTkFNRV9MRU4pIHsKLSAgICAgICAgQUxPR0UoIkRldmljZSBuYW1lIGlzIHRvbyBsb25nPyEiKTsKLSAgICAgICAgZnJlZShkZXZfbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBkZXZfbmFtZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmRpc2tjb25maWcvZGlza2NvbmZpZy5jIGIvbGliZGlza2NvbmZpZy9kaXNrY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzQ3NDguLjAwMDAwMDAKLS0tIGEvbGliZGlza2NvbmZpZy9kaXNrY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzUgKzAsMCBAQAotLyogbGlicy9kaXNrY29uZmlnL2Rpc2tjb25maWcuYwotICoKLSAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJkaXNrY29uZmlnIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi0jaW5jbHVkZSA8ZGlza2NvbmZpZy9kaXNrY29uZmlnLmg+Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX2xlbihjb25zdCBjaGFyICpzdHIsIHVpbnQ2NF90ICpwbGVuKQotewotICAgIGNoYXIgdG1wWzY0XTsKLSAgICBpbnQgbGVuX3N0cjsKLSAgICB1aW50MzJfdCBtdWx0aXBsZSA9IDE7Ci0KLSAgICBzdHJuY3B5KHRtcCwgc3RyLCBzaXplb2YodG1wKSk7Ci0gICAgdG1wW3NpemVvZih0bXApLTFdID0gJ1wwJzsKLSAgICBsZW5fc3RyID0gc3RybGVuKHRtcCk7Ci0gICAgaWYgKCFsZW5fc3RyKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGRpc2sgbGVuZ3RoIHNwZWNpZmllZC4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgc3dpdGNoKHRtcFtsZW5fc3RyIC0gMV0pIHsKLSAgICAgICAgY2FzZSAnTSc6IGNhc2UgJ20nOgotICAgICAgICAgICAgLyogbWVnYWJ5dGUgKi8KLSAgICAgICAgICAgIG11bHRpcGxlIDw8PSAxMDsKLSAgICAgICAgY2FzZSAnSyc6IGNhc2UgJ2snOgotICAgICAgICAgICAgLyoga2lsb2J5dGVzICovCi0gICAgICAgICAgICBtdWx0aXBsZSA8PD0gMTA7Ci0gICAgICAgICAgICB0bXBbbGVuX3N0ciAtIDFdID0gJ1wwJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgKnBsZW4gPSBzdHJ0b3VsbCh0bXAsIE5VTEwsIDApOwotICAgIGlmICghKnBsZW4pIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgbGVuZ3RoIHNwZWNpZmllZDogJXMiLCBzdHIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZiAoKnBsZW4gPT0gKHVpbnQ2NF90KS0xKSB7Ci0gICAgICAgIGlmIChtdWx0aXBsZSA+IDEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTaXplIG1vZGlmaWVyIGlsbGVnYWwgd2hlbiBsZW4gaXMgLTEiKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogY29udmVydCBsZW4gdG8ga2lsb2J5dGVzICovCi0gICAgICAgIGlmIChtdWx0aXBsZSA+IDEwMjQpCi0gICAgICAgICAgICBtdWx0aXBsZSA+Pj0gMTA7Ci0gICAgICAgICpwbGVuICo9IG11bHRpcGxlOwotCi0gICAgICAgIGlmICgqcGxlbiA+IDB4ZmZmZmZmZmZVTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJMZW5ndGggc3BlY2lmaWVkIGlzIHRvbyBsYXJnZSE6ICUiUFJJdTY0IiBLQiIsICpwbGVuKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotbG9hZF9wYXJ0aXRpb25zKGNub2RlICpyb290LCBzdHJ1Y3QgZGlza19pbmZvICpkaW5mbykKLXsKLSAgICBjbm9kZSAqcGFydG5vZGU7Ci0KLSAgICBkaW5mby0+bnVtX3BhcnRzID0gMDsKLSAgICBmb3IgKHBhcnRub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7IHBhcnRub2RlOyBwYXJ0bm9kZSA9IHBhcnRub2RlLT5uZXh0KSB7Ci0gICAgICAgIHN0cnVjdCBwYXJ0X2luZm8gKnBpbmZvID0gJmRpbmZvLT5wYXJ0X2xzdFtkaW5mby0+bnVtX3BhcnRzXTsKLSAgICAgICAgY29uc3QgY2hhciAqdG1wOwotCi0gICAgICAgIC8qIGJsZWgsIGkgd2lsbCBsZWFrIG1lbW9yeSBoZXJlLCBidXQgaSBET05UIENBUkUgc2luY2UKLSAgICAgICAgICogdGhlIG9ubHkgcmlnaHQgdGhpbmcgdG8gZG8gd2hlbiB0aGlzIGZ1bmN0aW9uIGZhaWxzCi0gICAgICAgICAqIGlzIHRvIHF1aXQgKi8KLSAgICAgICAgcGluZm8tPm5hbWUgPSBzdHJkdXAocGFydG5vZGUtPm5hbWUpOwotCi0gICAgICAgIGlmKGNvbmZpZ19ib29sKHBhcnRub2RlLCAiYWN0aXZlIiwgMCkpCi0gICAgICAgICAgICBwaW5mby0+ZmxhZ3MgfD0gUEFSVF9BQ1RJVkVfRkxBRzsKLQotICAgICAgICBpZiAoISh0bXAgPSBjb25maWdfc3RyKHBhcnRub2RlLCAidHlwZSIsIE5VTEwpKSkgewotICAgICAgICAgICAgQUxPR0UoIlBhcnRpdGlvbiB0eXBlIHJlcXVpcmVkOiAlcyIsIHBpbmZvLT5uYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcG9zc2libGUgdmFsdWVzIGFyZTogbGludXgsIGZhdDMyICovCi0gICAgICAgIGlmICghc3RyY21wKHRtcCwgImxpbnV4IikpIHsKLSAgICAgICAgICAgIHBpbmZvLT50eXBlID0gUENfUEFSVF9UWVBFX0xJTlVYOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG1wLCAiZmF0MzIiKSkgewotICAgICAgICAgICAgcGluZm8tPnR5cGUgPSBQQ19QQVJUX1RZUEVfRkFUMzI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgcGFydGl0aW9uIHR5cGUgZm91bmQ6ICVzIiwgdG1wKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCh0bXAgPSBjb25maWdfc3RyKHBhcnRub2RlLCAibGVuIiwgTlVMTCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IGxlbjsKLSAgICAgICAgICAgIGlmIChwYXJzZV9sZW4odG1wLCAmbGVuKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIHBpbmZvLT5sZW5fa2IgPSAodWludDMyX3QpIGxlbjsKLSAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgcGluZm8tPmxlbl9rYiA9IDA7Ci0KLSAgICAgICAgKytkaW5mby0+bnVtX3BhcnRzOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdHJ1Y3QgZGlza19pbmZvICoKLWxvYWRfZGlza2NvbmZpZyhjb25zdCBjaGFyICpmbiwgY2hhciAqcGF0aF9vdmVycmlkZSkKLXsKLSAgICBzdHJ1Y3QgZGlza19pbmZvICpkaW5mbzsKLSAgICBjbm9kZSAqZGV2cm9vdDsKLSAgICBjbm9kZSAqcGFydG5vZGU7Ci0gICAgY25vZGUgKnJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbnN0IGNoYXIgKnRtcDsKLQotICAgIGlmICghKGRpbmZvID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGlza19pbmZvKSkpKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgbWFsbG9jIGRpc2tfaW5mbyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbWVtc2V0KGRpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGRpc2tfaW5mbykpOwotCi0gICAgaWYgKCEoZGluZm8tPnBhcnRfbHN0ID0gbWFsbG9jKE1BWF9OVU1fUEFSVFMgKiBzaXplb2Yoc3RydWN0IHBhcnRfaW5mbykpKSkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IG1hbGxvYyBwYXJ0X2xzdCIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICAgIG1lbXNldChkaW5mby0+cGFydF9sc3QsIDAsCi0gICAgICAgICAgIChNQVhfTlVNX1BBUlRTICogc2l6ZW9mKHN0cnVjdCBwYXJ0X2luZm8pKSk7Ci0KLSAgICBjb25maWdfbG9hZF9maWxlKHJvb3QsIGZuKTsKLSAgICBpZiAocm9vdC0+Zmlyc3RfY2hpbGQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IHJlYWQgY29uZmlnIGZpbGUgJXMiLCBmbik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoIShkZXZyb290ID0gY29uZmlnX2ZpbmQocm9vdCwgImRldmljZSIpKSkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgZGV2aWNlIHNlY3Rpb24gaW4gY29uZmlnIGZpbGUgJyVzJyIsIGZuKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotCi0gICAgaWYgKCEodG1wID0gY29uZmlnX3N0cihkZXZyb290LCAicGF0aCIsIHBhdGhfb3ZlcnJpZGUpKSkgewotICAgICAgICBBTE9HRSgiZGV2aWNlIHBhdGggaXMgcmVxdXJpZWQiKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBkaW5mby0+ZGV2aWNlID0gc3RyZHVwKHRtcCk7Ci0KLSAgICAvKiBmaW5kIHRoZSBwYXJ0aXRpb24gc2NoZW1lICovCi0gICAgaWYgKCEodG1wID0gY29uZmlnX3N0cihkZXZyb290LCAic2NoZW1lIiwgTlVMTCkpKSB7Ci0gICAgICAgIEFMT0dFKCJwYXJ0aXRpb24gc2NoZW1lIGlzIHJlcXVpcmVkIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG1wLCAibWJyIikpIHsKLSAgICAgICAgZGluZm8tPnNjaGVtZSA9IFBBUlRfU0NIRU1FX01CUjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG1wLCAiZ3B0IikpIHsKLSAgICAgICAgQUxPR0UoIidncHQnIHBhcnRpdGlvbiBzY2hlbWUgbm90IHN1cHBvcnRlZCB5ZXQuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiVW5rbm93biBwYXJ0aXRpb24gc2NoZW1lIHNwZWNpZmllZDogJXMiLCB0bXApOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgLyogZ3JhYiB0aGUgc2VjdG9yIHNpemUgKGluIGJ5dGVzKSAqLwotICAgIHRtcCA9IGNvbmZpZ19zdHIoZGV2cm9vdCwgInNlY3Rvcl9zaXplIiwgIjUxMiIpOwotICAgIGRpbmZvLT5zZWN0X3NpemUgPSBzdHJ0b2wodG1wLCBOVUxMLCAwKTsKLSAgICBpZiAoIWRpbmZvLT5zZWN0X3NpemUpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgc2VjdG9yIHNpemU6ICVzIiwgdG1wKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIC8qIGZpcnN0IGxiYSB3aGVyZSB0aGUgcGFydGl0aW9ucyB3aWxsIHN0YXJ0IG9uIGRpc2sgKi8KLSAgICBpZiAoISh0bXAgPSBjb25maWdfc3RyKGRldnJvb3QsICJzdGFydF9sYmEiLCBOVUxMKSkpIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0X2xiYSBtdXN0IGJlIHByb3ZpZGVkIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoIShkaW5mby0+c2tpcF9sYmEgPSBzdHJ0b2wodG1wLCBOVUxMLCAwKSkpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgc3RhcnRpbmcgTEJBIChvciB6ZXJvKTogJXMiLCB0bXApOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgLyogTnVtYmVyIG9mIExCQXMgb24gZGlzayAqLwotICAgIGlmICghKHRtcCA9IGNvbmZpZ19zdHIoZGV2cm9vdCwgIm51bV9sYmEiLCBOVUxMKSkpIHsKLSAgICAgICAgQUxPR0UoIm51bV9sYmEgaXMgcmVxdWlyZWQiKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBkaW5mby0+bnVtX2xiYSA9IHN0cnRvdWwodG1wLCBOVUxMLCAwKTsKLQotICAgIGlmICghKHBhcnRub2RlID0gY29uZmlnX2ZpbmQoZGV2cm9vdCwgInBhcnRpdGlvbnMiKSkpIHsKLSAgICAgICAgQUxPR0UoIkRldmljZSBtdXN0IHNwZWNpZnkgcGFydGl0aW9uIGxpc3QiKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGlmIChsb2FkX3BhcnRpdGlvbnMocGFydG5vZGUsIGRpbmZvKSkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgcmV0dXJuIGRpbmZvOwotCi1mYWlsOgotICAgIGlmIChkaW5mby0+cGFydF9sc3QpCi0gICAgICAgIGZyZWUoZGluZm8tPnBhcnRfbHN0KTsKLSAgICBpZiAoZGluZm8tPmRldmljZSkKLSAgICAgICAgZnJlZShkaW5mby0+ZGV2aWNlKTsKLSAgICBmcmVlKGRpbmZvKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludAotc3luY19wdGFibGUoaW50IGZkKQotewotICAgIHN0cnVjdCBzdGF0IHN0YXQ7Ci0gICAgaW50IHJ2OwotCi0gICAgc3luYygpOwotCi0gICAgaWYgKGZzdGF0KGZkLCAmc3RhdCkpIHsKLSAgICAgICBBTE9HRSgiQ2Fubm90IHN0YXQsIGVycm5vPSVkLiIsIGVycm5vKTsKLSAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKFNfSVNCTEsoc3RhdC5zdF9tb2RlKSAmJiAoKHJ2ID0gaW9jdGwoZmQsIEJMS1JSUEFSVCwgTlVMTCkpIDwgMCkpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCByZS1yZWFkIHBhcnRpdGlvbiB0YWJsZS4gUkVCT09UIS4gKGVycm5vPSVkKSIsIGVycm5vKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoYXQgdGhlIGRpc2sgaW5mbyBwcm92aWRlZCBpcyB2YWxpZCwgYW5kIGlmIHNvLAotICogcmV0dXJucyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4KLSAqCi0gKiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBpdCB3aWxsIGxhdGVyIGJlIHN1Y2Nlc3NmdWxseSB3cml0dGVuCi0gKiB0aG91Z2guIElmIHdlIHVzZSB0aGUgcGMtYmlvcyBwYXJ0aXRpb25pbmcgc2NoZW1lLCB3ZSBtdXN0IHVzZSBleHRlbmRlZAotICogcGFydGl0aW9ucywgd2hpY2ggZWF0IHVwIHNvbWUgaGQgc3BhY2UuIElmIHRoZSB1c2VyIG1hbnVhbGx5IHByb3Zpc2lvbmVkCi0gKiBldmVyeSBzaW5nbGUgcGFydGl0aW9uLCBidXQgZGlkIG5vdCBhY2NvdW50IGZvciB0aGUgZXh0cmEgbmVlZGVkIHNwYWNlLAotICogdGhlbiB3ZSB3aWxsIGxhdGVyIGZhaWwuCi0gKgotICogVE9ETzogTWFrZSB2YWxpZGF0aW9uIG1vcmUgY29tcGxldGUuCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvKQotewotICAgIGludCBmZDsKLSAgICBpbnQgc2VjdF9zejsKLSAgICB1aW50NjRfdCBkaXNrX3NpemU7Ci0gICAgdWludDY0X3QgdG90YWxfc2l6ZTsKLSAgICBpbnQgY250OwotICAgIHN0cnVjdCBzdGF0IHN0YXQ7Ci0KLSAgICBpZiAoIWRpbmZvKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoKGZkID0gb3BlbihkaW5mby0+ZGV2aWNlLCBPX1JEV1IpKSA8IDApIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIGRldmljZSAnJXMnIChlcnJubz0lZCkiLCBkaW5mby0+ZGV2aWNlLCBlcnJubyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoZnN0YXQoZmQsICZzdGF0KSkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IHN0YXQgZmlsZSAnJXMnLCBlcnJubz0lZC4iLCBkaW5mby0+ZGV2aWNlLCBlcnJubyk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLQotICAgIC8qIFhYWDogU29tZSBvZiB0aGUgY29kZSBiZWxvdyBpcyBraW5kIG9mIHJlZHVuZGFudCBhbmQgc2hvdWxkIHByb2JhYmx5Ci0gICAgICogYmUgcmVmYWN0b3JlZCBhIGxpdHRsZSwgYnV0IGl0IHdpbGwgZG8gZm9yIG5vdy4gKi8KLQotICAgIC8qIFZlcmlmeSB0aGF0IHdlIGNhbiBvcGVyYXRlIG9uIHRoZSBkZXZpY2UgdGhhdCB3YXMgcmVxdWVzdGVkLgotICAgICAqIFdlIHByZXNlbnRseSBvbmx5IHN1cHBvcnQgYmxvY2sgZGV2aWNlcyBhbmQgcmVndWxhciBmaWxlIGltYWdlcy4gKi8KLSAgICBpZiAoU19JU0JMSyhzdGF0LnN0X21vZGUpKSB7Ci0gICAgICAgIC8qIGdldCB0aGUgc2VjdG9yIHNpemUgYW5kIG1ha2Ugc3VyZSB3ZSBhZ3JlZSAqLwotICAgICAgICBpZiAoaW9jdGwoZmQsIEJMS1NTWkdFVCwgJnNlY3Rfc3opIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBnZXQgc2VjdG9yIHNpemUgKGVycm5vPSVkKSIsIGVycm5vKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc2VjdF9zeiB8fCBzZWN0X3N6ICE9IGRpbmZvLT5zZWN0X3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJEZXZpY2Ugc2VjdG9yIHNpemUgaXMgemVybyBvciBzZWN0b3Igc2l6ZXMgZG8gbm90IG1hdGNoISIpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogYWxsb3cgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlICJkaXNrIHNpemUiIGlmIHRoZXkgcHJvdmlkZWQgbnVtX2xiYSAqLwotICAgICAgICBpZiAoIWRpbmZvLT5udW1fbGJhKSB7Ci0gICAgICAgICAgICBpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkU2NCwgJmRpc2tfc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYmxvY2sgZGV2aWNlIHNpemUgKGVycm5vPSVkKSIsIGVycm5vKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBYWFg6IHdlIGFzc3VtZSB0aGF0IHRoZSBkaXNrIGhhcyA8IDJeMzIgc2VjdG9ycyA6LSkgKi8KLSAgICAgICAgICAgIGRpbmZvLT5udW1fbGJhID0gKHVpbnQzMl90KShkaXNrX3NpemUgLyAodWludDY0X3QpZGluZm8tPnNlY3Rfc2l6ZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZGlza19zaXplID0gKHVpbnQ2NF90KWRpbmZvLT5udW1fbGJhICogKHVpbnQ2NF90KWRpbmZvLT5zZWN0X3NpemU7Ci0gICAgfSBlbHNlIGlmIChTX0lTUkVHKHN0YXQuc3RfbW9kZSkpIHsKLSAgICAgICAgQUxPR0koIlJlcXVlc3Rpbmcgb3BlcmF0aW9uIG9uIGEgcmVndWxhciBmaWxlLCBub3QgYmxvY2sgZGV2aWNlLiIpOwotICAgICAgICBpZiAoIWRpbmZvLT5zZWN0X3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTZWN0b3Igc2l6ZSBmb3IgcmVndWxhciBmaWxlIGltYWdlcyBjYW5ub3QgYmUgemVybyIpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkaW5mby0+bnVtX2xiYSkKLSAgICAgICAgICAgIGRpc2tfc2l6ZSA9ICh1aW50NjRfdClkaW5mby0+bnVtX2xiYSAqICh1aW50NjRfdClkaW5mby0+c2VjdF9zaXplOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRpbmZvLT5udW1fbGJhID0gKHVpbnQzMl90KShzdGF0LnN0X3NpemUgLyBkaW5mby0+c2VjdF9zaXplKTsKLSAgICAgICAgICAgIGRpc2tfc2l6ZSA9ICh1aW50NjRfdClzdGF0LnN0X3NpemU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRGV2aWNlIGRvZXMgbm90IHJlZmVyIHRvIGEgcmVndWxhciBmaWxlIG9yIGEgYmxvY2sgZGV2aWNlISIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0jaWYgMQotICAgIEFMT0dWKCJEZXZpY2UvZmlsZSAlczogc2l6ZT0lIiBQUkl1NjQgIiBieXRlcywgbnVtX2xiYT0ldSwgc2VjdF9zaXplPSVkIiwKLSAgICAgICAgIGRpbmZvLT5kZXZpY2UsIGRpc2tfc2l6ZSwgZGluZm8tPm51bV9sYmEsIGRpbmZvLT5zZWN0X3NpemUpOwotI2VuZGlmCi0KLSAgICAvKiBzaW5jZSB0aGlzIGlzIG91ciBvZmZzZXQgaW50byB0aGUgZGlzaywgd2Ugc3RhcnQgb2ZmIHdpdGggdGhhdCBhcwotICAgICAqIG91ciBzaXplIG9mIG5lZWRlZCBwYXJ0aXRpb25zICovCi0gICAgdG90YWxfc2l6ZSA9IGRpbmZvLT5za2lwX2xiYSAqIGRpbmZvLT5zZWN0X3NpemU7Ci0KLSAgICAvKiBhZGQgdXAgYWxsIHRoZSBwYXJ0aXRpb24gc2l6ZXMgYW5kIG1ha2Ugc3VyZSBpdCBmaXRzICovCi0gICAgZm9yIChjbnQgPSAwOyBjbnQgPCBkaW5mby0+bnVtX3BhcnRzOyArK2NudCkgewotICAgICAgICBzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0ID0gJmRpbmZvLT5wYXJ0X2xzdFtjbnRdOwotICAgICAgICBpZiAocGFydC0+bGVuX2tiICE9ICh1aW50MzJfdCktMSkgewotICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBwYXJ0LT5sZW5fa2IgKiAxMDI0OwotICAgICAgICB9IGVsc2UgaWYgKHBhcnQtPmxlbl9rYiA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWmVyby1zaXplIHBhcnRpdGlvbiAnJXMnIGlzIGludmFsaWQuIiwgcGFydC0+bmFtZSk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiB0aGUgcGFydGl0aW9uIHJlcXVlc3RzIHRoZSByZXN0IG9mIHRoZSBkaXNrLiAqLwotICAgICAgICAgICAgaWYgKGNudCArIDEgIT0gZGluZm8tPm51bV9wYXJ0cykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJPbmx5IHRoZSBsYXN0IHBhcnRpdGlvbiBpbiB0aGUgbGlzdCBjYW4gcmVxdWVzdCB0byBmaWxsICIKLSAgICAgICAgICAgICAgICAgICAgICJ0aGUgcmVzdCBvZiBkaXNrLiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocGFydC0+dHlwZSAhPSBQQ19QQVJUX1RZUEVfTElOVVgpICYmCi0gICAgICAgICAgICAocGFydC0+dHlwZSAhPSBQQ19QQVJUX1RZUEVfRkFUMzIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBwYXJ0aXRpb24gdHlwZSAoMHgleCkgZW5jb3VudGVyZWQgZm9yIHBhcnRpdGlvbiAiCi0gICAgICAgICAgICAgICAgICInJXMnXG4iLCBwYXJ0LT50eXBlLCBwYXJ0LT5uYW1lKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG9ubHkgbWF0dGVycyBmb3IgZGlza3MsIG5vdCBmaWxlcyAqLwotICAgIGlmIChTX0lTQkxLKHN0YXQuc3RfbW9kZSkgJiYgdG90YWxfc2l6ZSA+IGRpc2tfc2l6ZSkgewotICAgICAgICBBTE9HRSgiVG90YWwgcmVxdWVzdGVkIHNpemUgb2YgcGFydGl0aW9ucyAoJSJQUkl1NjQiKSBpcyBncmVhdGVyIHRoYW4gZGlzayAiCi0gICAgICAgICAgICAgInNpemUgKCUiUFJJdTY0IikuIiwgdG90YWxfc2l6ZSwgZGlza19zaXplKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIHJldHVybiBmZDsKLQotZmFpbDoKLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hbmRfY29uZmlnKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvLCBpbnQgKmZkLCBzdHJ1Y3Qgd3JpdGVfbGlzdCAqKmxzdCkKLXsKLSAgICAqbHN0ID0gTlVMTDsKLSAgICAqZmQgPSAtMTsKLQotICAgIGlmICgoKmZkID0gdmFsaWRhdGUoZGluZm8pKSA8IDApCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgc3dpdGNoIChkaW5mby0+c2NoZW1lKSB7Ci0gICAgICAgIGNhc2UgUEFSVF9TQ0hFTUVfTUJSOgotICAgICAgICAgICAgKmxzdCA9IGNvbmZpZ19tYnIoZGluZm8pOwotICAgICAgICAgICAgcmV0dXJuICpsc3QgPT0gTlVMTDsKLSAgICAgICAgY2FzZSBQQVJUX1NDSEVNRV9HUFQ6Ci0gICAgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gcGFydGl0aW9uIHNjaGVtZS4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNsb3NlKCpmZCk7Ci0gICAgKmxzdCA9IE5VTEw7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIHZhbGlkYXRlIGFuZCBwcm9jZXNzIHRoZSBkaXNrIGxheW91dCBjb25maWd1cmF0aW9uLgotICogVGhpcyB3aWxsIGNhdXNlIGFuIHVwZGF0ZSB0byB0aGUgcGFydGl0aW9ucycgc3RhcnQgbGJhLgotICoKLSAqIEJhc2ljYWxseSwgdGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIGFwcGx5X2Rpc2tfY29uZmlnIGluIHRlc3QgbW9kZSwKLSAqIGV4Y2VwdCB0aGF0IHdsaXN0X2NvbW1pdCBpcyBub3QgY2FsbGVkIHRvIHByaW50IG91dCB0aGUgZGF0YSB0byBiZQotICogd3JpdHRlbi4KLSAqLwotaW50Ci1wcm9jZXNzX2Rpc2tfY29uZmlnKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvKQotewotICAgIHN0cnVjdCB3cml0ZV9saXN0ICpsc3Q7Ci0gICAgaW50IGZkOwotCi0gICAgaWYgKHZhbGlkYXRlX2FuZF9jb25maWcoZGluZm8sICZmZCwgJmxzdCkgIT0gMCkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjbG9zZShmZCk7Ci0gICAgd2xpc3RfZnJlZShsc3QpOwotICAgIHJldHVybiAwOwotfQotCi0KLWludAotYXBwbHlfZGlza19jb25maWcoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8sIGludCB0ZXN0KQotewotICAgIGludCBmZDsKLSAgICBzdHJ1Y3Qgd3JpdGVfbGlzdCAqd3JfbHN0ID0gTlVMTDsKLSAgICBpbnQgcnY7Ci0KLSAgICBpZiAodmFsaWRhdGVfYW5kX2NvbmZpZyhkaW5mbywgJmZkLCAmd3JfbHN0KSAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb25maWd1cmF0aW9uIGlzIGludmFsaWQuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoKHJ2ID0gd2xpc3RfY29tbWl0KGZkLCB3cl9sc3QsIHRlc3QpKSA+PSAwKQotICAgICAgICBydiA9IHRlc3QgPyAwIDogc3luY19wdGFibGUoZmQpOwotCi0gICAgY2xvc2UoZmQpOwotICAgIHdsaXN0X2ZyZWUod3JfbHN0KTsKLSAgICByZXR1cm4gcnY7Ci0KLWZhaWw6Ci0gICAgY2xvc2UoZmQpOwotICAgIGlmICh3cl9sc3QpCi0gICAgICAgIHdsaXN0X2ZyZWUod3JfbHN0KTsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50Ci1kdW1wX2Rpc2tfY29uZmlnKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvKQotewotICAgIGludCBjbnQ7Ci0gICAgc3RydWN0IHBhcnRfaW5mbyAqcGFydDsKLQotICAgIHByaW50ZigiRGV2aWNlOiAlc1xuIiwgZGluZm8tPmRldmljZSk7Ci0gICAgcHJpbnRmKCJTY2hlbWU6ICIpOwotICAgIHN3aXRjaCAoZGluZm8tPnNjaGVtZSkgewotICAgICAgICBjYXNlIFBBUlRfU0NIRU1FX01CUjoKLSAgICAgICAgICAgIHByaW50ZigiTUJSIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVJUX1NDSEVNRV9HUFQ6Ci0gICAgICAgICAgICBwcmludGYoIkdQVCAodW5zdXBwb3J0ZWQpIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHByaW50ZigiVW5rbm93biIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHByaW50ZiAoIlxuIik7Ci0KLSAgICBwcmludGYoIlNlY3RvciBzaXplOiAlZFxuIiwgZGluZm8tPnNlY3Rfc2l6ZSk7Ci0gICAgcHJpbnRmKCJTa2lwIGxlYWRpbmcgTEJBczogJXVcbiIsIGRpbmZvLT5za2lwX2xiYSk7Ci0gICAgcHJpbnRmKCJOdW1iZXIgb2YgTEJBczogJXVcbiIsIGRpbmZvLT5udW1fbGJhKTsKLSAgICBwcmludGYoIlBhcnRpdGlvbnM6XG4iKTsKLQotICAgIGZvciAoY250ID0gMDsgY250IDwgZGluZm8tPm51bV9wYXJ0czsgKytjbnQpIHsKLSAgICAgICAgcGFydCA9ICZkaW5mby0+cGFydF9sc3RbY250XTsKLSAgICAgICAgcHJpbnRmKCJcdG5hbWUgPSAlc1xuIiwgcGFydC0+bmFtZSk7Ci0gICAgICAgIHByaW50ZigiXHRcdGZsYWdzID0gJXNcbiIsCi0gICAgICAgICAgICAgICBwYXJ0LT5mbGFncyAmIFBBUlRfQUNUSVZFX0ZMQUcgPyAiQWN0aXZlIiA6ICJOb25lIik7Ci0gICAgICAgIHByaW50ZigiXHRcdHR5cGUgPSAlc1xuIiwKLSAgICAgICAgICAgICAgIHBhcnQtPnR5cGUgPT0gUENfUEFSVF9UWVBFX0xJTlVYID8gIkxpbnV4IiA6ICJVbmtub3duIik7Ci0gICAgICAgIGlmIChwYXJ0LT5sZW5fa2IgPT0gKHVpbnQzMl90KS0xKQotICAgICAgICAgICAgcHJpbnRmKCJcdFx0bGVuID0gcmVzdCBvZiBkaXNrXG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRmKCJcdFx0bGVuID0gJXVLQlxuIiwgcGFydC0+bGVuX2tiKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJUb3RhbCBudW1iZXIgb2YgcGFydGl0aW9uczogJWRcbiIsIGNudCk7Ci0gICAgcHJpbnRmKCJcbiIpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBwYXJ0X2luZm8gKgotZmluZF9wYXJ0KHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvLCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIHN0cnVjdCBwYXJ0X2luZm8gKnBpbmZvOwotICAgIGludCBjbnQ7Ci0KLSAgICBmb3IgKGNudCA9IDA7IGNudCA8IGRpbmZvLT5udW1fcGFydHM7ICsrY250KSB7Ci0gICAgICAgIHBpbmZvID0gJmRpbmZvLT5wYXJ0X2xzdFtjbnRdOwotICAgICAgICBpZiAoIXN0cmNtcChwaW5mby0+bmFtZSwgbmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gcGluZm87Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIE5PVEU6IElmIHRoZSByZXR1cm5lZCBwdHIgaXMgbm9uLU5VTEwsIGl0IG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gKi8KLWNoYXIgKgotZmluZF9wYXJ0X2RldmljZShzdHJ1Y3QgZGlza19pbmZvICpkaW5mbywgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBzd2l0Y2ggKGRpbmZvLT5zY2hlbWUpIHsKLSAgICAgICAgY2FzZSBQQVJUX1NDSEVNRV9NQlI6Ci0gICAgICAgICAgICByZXR1cm4gZmluZF9tYnJfcGFydChkaW5mbywgbmFtZSk7Ci0gICAgICAgIGNhc2UgUEFSVF9TQ0hFTUVfR1BUOgotICAgICAgICAgICAgQUxPR0UoIkdQVCBpcyBwcmVzZW50bHkgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBwYXJ0aXRpb24gdGFibGUgc2NoZW1lIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCmRpZmYgLS1naXQgYS9saWJkaXNrY29uZmlnL2Rpc2t1dGlscy5jIGIvbGliZGlza2NvbmZpZy9kaXNrdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxYjRjMS4uMDAwMDAwMAotLS0gYS9saWJkaXNrY29uZmlnL2Rpc2t1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qIGxpYnMvZGlza2NvbmZpZy9kaXNrdXRpbHMuYwotICoKLSAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJkaXNrdXRpbHMiCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLSNpbmNsdWRlIDxkaXNrY29uZmlnL2Rpc2tjb25maWcuaD4KLQotaW50Ci13cml0ZV9yYXdfaW1hZ2UoY29uc3QgY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGxvZmZfdCBvZmZzZXQsIGludCB0ZXN0KQotewotICAgIGludCBkc3RfZmQgPSAtMTsKLSAgICBpbnQgc3JjX2ZkID0gLTE7Ci0gICAgdWludDhfdCBidWZmZXJbMjA0OF07Ci0gICAgc3NpemVfdCBucl9ieXRlczsKLSAgICBzc2l6ZV90IHRtcDsKLSAgICBpbnQgZG9uZSA9IDA7Ci0gICAgdWludDY0X3QgdG90YWwgPSAwOwotCi0gICAgQUxPR0koIldyaXRpbmcgUkFXIGltYWdlICclcycgdG8gJyVzJyAob2Zmc2V0PSVsbHUpIiwgc3JjLCBkc3QsICh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0KTsKLSAgICBpZiAoKHNyY19mZCA9IG9wZW4oc3JjLCBPX1JET05MWSkpIDwgMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IG9wZW4gJXMgZm9yIHJlYWRpbmcgKGVycm5vPSVkKS4iLCBzcmMsIGVycm5vKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGlmICghdGVzdCkgewotICAgICAgICBpZiAoKGRzdF9mZCA9IG9wZW4oZHN0LCBPX1JEV1IpKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3Qgb3BlbiAnJXMnIGZvciByZWFkL3dyaXRlIChlcnJubz0lZCkuIiwgZHN0LCBlcnJubyk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobHNlZWs2NChkc3RfZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBzZWVrIHRvIG9mZnNldCAlbGxkIGluICVzLiIsIChsb25nIGxvbmcpb2Zmc2V0LCBkc3QpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKCFkb25lKSB7Ci0gICAgICAgIGlmICgobnJfYnl0ZXMgPSByZWFkKHNyY19mZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpIDwgMCkgewotICAgICAgICAgICAgLyogWFhYOiBTaG91bGQgd2Ugbm90IGV2ZW4gYm90aGVyIHdpdGggRUlOVFI/ICovCi0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgKCVkKSB3aGlsZSByZWFkaW5nIGZyb20gJyVzJyIsIGVycm5vLCBzcmMpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFucl9ieXRlcykgewotICAgICAgICAgICAgLyogd2UncmUgZG9uZS4gKi8KLSAgICAgICAgICAgIGRvbmUgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICB0b3RhbCArPSBucl9ieXRlczsKLQotICAgICAgICAvKiBza2lwIHRoZSB3cml0ZSBsb29wIGlmIHdlJ3JlIHRlc3RpbmcgKi8KLSAgICAgICAgaWYgKHRlc3QpCi0gICAgICAgICAgICBucl9ieXRlcyA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKG5yX2J5dGVzID4gMCkgewotICAgICAgICAgICAgaWYgKCh0bXAgPSB3cml0ZShkc3RfZmQsIGJ1ZmZlciwgbnJfYnl0ZXMpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAvKiBYWFg6IFNob3VsZCB3ZSBub3QgZXZlbiBib3RoZXIgd2l0aCBFSU5UUj8gKi8KLSAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciAoJWQpIHdoaWxlIHdyaXRpbmcgdG8gJyVzJyIsIGVycm5vLCBkc3QpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghdG1wKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgbnJfYnl0ZXMgLT0gdG1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFkb25lKSB7Ci0gICAgICAgIEFMT0dFKCJFeGl0ZWQgcmVhZC93cml0ZSBsb29wIHdpdGhvdXQgc2V0dGluZyBmbGFnISBXVEY/ISIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaWYgKGRzdF9mZCA+PSAwKQotICAgICAgICBmc3luYyhkc3RfZmQpOwotCi0gICAgQUxPR0koIldyb3RlICUiIFBSSXU2NCAiIGJ5dGVzIHRvICVzIEAgJWxsZCIsIHRvdGFsLCBkc3QsIChsb25nIGxvbmcpb2Zmc2V0KTsKLQotICAgIGNsb3NlKHNyY19mZCk7Ci0gICAgaWYgKGRzdF9mZCA+PSAwKQotICAgICAgICBjbG9zZShkc3RfZmQpOwotICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIGlmIChkc3RfZmQgPj0gMCkKLSAgICAgICAgY2xvc2UoZHN0X2ZkKTsKLSAgICBpZiAoc3JjX2ZkID49IDApCi0gICAgICAgIGNsb3NlKHNyY19mZCk7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9saWJkaXNrY29uZmlnL2R1bXBfZGlza2NvbmZpZy5jIGIvbGliZGlza2NvbmZpZy9kdW1wX2Rpc2tjb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0ZjYyMC4uMDAwMDAwMAotLS0gYS9saWJkaXNrY29uZmlnL2R1bXBfZGlza2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogbGlicy9kaXNrY29uZmlnL2R1bXBfZGlza2NvbmZpZy5jCi0gKgotICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgImR1bXBfZGlza2NvbmZpZyIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLSNpbmNsdWRlICJkaXNrY29uZmlnLmgiCi0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvOwotCi0gICAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgICAgIEFMT0dFKCJ1c2FnZTogJXMgPGNvbmYgZmlsZT4iLCBhcmd2WzBdKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCEoZGluZm8gPSBsb2FkX2Rpc2tjb25maWcoYXJndlsxXSwgTlVMTCkpKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGR1bXBfZGlza19jb25maWcoZGluZm8pOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmRpc2tjb25maWcvaW5jbHVkZS9kaXNrY29uZmlnL2Rpc2tjb25maWcuaCBiL2xpYmRpc2tjb25maWcvaW5jbHVkZS9kaXNrY29uZmlnL2Rpc2tjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1Yjk5ZS4uMDAwMDAwMAotLS0gYS9saWJkaXNrY29uZmlnL2luY2x1ZGUvZGlza2NvbmZpZy9kaXNrY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyogc3lzdGVtL2NvcmUvaW5jbHVkZS9kaXNrY29uZmlnL2Rpc2tjb25maWcuaAotICoKLSAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0xJQlNfRElTS0NPTkZJR19ICi0jZGVmaW5lIF9fTElCU19ESVNLQ09ORklHX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX05BTUVfTEVOICAgICAgICAgICAgICAgICA1MTIKLSNkZWZpbmUgTUFYX05VTV9QQVJUUyAgICAgICAgICAgICAgICAxNgotCi0vKiBrbm93biBwYXJ0aXRpb24gc2NoZW1lcyAqLwotI2RlZmluZSBQQVJUX1NDSEVNRV9NQlIgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBQQVJUX1NDSEVNRV9HUFQgICAgICAgICAgICAgIDB4MgotCi0vKiBQQyBCaW9zIHBhcnRpdGlvbiBzdGF0dXMgKi8KLSNkZWZpbmUgUENfUEFSVF9BQ1RJVkUgICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIFBDX1BBUlRfTk9STUFMICAgICAgICAgICAgICAgMHgwCi0KLS8qIEtub3duIChyYXRoZXIsIHVzZWQgYnkgdXMpIHBhcnRpdGlvbiB0eXBlcyAqLwotI2RlZmluZSBQQ19QQVJUX1RZUEVfTElOVVggICAgICAgICAgIDB4ODMKLSNkZWZpbmUgUENfUEFSVF9UWVBFX0VYVEVOREVEICAgICAgICAweDA1Ci0jZGVmaW5lIFBDX1BBUlRfVFlQRV9GQVQzMiAgICAgICAgICAgMHgwYwotCi0jZGVmaW5lIFBDX05VTV9CT09UX1JFQ09SRF9QQVJUUyAgICAgNAotCi0jZGVmaW5lIFBDX0VCUl9MT0dJQ0FMX1BBUlQgICAgICAgICAgMAotI2RlZmluZSBQQ19FQlJfTkVYVF9QVFJfUEFSVCAgICAgICAgIDEKLQotI2RlZmluZSBQQ19CSU9TX0JPT1RfU0lHICAgICAgICAgICAgIDB4QUE1NQotCi0jZGVmaW5lIFBDX01CUl9ESVNLX09GRlNFVCAgICAgICAgICAgMAotI2RlZmluZSBQQ19NQlJfU0laRSAgICAgICAgICAgICAgICAgIDUxMgotCi0jZGVmaW5lIFBBUlRfQUNUSVZFX0ZMQUcgICAgICAgICAgICAgMHgxCi0KLXN0cnVjdCBjaHMgewotICAgIHVpbnQ4X3QgaGVhZDsKLSAgICB1aW50OF90IHNlY3RvcjsKLSAgICB1aW50OF90IGN5bGluZGVyOwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLS8qIDE2IGJ5dGUgcGMgcGFydGl0aW9uIGRlc2NyaXB0b3IgdGhhdCBzaXRzIGluIE1CUiBhbmQgRVBCUi4KLSAqIE5vdGU6IG11bHRpLWJ5dGUgZW50aXRpZXMgaGF2ZSBsaXR0bGUtZW5kaWFuIGxheW91dCBvbiBkaXNrICovCi1zdHJ1Y3QgcGNfcGFydGl0aW9uIHsKLSAgICB1aW50OF90IHN0YXR1czsgICAgIC8qIGJ5dGUgIDAgICAgICovCi0gICAgc3RydWN0IGNocyBzdGFydDsgICAvKiBieXRlcyAxLTMgICAqLwotICAgIHVpbnQ4X3QgdHlwZTsgICAgICAgLyogYnl0ZSAgNCAgICAgKi8KLSAgICBzdHJ1Y3QgY2hzIGVuZDsgICAgIC8qIGJ5dGVzIDUtNyAgICovCi0gICAgdWludDMyX3Qgc3RhcnRfbGJhOyAvKiBieXRlcyA4LTExICAqLwotICAgIHVpbnQzMl90IGxlbl9sYmE7ICAgLyogYnl0ZXMgMTItMTUgKi8KLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi1zdHJ1Y3QgcGNfYm9vdF9yZWNvcmQgewotICAgIHVpbnQ4X3QgY29kZVs0NDBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgMC00MzkgICAqLwotICAgIHVpbnQzMl90IGRpc2tfc2lnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgNDQwLTQ0MyAqLwotICAgIHVpbnQxNl90IHBhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgNDQ0LTQ0NSAqLwotICAgIHN0cnVjdCBwY19wYXJ0aXRpb24gcHRhYmxlW1BDX05VTV9CT09UX1JFQ09SRF9QQVJUU107ICAgLyogYnl0ZXMgNDQ2LTUwOSAqLwotICAgIHVpbnQxNl90IG1icl9zaWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgNTEwLTUxMSAqLwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLXN0cnVjdCBwYXJ0X2luZm8gewotICAgIGNoYXIgKm5hbWU7Ci0gICAgdWludDhfdCBmbGFnczsKLSAgICB1aW50OF90IHR5cGU7Ci0gICAgdWludDMyX3QgbGVuX2tiOyAgICAgICAvKiBpbiAxSy1ieXRlcyAqLwotICAgIHVpbnQzMl90IHN0YXJ0X2xiYTsgICAgLyogdGhlIExCQSB3aGVyZSB0aGlzIHBhcnRpdGlvbiBiZWdpbnMgKi8KLX07Ci0KLXN0cnVjdCBkaXNrX2luZm8gewotICAgIGNoYXIgKmRldmljZTsKLSAgICB1aW50OF90IHNjaGVtZTsKLSAgICBpbnQgc2VjdF9zaXplOyAgICAgICAvKiBleHBlY3RlZCBzZWN0b3Igc2l6ZSBpbiBieXRlcy4gTVVTVCBCRSBQT1dFUiBPRiAyICovCi0gICAgdWludDMyX3Qgc2tpcF9sYmE7ICAgLyogaW4gc2VjdG9ycyAoMSB1bml0IG9mIExCQSkgKi8KLSAgICB1aW50MzJfdCBudW1fbGJhOyAgICAvKiB0aGUgc2l6ZSBvZiB0aGUgZGlzayBpbiBMQkEgdW5pdHMgKi8KLSAgICBzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0X2xzdDsKLSAgICBpbnQgbnVtX3BhcnRzOwotfTsKLQotc3RydWN0IHdyaXRlX2xpc3QgewotICAgIHN0cnVjdCB3cml0ZV9saXN0ICpuZXh0OwotICAgIGxvZmZfdCBvZmZzZXQ7Ci0gICAgdWludDMyX3QgbGVuOwotICAgIHVpbnQ4X3QgZGF0YVswXTsKLX07Ci0KLQotc3RydWN0IHdyaXRlX2xpc3QgKmFsbG9jX3dsKHVpbnQzMl90IGRhdGFfbGVuKTsKLXZvaWQgZnJlZV93bChzdHJ1Y3Qgd3JpdGVfbGlzdCAqaXRlbSk7Ci1zdHJ1Y3Qgd3JpdGVfbGlzdCAqd2xpc3RfYWRkKHN0cnVjdCB3cml0ZV9saXN0ICoqbHN0LCBzdHJ1Y3Qgd3JpdGVfbGlzdCAqaXRlbSk7Ci12b2lkIHdsaXN0X2ZyZWUoc3RydWN0IHdyaXRlX2xpc3QgKmxzdCk7Ci1pbnQgd2xpc3RfY29tbWl0KGludCBmZCwgc3RydWN0IHdyaXRlX2xpc3QgKmxzdCwgaW50IHRlc3QpOwotCi1zdHJ1Y3QgZGlza19pbmZvICpsb2FkX2Rpc2tjb25maWcoY29uc3QgY2hhciAqZm4sIGNoYXIgKnBhdGhfb3ZlcnJpZGUpOwotaW50IGR1bXBfZGlza19jb25maWcoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8pOwotaW50IGFwcGx5X2Rpc2tfY29uZmlnKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvLCBpbnQgdGVzdCk7Ci1jaGFyICpmaW5kX3BhcnRfZGV2aWNlKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKLWludCBwcm9jZXNzX2Rpc2tfY29uZmlnKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvKTsKLXN0cnVjdCBwYXJ0X2luZm8gKmZpbmRfcGFydChzdHJ1Y3QgZGlza19pbmZvICpkaW5mbywgY29uc3QgY2hhciAqbmFtZSk7Ci0KLWludCB3cml0ZV9yYXdfaW1hZ2UoY29uc3QgY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGxvZmZfdCBvZmZzZXQsIGludCB0ZXN0KTsKLQotLyogRm9yIE1CUiBwYXJ0aXRpb24gc2NoZW1lcyAqLwotc3RydWN0IHdyaXRlX2xpc3QgKmNvbmZpZ19tYnIoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8pOwotY2hhciAqZmluZF9tYnJfcGFydChzdHJ1Y3QgZGlza19pbmZvICpkaW5mbywgY29uc3QgY2hhciAqbmFtZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0xJQlNfRElTS0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9saWJkaXNrY29uZmlnL3dyaXRlX2xzdC5jIGIvbGliZGlza2NvbmZpZy93cml0ZV9sc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkNWMwYS4uMDAwMDAwMAotLS0gYS9saWJkaXNrY29uZmlnL3dyaXRlX2xzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyogbGlicy9kaXNrY29uZmlnL3dyaXRlX2xzdC5jCi0gKgotICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIndyaXRlX2xzdCIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxkaXNrY29uZmlnL2Rpc2tjb25maWcuaD4KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLXN0cnVjdCB3cml0ZV9saXN0ICoKLWFsbG9jX3dsKHVpbnQzMl90IGRhdGFfbGVuKQotewotICAgIHN0cnVjdCB3cml0ZV9saXN0ICppdGVtOwotCi0gICAgaWYgKCEoaXRlbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHdyaXRlX2xpc3QpICsgZGF0YV9sZW4pKSkgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaXRlbS0+bGVuID0gZGF0YV9sZW47Ci0gICAgcmV0dXJuIGl0ZW07Ci19Ci0KLXZvaWQKLWZyZWVfd2woc3RydWN0IHdyaXRlX2xpc3QgKml0ZW0pCi17Ci0gICAgaWYgKGl0ZW0pCi0gICAgICAgIGZyZWUoaXRlbSk7Ci19Ci0KLXN0cnVjdCB3cml0ZV9saXN0ICoKLXdsaXN0X2FkZChzdHJ1Y3Qgd3JpdGVfbGlzdCAqKmxzdCwgc3RydWN0IHdyaXRlX2xpc3QgKml0ZW0pCi17Ci0gICAgaXRlbS0+bmV4dCA9ICgqbHN0KTsKLSAgICAqbHN0ID0gaXRlbTsKLSAgICByZXR1cm4gaXRlbTsKLX0KLQotdm9pZAotd2xpc3RfZnJlZShzdHJ1Y3Qgd3JpdGVfbGlzdCAqbHN0KQotewotICAgIHN0cnVjdCB3cml0ZV9saXN0ICp0ZW1wX3dyOwotICAgIHdoaWxlIChsc3QpIHsKLSAgICAgICAgdGVtcF93ciA9IGxzdC0+bmV4dDsKLSAgICAgICAgZnJlZV93bChsc3QpOwotICAgICAgICBsc3QgPSB0ZW1wX3dyOwotICAgIH0KLX0KLQotaW50Ci13bGlzdF9jb21taXQoaW50IGZkLCBzdHJ1Y3Qgd3JpdGVfbGlzdCAqbHN0LCBpbnQgdGVzdCkKLXsKLSAgICBmb3IoOyBsc3Q7IGxzdCA9IGxzdC0+bmV4dCkgewotICAgICAgICBpZiAobHNlZWs2NChmZCwgbHN0LT5vZmZzZXQsIFNFRUtfU0VUKSAhPSAobG9mZl90KWxzdC0+b2Zmc2V0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNlZWsgdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbiAoJWxsZCkuIiwgKGxvbmcgbG9uZylsc3QtPm9mZnNldCk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXRlc3QpIHsKLSAgICAgICAgICAgIGlmICh3cml0ZShmZCwgbHN0LT5kYXRhLCBsc3QtPmxlbikgIT0gKGludClsc3QtPmxlbikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgd3JpdGluZyAldSBieXRlcyBhdCBwb3NpdGlvbiAlbGxkLiIsIGxzdC0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylsc3QtPm9mZnNldCk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIEFMT0dJKCJXb3VsZCB3cml0ZSAlZCBieXRlcyBAIG9mZnNldCAlbGxkLiIsIGxzdC0+bGVuLCAobG9uZyBsb25nKWxzdC0+b2Zmc2V0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLQotZmFpbDoKLSAgICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZS5jcHAgYi9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZS5jcHAKaW5kZXggMTk3MWYwMS4uNTAyM2M3OSAxMDA2NDQKLS0tIGEvbGlibW9kcHJvYmUvbGlibW9kcHJvYmUuY3BwCisrKyBiL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlLmNwcApAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgfQogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoY2ZnX2NvbnRlbnRzLCAiXG4iKTsKLSAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgIGZvciAoY29uc3QgYXV0byYgbGluZSA6IGxpbmVzKSB7CiAgICAgICAgIGlmIChsaW5lLmVtcHR5KCkgfHwgbGluZVswXSA9PSAnIycpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC00MjEsNyArNDIxLDggQEAKICAgICB9CiAKICAgICBpZiAoc3RyaWN0ICYmICFtb2R1bGVfbG9hZGVkKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkxvYWRXaXRoQWxpYXNlcyB3YXMgdW5hYmxlIHRvIGxvYWQgIiA8PCBtb2R1bGVfbmFtZTsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTG9hZFdpdGhBbGlhc2VzIHdhcyB1bmFibGUgdG8gbG9hZCAiIDw8IG1vZHVsZV9uYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIiwgdHJpZWQ6ICIgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihtb2R1bGVzX3RvX2xvYWQsICIsICIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpAQCAtNDM5LDU0ICs0NDAsNTggQEAKICAgICByZXR1cm4gbW9kdWxlX2Jsb2NrbGlzdF8uY291bnQoY2Fub25pY2FsX25hbWUpID4gMDsKIH0KIAotLy8gQW5vdGhlciBvcHRpb24gdG8gbG9hZCBrZXJuZWwgbW9kdWxlcy4gbG9hZCBpbiBpbmRlcGVuZGVudCBtb2R1bGVzIGluIHBhcmFsbGVsCi0vLyBhbmQgdGhlbiB1cGRhdGUgZGVwZW5kZW5jeSBsaXN0IG9mIG90aGVyIHJlbWFpbmluZyBtb2R1bGVzLCByZXBlYXQgdGhlc2Ugc3RlcHMKLS8vIHVudGlsIGFsbCBtb2R1bGVzIGFyZSBsb2FkZWQuCisvLyBBbm90aGVyIG9wdGlvbiB0byBsb2FkIGtlcm5lbCBtb2R1bGVzLiBsb2FkIGluZGVwZW5kZW50IG1vZHVsZXMgZGVwZW5kZW5jaWVzCisvLyBpbiBwYXJhbGxlbCBhbmQgdGhlbiB1cGRhdGUgZGVwZW5kZW5jeSBsaXN0IG9mIG90aGVyIHJlbWFpbmluZyBtb2R1bGVzLAorLy8gcmVwZWF0IHRoZXNlIHN0ZXBzIHVudGlsIGFsbCBtb2R1bGVzIGFyZSBsb2FkZWQuCisvLyBEaXNjYXJkIGFsbCBibG9ja2xpc3QuCisvLyBTb2Z0ZGVwcyBhcmUgdGFrZW4gY2FyZSBpbiBJbnNtb2RXaXRoRGVwcygpLgogYm9vbCBNb2Rwcm9iZTo6TG9hZE1vZHVsZXNQYXJhbGxlbChpbnQgbnVtX3RocmVhZHMpIHsKICAgICBib29sIHJldCA9IHRydWU7Ci0gICAgaW50IGNvdW50ID0gLTE7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj4gbW9kX3dpdGhfZGVwczsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gbW9kX3dpdGhfZGVwczsKIAogICAgIC8vIEdldCBkZXBlbmRlbmNpZXMKICAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1vZHVsZV9sb2FkXykgeworICAgICAgICAvLyBTa2lwIGJsb2NrbGlzdCBtb2R1bGVzCisgICAgICAgIGlmIChJc0Jsb2NrbGlzdGVkKG1vZHVsZSkpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTE1QOiBCbG9ja2xpc3Q6IE1vZHVsZSAiIDw8IG1vZHVsZSA8PCAiIHNraXBwaW5nLi4uIjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIGF1dG8gZGVwZW5kZW5jaWVzID0gR2V0RGVwZW5kZW5jaWVzKE1ha2VDYW5vbmljYWwobW9kdWxlKSk7Ci0KLSAgICAgICAgZm9yIChhdXRvIGRlcCA9IGRlcGVuZGVuY2llcy5yYmVnaW4oKTsgZGVwICE9IGRlcGVuZGVuY2llcy5yZW5kKCk7IGRlcCsrKSB7Ci0gICAgICAgICAgICBtb2Rfd2l0aF9kZXBzW21vZHVsZV0uZW1wbGFjZSgqZGVwKTsKKyAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJMTVA6IEhhcmQtZGVwOiBNb2R1bGUgIiA8PCBtb2R1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBub3QgaW4gLmRlcCBmaWxlIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBtb2Rfd2l0aF9kZXBzW01ha2VDYW5vbmljYWwobW9kdWxlKV0gPSBkZXBlbmRlbmNpZXM7CiAgICAgfQogCi0gICAgLy8gR2V0IHNvZnQgZGVwZW5kZW5jaWVzCi0gICAgZm9yIChjb25zdCBhdXRvJiBbaXRfbW9kLCBpdF9zb2Z0ZGVwXSA6IG1vZHVsZV9wcmVfc29mdGRlcF8pIHsKLSAgICAgICAgaWYgKG1vZF93aXRoX2RlcHMuZmluZChNYWtlQ2Fub25pY2FsKGl0X3NvZnRkZXApKSAhPSBtb2Rfd2l0aF9kZXBzLmVuZCgpKSB7Ci0gICAgICAgICAgICBtb2Rfd2l0aF9kZXBzW01ha2VDYW5vbmljYWwoaXRfbW9kKV0uZW1wbGFjZSgKLSAgICAgICAgICAgICAgICBHZXREZXBlbmRlbmNpZXMoTWFrZUNhbm9uaWNhbChpdF9zb2Z0ZGVwKSlbMF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IHNvZnQgcG9zdCBkZXBlbmRlbmNpZXMKLSAgICBmb3IgKGNvbnN0IGF1dG8mIFtpdF9tb2QsIGl0X3NvZnRkZXBdIDogbW9kdWxlX3Bvc3Rfc29mdGRlcF8pIHsKLSAgICAgICAgaWYgKG1vZF93aXRoX2RlcHMuZmluZChNYWtlQ2Fub25pY2FsKGl0X3NvZnRkZXApKSAhPSBtb2Rfd2l0aF9kZXBzLmVuZCgpKSB7Ci0gICAgICAgICAgICBtb2Rfd2l0aF9kZXBzW01ha2VDYW5vbmljYWwoaXRfc29mdGRlcCldLmVtcGxhY2UoCi0gICAgICAgICAgICAgICAgR2V0RGVwZW5kZW5jaWVzKE1ha2VDYW5vbmljYWwoaXRfbW9kKSlbMF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKCFtb2Rfd2l0aF9kZXBzLmVtcHR5KCkgJiYgIGNvdW50ICE9IG1vZHVsZV9sb2FkZWRfLnNpemUoKSkgeworICAgIHdoaWxlICghbW9kX3dpdGhfZGVwcy5lbXB0eSgpKSB7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkPiB0aHJlYWRzOwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kc19wYXRoX3RvX2xvYWQ7CiAgICAgICAgIHN0ZDo6bXV0ZXggdmVjdG9yX2xvY2s7Ci0gICAgICAgIGNvdW50ID0gbW9kdWxlX2xvYWRlZF8uc2l6ZSgpOwogCiAgICAgICAgIC8vIEZpbmQgaW5kZXBlbmRlbnQgbW9kdWxlcwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIFtpdF9tb2QsIGl0X2RlcF0gOiBtb2Rfd2l0aF9kZXBzKSB7Ci0gICAgICAgICAgICBpZiAoaXRfZGVwLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHVsZV9vcHRpb25zX1tpdF9tb2RdLmZpbmQoImxvYWRfc2VxdWVudGlhbD0xIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFMb2FkV2l0aEFsaWFzZXMoaXRfbW9kLCB0cnVlKSAmJiAhSXNCbG9ja2xpc3RlZChpdF9tb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kc19wYXRoX3RvX2xvYWQuZW1wbGFjZV9iYWNrKGl0X21vZCk7CisgICAgICAgICAgICBhdXRvIGl0ZF9sYXN0ID0gaXRfZGVwLnJiZWdpbigpOworICAgICAgICAgICAgaWYgKGl0ZF9sYXN0ID09IGl0X2RlcC5yZW5kKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGF1dG8gY25kX2xhc3QgPSBNYWtlQ2Fub25pY2FsKCppdGRfbGFzdCk7CisgICAgICAgICAgICAvLyBIYXJkLWRlcGVuZGVuY2llcyBjYW5ub3QgYmUgYmxvY2tsaXN0ZWQKKyAgICAgICAgICAgIGlmIChJc0Jsb2NrbGlzdGVkKGNuZF9sYXN0KSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkxNUDogQmxvY2tsaXN0OiBNb2R1bGUtZGVwICIgPDwgY25kX2xhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOiBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgIiA8PCBpdF9tb2Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobW9kdWxlX29wdGlvbnNfW2NuZF9sYXN0XS5maW5kKCJsb2FkX3NlcXVlbnRpYWw9MSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgaWYgKCFMb2FkV2l0aEFsaWFzZXMoY25kX2xhc3QsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobW9kc19wYXRoX3RvX2xvYWQuYmVnaW4oKSwgbW9kc19wYXRoX3RvX2xvYWQuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25kX2xhc3QpID09IG1vZHNfcGF0aF90b19sb2FkLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZHNfcGF0aF90b19sb2FkLmVtcGxhY2VfYmFjayhjbmRfbGFzdCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDIsNyArNTA3LDcgQEAKICAgICAgICAgICAgICAgICBsay51bmxvY2soKTsKICAgICAgICAgICAgICAgICByZXRfbG9hZCAmPSBMb2FkV2l0aEFsaWFzZXMobW9kX3RvX2xvYWQsIHRydWUpOwogICAgICAgICAgICAgICAgIGxrLmxvY2soKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJldF9sb2FkICYmICFJc0Jsb2NrbGlzdGVkKG1vZF90b19sb2FkKSkgeworICAgICAgICAgICAgICAgIGlmICghcmV0X2xvYWQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0ICY9IHJldF9sb2FkOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTUyMCwxNCArNTI1LDE2IEBACiAKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGd1YXJkKG1vZHVsZV9sb2FkZWRfbG9ja18pOwogICAgICAgICAvLyBSZW1vdmUgbG9hZGVkIG1vZHVsZSBmb3JtIG1vZF93aXRoX2RlcHMgYW5kIHNvZnQgZGVwZW5kZW5jaWVzIG9mIG90aGVyIG1vZHVsZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGVfbG9hZGVkIDogbW9kdWxlX2xvYWRlZF8pIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGVfbG9hZGVkIDogbW9kdWxlX2xvYWRlZF8pCiAgICAgICAgICAgICBtb2Rfd2l0aF9kZXBzLmVyYXNlKG1vZHVsZV9sb2FkZWQpOwotICAgICAgICB9CiAKICAgICAgICAgLy8gUmVtb3ZlIGxvYWRlZCBtb2R1bGUgZm9ybSBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIgbW9kdWxlcyB3aGljaCBhcmUgbm90IGxvYWRlZCB5ZXQKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGVfbG9hZGVkX3BhdGggOiBtb2R1bGVfbG9hZGVkX3BhdGhzXykgewogICAgICAgICAgICAgZm9yIChhdXRvJiBbbW9kLCBkZXBzXSA6IG1vZF93aXRoX2RlcHMpIHsKLSAgICAgICAgICAgICAgICBkZXBzLmVyYXNlKG1vZHVsZV9sb2FkZWRfcGF0aCk7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChkZXBzLmJlZ2luKCksIGRlcHMuZW5kKCksIG1vZHVsZV9sb2FkZWRfcGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ICE9IGRlcHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwcy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGlibW9kcHJvYmUvbGlibW9kcHJvYmVfZXh0LmNwcCBiL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlX2V4dC5jcHAKaW5kZXggOTRhMWRjNC4uYzQ1MTllMyAxMDA2NDQKLS0tIGEvbGlibW9kcHJvYmUvbGlibW9kcHJvYmVfZXh0LmNwcAorKysgYi9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZV9leHQuY3BwCkBAIC04NCw3ICs4NCw3IEBACiB9CiAKIGJvb2wgTW9kcHJvYmU6Ok1vZHVsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX25hbWUpIHsKLSAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdDsKKyAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdCB7fTsKICAgICBpZiAoYmxvY2tsaXN0X2VuYWJsZWQgJiYgbW9kdWxlX2Jsb2NrbGlzdF8uY291bnQobW9kdWxlX25hbWUpKSB7CiAgICAgICAgIExPRyhJTkZPKSA8PCAibW9kdWxlICIgPDwgbW9kdWxlX25hbWUgPDwgIiBpcyBibG9ja2xpc3RlZCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoc3RhdChkZXBzLmZyb250KCkuY19zdHIoKSwgJmZpbGVTdGF0KSkgewotICAgICAgICBMT0coSU5GTykgPDwgIm1vZHVsZSAiIDw8IG1vZHVsZV9uYW1lIDw8ICIgZG9lcyBub3QgZXhpc3QiOworICAgICAgICBQTE9HKElORk8pIDw8ICJtb2R1bGUgIiA8PCBtb2R1bGVfbmFtZSA8PCAiIGNhbid0IGJlIGxvYWRlZDsgY2FuJ3QgYWNjZXNzICIgPDwgZGVwcy5mcm9udCgpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghU19JU1JFRyhmaWxlU3RhdC5zdF9tb2RlKSkgewpkaWZmIC0tZ2l0IGEvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmMgYi9saWJuZXR1dGlscy9pZmNfdXRpbHMuYwppbmRleCA1OTk5ZTM5Li43Y2NhMTA1IDEwMDY0NAotLS0gYS9saWJuZXR1dGlscy9pZmNfdXRpbHMuYworKysgYi9saWJuZXR1dGlscy9pZmNfdXRpbHMuYwpAQCAtMzYyLDE0ICszNjIsMTkgQEAKICAgICByZXR1cm4gZXJyLT5lcnJvcjsKIH0KIAorLy8gUGFzcyBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgcHJlZml4IGxlbmd0aCB0byBkaXNhYmxlIERBRCwgaWUuIHVzZSB+NjQgaW5zdGVhZCBvZiA2NC4KIC8vIFJldHVybnMgemVybyBvbiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgogaW50IGlmY19hZGRfYWRkcmVzcyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphZGRyZXNzLCBpbnQgcHJlZml4bGVuKSB7Ci0gICAgcmV0dXJuIGlmY19hY3Rfb25fYWRkcmVzcyhSVE1fTkVXQUREUiwgbmFtZSwgYWRkcmVzcywgcHJlZml4bGVuLCAvKm5vZGFkKi8gZmFsc2UpOworICAgIGJvb2wgbm9kYWQgPSAocHJlZml4bGVuIDwgMCk7CisgICAgaWYgKG5vZGFkKSBwcmVmaXhsZW4gPSB+cHJlZml4bGVuOworICAgIHJldHVybiBpZmNfYWN0X29uX2FkZHJlc3MoUlRNX05FV0FERFIsIG5hbWUsIGFkZHJlc3MsIHByZWZpeGxlbiwgbm9kYWQpOwogfQogCiAvLyBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KIGludCBpZmNfZGVsX2FkZHJlc3MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGFkZHJlc3MsIGludCBwcmVmaXhsZW4pIHsKLSAgICByZXR1cm4gaWZjX2FjdF9vbl9hZGRyZXNzKFJUTV9ERUxBRERSLCBuYW1lLCBhZGRyZXNzLCBwcmVmaXhsZW4sIC8qbm9kYWQqLyBmYWxzZSk7CisgICAgYm9vbCBub2RhZCA9IChwcmVmaXhsZW4gPCAwKTsKKyAgICBpZiAobm9kYWQpIHByZWZpeGxlbiA9IH5wcmVmaXhsZW47CisgICAgcmV0dXJuIGlmY19hY3Rfb25fYWRkcmVzcyhSVE1fREVMQUREUiwgbmFtZSwgYWRkcmVzcywgcHJlZml4bGVuLCBub2RhZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmggYi9saWJwcm9jZXNzZ3JvdXAvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmgKaW5kZXggZGJhZWI5My4uY2E2ODY4YyAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL2luY2x1ZGUvcHJvY2Vzc2dyb3VwL3Byb2Nlc3Nncm91cC5oCisrKyBiL2xpYnByb2Nlc3Nncm91cC9pbmNsdWRlL3Byb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuaApAQCAtMjYsNyArMjYsOCBAQAogCiBfX0JFR0lOX0RFQ0xTCiAKLXN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogQ0dST1VQVjJfQ09OVFJPTExFUl9OQU1FID0gImNncm91cDIiOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBDR1JPVVBWMl9ISUVSQVJDSFlfTkFNRSA9ICJjZ3JvdXAyIjsKK1tbZGVwcmVjYXRlZF1dIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogQ0dST1VQVjJfQ09OVFJPTExFUl9OQU1FID0gImNncm91cDIiOwogCiBib29sIENncm91cHNBdmFpbGFibGUoKTsKIGJvb2wgQ2dyb3VwR2V0Q29udHJvbGxlclBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGNncm91cF9uYW1lLCBzdGQ6OnN0cmluZyogcGF0aCk7CkBAIC02NCwyMiArNjUsMTkgQEAKIC8vIHNob3VsZCBiZSBhY3RpdmUgYWdhaW4uIEUuZy4gWnlnb3RlIHNwZWNpYWxpemF0aW9uIGZvciBjaGlsZCBwcm9jZXNzLgogdm9pZCBEcm9wVGFza1Byb2ZpbGVzUmVzb3VyY2VDYWNoaW5nKCk7CiAKLS8vIFJldHVybiAwIGFuZCByZW1vdmVzIHRoZSBjZ3JvdXAgaWYgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgcHJvY2Vzc2VzIGluIGl0LgotLy8gUmV0dXJucyAtMSBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvciBvY2N1cnJpbmcgb3IgaWYgdGhlcmUgYXJlIHByb2Nlc3NlcyBzdGlsbCBydW5uaW5nCi0vLyBldmVuIGFmdGVyIHJldHJ5aW5nIGZvciB1cCB0byAyMDBtcy4KLS8vIElmIG1heF9wcm9jZXNzZXMgaXMgbm90IG51bGxwdHIsIGl0IHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2Nlc3NlcyBzZWVuIGluIHRoZSBjZ3JvdXAKLS8vIGR1cmluZyB0aGUga2lsbGluZyBwcm9jZXNzLiAgTm90ZSB0aGF0IHRoaXMgY2FuIGJlIDAgaWYgYWxsIHByb2Nlc3NlcyBmcm9tIHRoZSBwcm9jZXNzIGdyb3VwIGhhdmUKLS8vIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkLgotaW50IGtpbGxQcm9jZXNzR3JvdXAodWlkX3QgdWlkLCBpbnQgaW5pdGlhbFBpZCwgaW50IHNpZ25hbCwgaW50KiBtYXhfcHJvY2Vzc2VzID0gbnVsbHB0cik7CisvLyBSZXR1cm4gMCBpZiBhbGwgcHJvY2Vzc2VzIHdlcmUga2lsbGVkIGFuZCB0aGUgY2dyb3VwIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KKy8vIFJldHVybnMgLTEgaW4gdGhlIGNhc2Ugb2YgYW4gZXJyb3Igb2NjdXJyaW5nIG9yIGlmIHRoZXJlIGFyZSBwcm9jZXNzZXMgc3RpbGwgcnVubmluZy4KK2ludCBraWxsUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwpOwogCiAvLyBSZXR1cm5zIHRoZSBzYW1lIGFzIGtpbGxQcm9jZXNzR3JvdXAoKSwgaG93ZXZlciBpdCBkb2VzIG5vdCByZXRyeSwgd2hpY2ggbWVhbnMKIC8vIHRoYXQgaXQgb25seSByZXR1cm5zIDAgaW4gdGhlIGNhc2UgdGhhdCB0aGUgY2dyb3VwIGV4aXN0cyBhbmQgaXQgY29udGFpbnMgbm8gcHJvY2Vzc2VzLgotaW50IGtpbGxQcm9jZXNzR3JvdXBPbmNlKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwsIGludCogbWF4X3Byb2Nlc3NlcyA9IG51bGxwdHIpOworaW50IGtpbGxQcm9jZXNzR3JvdXBPbmNlKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwpOwogCiAvLyBTZW5kcyB0aGUgcHJvdmlkZWQgc2lnbmFsIHRvIGFsbCBtZW1iZXJzIG9mIGEgcHJvY2VzcyBncm91cCwgYnV0IGRvZXMgbm90IHdhaXQgZm9yIHByb2Nlc3NlcyB0bwogLy8gZXhpdCwgb3IgZm9yIHRoZSBjZ3JvdXAgdG8gYmUgcmVtb3ZlZC4gQ2FsbGVycyBzaG91bGQgYWxzbyBlbnN1cmUgdGhhdCBraWxsUHJvY2Vzc0dyb3VwIGlzIGNhbGxlZAotLy8gbGF0ZXIgdG8gZW5zdXJlIHRoZSBjZ3JvdXAgaXMgZnVsbHkgcmVtb3ZlZCwgb3RoZXJ3aXNlIHN5c3RlbSByZXNvdXJjZXMgbWF5IGxlYWsuCi1pbnQgc2VuZFNpZ25hbFRvUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwpOworLy8gbGF0ZXIgdG8gZW5zdXJlIHRoZSBjZ3JvdXAgaXMgZnVsbHkgcmVtb3ZlZCwgb3RoZXJ3aXNlIHN5c3RlbSByZXNvdXJjZXMgd2lsbCBsZWFrLgorLy8gUmV0dXJucyB0cnVlIGlmIG5vIGVycm9ycyBhcmUgZW5jb3VudGVyZWQgc2VuZGluZyBzaWduYWxzLCBvdGhlcndpc2UgZmFsc2UuCitib29sIHNlbmRTaWduYWxUb1Byb2Nlc3NHcm91cCh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsKTsKIAogaW50IGNyZWF0ZVByb2Nlc3NHcm91cCh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBib29sIG1lbUNvbnRyb2wgPSBmYWxzZSk7CiAKQEAgLTg5LDcgKzg3LDYgQEAKIGJvb2wgc2V0UHJvY2Vzc0dyb3VwU29mdExpbWl0KHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludDY0X3Qgc29mdExpbWl0SW5CeXRlcyk7CiBib29sIHNldFByb2Nlc3NHcm91cExpbWl0KHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludDY0X3QgbGltaXRJbkJ5dGVzKTsKIAotdm9pZCByZW1vdmVBbGxQcm9jZXNzR3JvdXBzKHZvaWQpOwogdm9pZCByZW1vdmVBbGxFbXB0eVByb2Nlc3NHcm91cHModm9pZCk7CiAKIC8vIFByb3ZpZGVzIHRoZSBwYXRoIGZvciBhbiBhdHRyaWJ1dGUgaW4gYSBzcGVjaWZpYyBwcm9jZXNzIGdyb3VwCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmNwcCBiL2xpYnByb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuY3BwCmluZGV4IDIzNGI3OTMuLjMyMDlhZGYgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuY3BwCisrKyBiL2xpYnByb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cG9sbC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG11dGV4PgpAQCAtNTMsNyArNTUsOSBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CiAKLSNkZWZpbmUgUFJPQ0VTU0dST1VQX0NHUk9VUF9QUk9DU19GSUxFICIvY2dyb3VwLnByb2NzIgorI2RlZmluZSBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEUgImNncm91cC5wcm9jcyIKKyNkZWZpbmUgUFJPQ0VTU0dST1VQX0NHUk9VUF9LSUxMX0ZJTEUgImNncm91cC5raWxsIgorI2RlZmluZSBQUk9DRVNTR1JPVVBfQ0dST1VQX0VWRU5UU19GSUxFICJjZ3JvdXAuZXZlbnRzIgogCiBib29sIENncm91cHNBdmFpbGFibGUoKSB7CiAgICAgc3RhdGljIGJvb2wgY2dyb3Vwc19hdmFpbGFibGUgPSBhY2Nlc3MoIi9wcm9jL2Nncm91cHMiLCBGX09LKSA9PSAwOwpAQCAtNzQsNiArNzgsMjkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIHN0ZDo6c3RyaW5nIENvbnZlcnRVaWRUb1BhdGgoY29uc3QgY2hhciogY2dyb3VwLCB1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCIlcy91aWRfJXUiLCBjZ3JvdXAsIHVpZCk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBDb252ZXJ0VWlkUGlkVG9QYXRoKGNvbnN0IGNoYXIqIGNncm91cCwgdWlkX3QgdWlkLCBpbnQgcGlkKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJXMvdWlkXyV1L3BpZF8lZCIsIGNncm91cCwgdWlkLCBwaWQpOworfQorCitzdGF0aWMgYm9vbCBDZ3JvdXBLaWxsQXZhaWxhYmxlKCkgeworICAgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBmOworICAgIHN0YXRpYyBib29sIGNncm91cF9raWxsX2F2YWlsYWJsZSA9IGZhbHNlOworICAgIHN0ZDo6Y2FsbF9vbmNlKGYsIFtdKCkgeworICAgICAgICBzdGQ6OnN0cmluZyBjZ19raWxsOworICAgICAgICBDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9ISUVSQVJDSFlfTkFNRSwgJmNnX2tpbGwpOworICAgICAgICAvLyBjZ3JvdXAua2lsbCBpcyBub3Qgb24gdGhlIHJvb3QgY2dyb3VwLCBzbyBjaGVjayBhIG5vbi1yb290IGNncm91cCB0aGF0IHNob3VsZCBhbHdheXMKKyAgICAgICAgLy8gZXhpc3QKKyAgICAgICAgY2dfa2lsbCA9IENvbnZlcnRVaWRUb1BhdGgoY2dfa2lsbC5jX3N0cigpLCBBSURfUk9PVCkgKyAnLycgKyBQUk9DRVNTR1JPVVBfQ0dST1VQX0tJTExfRklMRTsKKyAgICAgICAgY2dyb3VwX2tpbGxfYXZhaWxhYmxlID0gYWNjZXNzKGNnX2tpbGwuY19zdHIoKSwgRl9PSykgPT0gMDsKKyAgICB9KTsKKworICAgIHJldHVybiBjZ3JvdXBfa2lsbF9hdmFpbGFibGU7Cit9CisKIHN0YXRpYyBib29sIENncm91cEdldE1lbWNnQXBwc1BhdGgoc3RkOjpzdHJpbmcqIHBhdGgpIHsKICAgICBDZ3JvdXBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBDZ3JvdXBNYXA6OkdldEluc3RhbmNlKCkuRmluZENvbnRyb2xsZXIoIm1lbW9yeSIpOwogCkBAIC0xMjksNyArMTU2LDcgQEAKICAgICB9CiAKICAgICBpZiAoIWF0dHItPkdldFBhdGhGb3JUYXNrKHRpZCwgcGF0aCkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmaW5kIGNncm91cCBmb3IgdGlkICIgPDwgdGlkOworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmluZCBjZ3JvdXAgZm9yIHRpZCAiIDw8IHRpZDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMjA1LDI5ICsyMzIsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiB9CiAKLXN0YXRpYyBzdGQ6OnN0cmluZyBDb252ZXJ0VWlkVG9QYXRoKGNvbnN0IGNoYXIqIGNncm91cCwgdWlkX3QgdWlkKSB7Ci0gICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJXMvdWlkXyVkIiwgY2dyb3VwLCB1aWQpOwotfQorc3RhdGljIGludCBSZW1vdmVDZ3JvdXAoY29uc3QgY2hhciogY2dyb3VwLCB1aWRfdCB1aWQsIGludCBwaWQpIHsKKyAgICBhdXRvIHBhdGggPSBDb252ZXJ0VWlkUGlkVG9QYXRoKGNncm91cCwgdWlkLCBwaWQpOworICAgIGludCByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkocm1kaXIocGF0aC5jX3N0cigpKSk7CiAKLXN0YXRpYyBzdGQ6OnN0cmluZyBDb252ZXJ0VWlkUGlkVG9QYXRoKGNvbnN0IGNoYXIqIGNncm91cCwgdWlkX3QgdWlkLCBpbnQgcGlkKSB7Ci0gICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJXMvdWlkXyVkL3BpZF8lZCIsIGNncm91cCwgdWlkLCBwaWQpOwotfQorICAgIGlmICghcmV0ICYmIHVpZCA+PSBBSURfSVNPTEFURURfU1RBUlQgJiYgdWlkIDw9IEFJRF9JU09MQVRFRF9FTkQpIHsKKyAgICAgICAgLy8gSXNvbGF0ZWQgVUlEcyBhcmUgdW5saWtlbHkgdG8gYmUgcmV1c2VkIHNvb24gYWZ0ZXIgcmVtb3ZhbCwKKyAgICAgICAgLy8gc28gZnJlZSB1cCB0aGUga2VybmVsIHJlc291cmNlcyBmb3IgdGhlIFVJRCBsZXZlbCBjZ3JvdXAuCisgICAgICAgIHBhdGggPSBDb252ZXJ0VWlkVG9QYXRoKGNncm91cCwgdWlkKTsKKyAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJtZGlyKHBhdGguY19zdHIoKSkpOworICAgIH0KIAotc3RhdGljIGludCBSZW1vdmVQcm9jZXNzR3JvdXAoY29uc3QgY2hhciogY2dyb3VwLCB1aWRfdCB1aWQsIGludCBwaWQsIHVuc2lnbmVkIGludCByZXRyaWVzKSB7Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgYXV0byB1aWRfcGlkX3BhdGggPSBDb252ZXJ0VWlkUGlkVG9QYXRoKGNncm91cCwgdWlkLCBwaWQpOwotICAgIGF1dG8gdWlkX3BhdGggPSBDb252ZXJ0VWlkVG9QYXRoKGNncm91cCwgdWlkKTsKLQotICAgIHdoaWxlIChyZXRyaWVzLS0pIHsKLSAgICAgICAgcmV0ID0gcm1kaXIodWlkX3BpZF9wYXRoLmNfc3RyKCkpOwotICAgICAgICBpZiAoIXJldCB8fCBlcnJubyAhPSBFQlVTWSkgYnJlYWs7Ci0gICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig1bXMpOworICAgIGlmIChyZXQgPCAwICYmIGVycm5vID09IEVOT0VOVCkgeworICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGlkZW1wb2V0ZW50LCBidXQgc3RpbGwgd2FybiBoZXJlLgorICAgICAgICBMT0coV0FSTklORykgPDwgIlJlbW92ZUNncm91cDogIiA8PCBwYXRoIDw8ICIgZG9lcyBub3QgZXhpc3QuIjsKKyAgICAgICAgcmV0ID0gMDsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgYm9vbCBSZW1vdmVVaWRQcm9jZXNzR3JvdXBzKGNvbnN0IHN0ZDo6c3RyaW5nJiB1aWRfcGF0aCwgYm9vbCBlbXB0eV9vbmx5KSB7CitzdGF0aWMgYm9vbCBSZW1vdmVFbXB0eVVpZENncm91cHMoY29uc3Qgc3RkOjpzdHJpbmcmIHVpZF9wYXRoKSB7CiAgICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgZGVjbHR5cGUoJmNsb3NlZGlyKT4gdWlkKG9wZW5kaXIodWlkX3BhdGguY19zdHIoKSksIGNsb3NlZGlyKTsKICAgICBib29sIGVtcHR5ID0gdHJ1ZTsKICAgICBpZiAodWlkICE9IE5VTEwpIHsKQEAgLTI0MiwyMSArMjY3LDYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYXV0byBwYXRoID0gU3RyaW5nUHJpbnRmKCIlcy8lcyIsIHVpZF9wYXRoLmNfc3RyKCksIGRpci0+ZF9uYW1lKTsKLSAgICAgICAgICAgIGlmIChlbXB0eV9vbmx5KSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgICAgICAgICAgICAgYXV0byBwcm9jc19maWxlID0gU3RyaW5nUHJpbnRmKCIlcy8lcyIsIHBhdGguY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0dST1VQX0NHUk9VUF9QUk9DU19GSUxFKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdChwcm9jc19maWxlLmNfc3RyKCksICZzdCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgc3RhdHMgZm9yICIgPDwgcHJvY3NfZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdC5zdF9zaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBza2lwIG5vbi1lbXB0eSBncm91cHMKLSAgICAgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJTa2lwcGluZyBub24tZW1wdHkgZ3JvdXAgIiA8PCBwYXRoOwotICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIlJlbW92aW5nICIgPDwgcGF0aDsKICAgICAgICAgICAgIGlmIChybWRpcihwYXRoLmNfc3RyKCkpID09IC0xKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVCVVNZKSB7CkBAIC0yNjksMTEgKzI3OSwxMyBAQAogICAgIHJldHVybiBlbXB0eTsKIH0KIAotdm9pZCByZW1vdmVBbGxQcm9jZXNzR3JvdXBzSW50ZXJuYWwoYm9vbCBlbXB0eV9vbmx5KSB7Cit2b2lkIHJlbW92ZUFsbEVtcHR5UHJvY2Vzc0dyb3VwcygpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgInJlbW92ZUFsbEVtcHR5UHJvY2Vzc0dyb3VwcygpIjsKKwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjZ3JvdXBzOwogICAgIHN0ZDo6c3RyaW5nIHBhdGgsIG1lbWNnX2FwcHNfcGF0aDsKIAotICAgIGlmIChDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9DT05UUk9MTEVSX05BTUUsICZwYXRoKSkgeworICAgIGlmIChDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9ISUVSQVJDSFlfTkFNRSwgJnBhdGgpKSB7CiAgICAgICAgIGNncm91cHMucHVzaF9iYWNrKHBhdGgpOwogICAgIH0KICAgICBpZiAoQ2dyb3VwR2V0TWVtY2dBcHBzUGF0aCgmbWVtY2dfYXBwc19wYXRoKSAmJiBtZW1jZ19hcHBzX3BhdGggIT0gcGF0aCkgewpAQCAtMjk2LDcgKzMwOCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYXV0byBwYXRoID0gU3RyaW5nUHJpbnRmKCIlcy8lcyIsIGNncm91cF9yb290X3BhdGguY19zdHIoKSwgZGlyLT5kX25hbWUpOwotICAgICAgICAgICAgICAgIGlmICghUmVtb3ZlVWlkUHJvY2Vzc0dyb3VwcyhwYXRoLCBlbXB0eV9vbmx5KSkgeworICAgICAgICAgICAgICAgIGlmICghUmVtb3ZlRW1wdHlVaWRDZ3JvdXBzKHBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiU2tpcCByZW1vdmluZyAiIDw8IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTMwOSwxNiArMzIxLDYgQEAKICAgICB9CiB9CiAKLXZvaWQgcmVtb3ZlQWxsUHJvY2Vzc0dyb3VwcygpIHsKLSAgICBMT0coVkVSQk9TRSkgPDwgInJlbW92ZUFsbFByb2Nlc3NHcm91cHMoKSI7Ci0gICAgcmVtb3ZlQWxsUHJvY2Vzc0dyb3Vwc0ludGVybmFsKGZhbHNlKTsKLX0KLQotdm9pZCByZW1vdmVBbGxFbXB0eVByb2Nlc3NHcm91cHMoKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJyZW1vdmVBbGxFbXB0eVByb2Nlc3NHcm91cHMoKSI7Ci0gICAgcmVtb3ZlQWxsUHJvY2Vzc0dyb3Vwc0ludGVybmFsKHRydWUpOwotfQotCiAvKioKICAqIFByb2Nlc3MgZ3JvdXBzIGFyZSBwcmltYXJpbHkgY3JlYXRlZCBieSB0aGUgWnlnb3RlLCBtZWFuaW5nIHRoYXQgdWlkL3BpZCBncm91cHMgYXJlIGNyZWF0ZWQgYnkKICAqIHRoZSB1c2VyIHJvb3QuIE93bmVyc2hpcCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgY2dyb3VwIGFuZCBhbGwgb2YgaXRzIGZpbGVzIG11c3QgdGh1cyBiZQpAQCAtMzY4LDM1ICszNzAsNTUgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLS8vIFJldHVybnMgbnVtYmVyIG9mIHByb2Nlc3NlcyBraWxsZWQgb24gc3VjY2VzcwotLy8gUmV0dXJucyAwIGlmIHRoZXJlIGFyZSBubyBwcm9jZXNzZXMgaW4gdGhlIHByb2Nlc3MgY2dyb3VwIGxlZnQgdG8ga2lsbAotLy8gUmV0dXJucyAtMSBvbiBlcnJvcgotc3RhdGljIGludCBEb0tpbGxQcm9jZXNzR3JvdXBPbmNlKGNvbnN0IGNoYXIqIGNncm91cCwgdWlkX3QgdWlkLCBpbnQgaW5pdGlhbFBpZCwgaW50IHNpZ25hbCkgewotICAgIC8vIFdlIHNlcGFyYXRlIGFsbCBvZiB0aGUgcGlkcyBpbiB0aGUgY2dyb3VwIGludG8gdGhvc2UgcGlkcyB0aGF0IGFyZSBhbHNvIHRoZSBsZWFkZXJzIG9mCi0gICAgLy8gcHJvY2VzcyBncm91cHMgKHN0b3JlZCBpbiB0aGUgcGdpZHMgc2V0KSBhbmQgdGhvc2UgdGhhdCBhcmUgbm90IChzdG9yZWQgaW4gdGhlIHBpZHMgc2V0KS4KLSAgICBzdGQ6OnNldDxwaWRfdD4gcGdpZHM7Ci0gICAgcGdpZHMuZW1wbGFjZShpbml0aWFsUGlkKTsKLSAgICBzdGQ6OnNldDxwaWRfdD4gcGlkczsKLSAgICBpbnQgcHJvY2Vzc2VzID0gMDsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gZmQobnVsbHB0ciwgZmNsb3NlKTsKK2Jvb2wgc2VuZFNpZ25hbFRvUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwpIHsKKyAgICBzdGQ6OnNldDxwaWRfdD4gcGdpZHMsIHBpZHM7CiAKICAgICBpZiAoQ2dyb3Vwc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgIGF1dG8gcGF0aCA9IENvbnZlcnRVaWRQaWRUb1BhdGgoY2dyb3VwLCB1aWQsIGluaXRpYWxQaWQpICsgUFJPQ0VTU0dST1VQX0NHUk9VUF9QUk9DU19GSUxFOwotICAgICAgICBmZC5yZXNldChmb3BlbihwYXRoLmNfc3RyKCksICJyZSIpKTsKLSAgICAgICAgaWYgKCFmZCkgewotICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHByb2Nlc3MgaXMgYWxyZWFkeSBkZWFkCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0ZDo6c3RyaW5nIGhpZXJhcmNoeV9yb290X3BhdGgsIGNncm91cF92Ml9wYXRoOworICAgICAgICBDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9ISUVSQVJDSFlfTkFNRSwgJmhpZXJhcmNoeV9yb290X3BhdGgpOworICAgICAgICBjZ3JvdXBfdjJfcGF0aCA9IENvbnZlcnRVaWRQaWRUb1BhdGgoaGllcmFyY2h5X3Jvb3RfcGF0aC5jX3N0cigpLCB1aWQsIGluaXRpYWxQaWQpOworCisgICAgICAgIGlmIChzaWduYWwgPT0gU0lHS0lMTCAmJiBDZ3JvdXBLaWxsQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiVXNpbmcgIiA8PCBQUk9DRVNTR1JPVVBfQ0dST1VQX0tJTExfRklMRSA8PCAiIHRvIFNJR0tJTEwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGNncm91cF92Ml9wYXRoOworCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGtpbGwgdGhlIHByb2Nlc3MgZ3JvdXAgaW4gYWRkaXRpb24gdG8gdGhlIGNncm91cC4gRm9yIG5vcm1hbCBhcHBzIHRoZXkKKyAgICAgICAgICAgIC8vIHNob3VsZCBjb21wbGV0ZWx5IG92ZXJsYXAsIGJ1dCBzeXN0ZW1fc2VydmVyIGtpbGxzIGRlcGVuZCBvbiBwcm9jZXNzIGdyb3VwIGtpbGxzIHRvCisgICAgICAgICAgICAvLyB0YWtlIGRvd24gYXBwcyB3aGljaCBhcmUgaW4gdGhlaXIgb3duIGNncm91cHMgYW5kIG5vdCBpbmRpdmlkdWFsbHkgdGFyZ2V0ZWQuCisgICAgICAgICAgICBpZiAoa2lsbCgtaW5pdGlhbFBpZCwgc2lnbmFsKSA9PSAtMSAmJiBlcnJubyAhPSBFU1JDSCkgeworICAgICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgImtpbGwoIiA8PCAtaW5pdGlhbFBpZCA8PCAiLCAiIDw8IHNpZ25hbCA8PCAiKSBmYWlsZWQiOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCBfX2Z1bmNfXyA8PCAiIGZhaWxlZCB0byBvcGVuIHByb2Nlc3MgY2dyb3VwIHVpZCAiIDw8IHVpZCA8PCAiIHBpZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluaXRpYWxQaWQ7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtpbGxmaWxlcGF0aCA9IGNncm91cF92Ml9wYXRoICsgJy8nICsgUFJPQ0VTU0dST1VQX0NHUk9VUF9LSUxMX0ZJTEU7CisgICAgICAgICAgICBpZiAoV3JpdGVTdHJpbmdUb0ZpbGUoIjEiLCBraWxsZmlsZXBhdGgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd3JpdGUgMSB0byAiIDw8IGtpbGxmaWxlcGF0aDsKKyAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBjZ3JvdXAucHJvY3MgYmVsb3cKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIFNpbmNlIGNncm91cC5raWxsIG9ubHkgc2VuZHMgU0lHS0lMTHMsIHdlIHJlYWQgY2dyb3VwLnByb2NzIHRvIGZpbmQgZWFjaCBwcm9jZXNzIHRvCisgICAgICAgIC8vIHNpZ25hbCBpbmRpdmlkdWFsbHkuIFRoaXMgaXMgbW9yZSBjb3N0bHkgdGhhbiB1c2luZyBjZ3JvdXAua2lsbCBmb3IgU0lHS0lMTHMuCisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiVXNpbmcgIiA8PCBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEUgPDwgIiB0byBzaWduYWwgKCIgPDwgc2lnbmFsCisgICAgICAgICAgICAgICAgICAgICA8PCAiKSAiIDw8IGNncm91cF92Ml9wYXRoOworCisgICAgICAgIC8vIFdlIHNlcGFyYXRlIGFsbCBvZiB0aGUgcGlkcyBpbiB0aGUgY2dyb3VwIGludG8gdGhvc2UgcGlkcyB0aGF0IGFyZSBhbHNvIHRoZSBsZWFkZXJzIG9mCisgICAgICAgIC8vIHByb2Nlc3MgZ3JvdXBzIChzdG9yZWQgaW4gdGhlIHBnaWRzIHNldCkgYW5kIHRob3NlIHRoYXQgYXJlIG5vdCAoc3RvcmVkIGluIHRoZSBwaWRzIHNldCkuCisgICAgICAgIGNvbnN0IGF1dG8gcHJvY3NmaWxlcGF0aCA9IGNncm91cF92Ml9wYXRoICsgJy8nICsgUFJPQ0VTU0dST1VQX0NHUk9VUF9QUk9DU19GSUxFOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGZwKGZvcGVuKHByb2NzZmlsZXBhdGguY19zdHIoKSwgInJlIiksIGZjbG9zZSk7CisgICAgICAgIGlmICghZnApIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBjZ3JvdXAgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIHdpdGggYSBzdWNjZXNzZnVsIGNhbGwKKyAgICAgICAgICAgIC8vIHRvIGtpbGxQcm9jZXNzR3JvdXAuIENhbGxlcnMgc2hvdWxkIG9ubHkgcmV0cnkgc2VuZFNpZ25hbFRvUHJvY2Vzc0dyb3VwIG9yCisgICAgICAgICAgICAvLyBraWxsUHJvY2Vzc0dyb3VwIGNhbGxzIGlmIHRoZXkgZmFpbCB3aXRob3V0IEVOT0VOVC4KKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IHByb2NzZmlsZXBhdGg7CisgICAgICAgICAgICBraWxsKC1pbml0aWFsUGlkLCBzaWduYWwpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgcGlkX3QgcGlkOwogICAgICAgICBib29sIGZpbGVfaXNfZW1wdHkgPSB0cnVlOwotICAgICAgICB3aGlsZSAoZnNjYW5mKGZkLmdldCgpLCAiJWRcbiIsICZwaWQpID09IDEgJiYgcGlkID49IDApIHsKLSAgICAgICAgICAgIHByb2Nlc3NlcysrOworICAgICAgICB3aGlsZSAoZnNjYW5mKGZwLmdldCgpLCAiJWRcbiIsICZwaWQpID09IDEgJiYgcGlkID49IDApIHsKICAgICAgICAgICAgIGZpbGVfaXNfZW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChwaWQgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4uLi4gIGJ1dCBpZiBpdCBkb2VzLCB0cnlpbmcgdG8ga2lsbCB0aGlzCkBAIC00MjYsNiArNDQ4LDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHBnaWRzLmVtcGxhY2UoaW5pdGlhbFBpZCk7CisKICAgICAvLyBLaWxsIGFsbCBwcm9jZXNzIGdyb3Vwcy4KICAgICBmb3IgKGNvbnN0IGF1dG8gcGdpZCA6IHBnaWRzKSB7CiAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiS2lsbGluZyBwcm9jZXNzIGdyb3VwICIgPDwgLXBnaWQgPDwgIiBpbiB1aWQgIiA8PCB1aWQKQEAgLTQ0NiwxMDkgKzQ3MCwxNzQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAoIWZkIHx8IGZlb2YoZmQuZ2V0KCkpKSA/IHByb2Nlc3NlcyA6IC0xOworICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IEtpbGxQcm9jZXNzR3JvdXAodWlkX3QgdWlkLCBpbnQgaW5pdGlhbFBpZCwgaW50IHNpZ25hbCwgaW50IHJldHJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtYXhfcHJvY2Vzc2VzKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRvTWlsbGlzZWMoVCYmIGR1cmF0aW9uKSB7CisgICAgcmV0dXJuIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KGR1cmF0aW9uKTsKK30KKworZW51bSBjbGFzcyBwb3B1bGF0ZWRfc3RhdHVzCit7CisgICAgcG9wdWxhdGVkLAorICAgIG5vdF9wb3B1bGF0ZWQsCisgICAgZXJyb3IKK307CisKK3N0YXRpYyBwb3B1bGF0ZWRfc3RhdHVzIGNncm91cElzUG9wdWxhdGVkKGludCBldmVudHNfZmQpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBQT1BVTEFURURfS0VZKCJwb3B1bGF0ZWQgIik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBNQVhfRVZFTlRTX0ZJTEVfU0laRSA9IDMyOworCisgICAgc3RkOjpzdHJpbmcgYnVmOworICAgIGJ1Zi5yZXNpemUoTUFYX0VWRU5UU19GSUxFX1NJWkUpOworICAgIHNzaXplX3QgbGVuID0gVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKGV2ZW50c19mZCwgYnVmLmRhdGEoKSwgYnVmLnNpemUoKSwgMCkpOworICAgIGlmIChsZW4gPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCByZWFkIGNncm91cC5ldmVudHM6ICI7CisgICAgICAgIC8vIFBvdGVudGlhbGx5IEVOT0RFViBpZiB0aGUgY2dyb3VwIGhhcyBiZWVuIHJlbW92ZWQgc2luY2Ugd2Ugb3BlbmVkIHRoaXMgZmlsZSwgYnV0IHRoYXQKKyAgICAgICAgLy8gc2hvdWxkbid0IGhhdmUgaGFwcGVuZWQgeWV0LgorICAgICAgICByZXR1cm4gcG9wdWxhdGVkX3N0YXR1czo6ZXJyb3I7CisgICAgfQorCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNncm91cC5ldmVudHMgRU9GIjsKKyAgICAgICAgcmV0dXJuIHBvcHVsYXRlZF9zdGF0dXM6OmVycm9yOworICAgIH0KKworICAgIGJ1Zi5yZXNpemUobGVuKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gYnVmLmZpbmQoUE9QVUxBVEVEX0tFWSk7CisgICAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZmluZCBwb3B1bGF0ZWQga2V5IGluIGNncm91cC5ldmVudHMiOworICAgICAgICByZXR1cm4gcG9wdWxhdGVkX3N0YXR1czo6ZXJyb3I7CisgICAgfQorCisgICAgaWYgKHBvcyArIFBPUFVMQVRFRF9LRVkuc2l6ZSgpICsgMSA+IGxlbikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJQYXJ0aWFsIHJlYWQgb2YgY2dyb3VwLmV2ZW50cyI7CisgICAgICAgIHJldHVybiBwb3B1bGF0ZWRfc3RhdHVzOjplcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmW3BvcyArIFBPUFVMQVRFRF9LRVkuc2l6ZSgpXSA9PSAnMScgPworICAgICAgICBwb3B1bGF0ZWRfc3RhdHVzOjpwb3B1bGF0ZWQgOiBwb3B1bGF0ZWRfc3RhdHVzOjpub3RfcG9wdWxhdGVkOworfQorCisvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IG9mIDIyMDBtcyBjb21lcyBmcm9tIHRoZSBkZWZhdWx0IG51bWJlciBvZiByZXRyaWVzIGluIGEgcHJldmlvdXMKKy8vIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24uIFRoZSBkZWZhdWx0IHJldHJ5IHZhbHVlIHdhcyA0MCBmb3Iga2lsbGluZyBhbmQgNDAwIGZvciBjZ3JvdXAKKy8vIHJlbW92YWwgd2l0aCA1bXMgc2xlZXBzIGJldHdlZW4gZWFjaCByZXRyeS4KK3N0YXRpYyBpbnQgS2lsbFByb2Nlc3NHcm91cCgKKyAgICAgICAgdWlkX3QgdWlkLCBpbnQgaW5pdGlhbFBpZCwgaW50IHNpZ25hbCwgYm9vbCBvbmNlID0gZmFsc2UsCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgdW50aWwgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIDIyMDBtcykgewogICAgIENIRUNLX0dFKHVpZCwgMCk7CiAgICAgQ0hFQ0tfR1QoaW5pdGlhbFBpZCwgMCk7CiAKKyAgICAvLyBBbHdheXMgYXR0ZW1wdCB0byBzZW5kIGEga2lsbCBzaWduYWwgdG8gYXQgbGVhc3QgdGhlIGluaXRpYWxQaWQsIGF0IGxlYXN0IG9uY2UsIHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGV0aGVyIGl0cyBjZ3JvdXAgZXhpc3RzIG9yIG5vdC4gVGhpcyBzaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaWYgYSBidWcgcmVzdWx0cyBpbiB0aGUKKyAgICAvLyBtaWdyYXRpb24gb2YgdGhlIHRhcmdldGVkIHByb2Nlc3Mgb3V0IG9mIGl0cyBjZ3JvdXAsIHdoaWNoIHdlIHdpbGwgYWxzbyBhdHRlbXB0IHRvIGtpbGwuCisgICAgY29uc3QgYm9vbCBzaWduYWxfcmV0ID0gc2VuZFNpZ25hbFRvUHJvY2Vzc0dyb3VwKHVpZCwgaW5pdGlhbFBpZCwgc2lnbmFsKTsKKworICAgIGlmICghQ2dyb3Vwc0F2YWlsYWJsZSgpIHx8ICFzaWduYWxfcmV0KSByZXR1cm4gc2lnbmFsX3JldCA/IDAgOiAtMTsKKwogICAgIHN0ZDo6c3RyaW5nIGhpZXJhcmNoeV9yb290X3BhdGg7Ci0gICAgaWYgKENncm91cHNBdmFpbGFibGUoKSkgewotICAgICAgICBDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9DT05UUk9MTEVSX05BTUUsICZoaWVyYXJjaHlfcm9vdF9wYXRoKTsKLSAgICB9Ci0gICAgY29uc3QgY2hhciogY2dyb3VwID0gaGllcmFyY2h5X3Jvb3RfcGF0aC5jX3N0cigpOworICAgIENncm91cEdldENvbnRyb2xsZXJQYXRoKENHUk9VUFYyX0hJRVJBUkNIWV9OQU1FLCAmaGllcmFyY2h5X3Jvb3RfcGF0aCk7CiAKLSAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2dyb3VwX3YyX3BhdGggPQorICAgICAgICAgICAgQ29udmVydFVpZFBpZFRvUGF0aChoaWVyYXJjaHlfcm9vdF9wYXRoLmNfc3RyKCksIHVpZCwgaW5pdGlhbFBpZCk7CiAKLSAgICBpZiAobWF4X3Byb2Nlc3NlcyAhPSBudWxscHRyKSB7Ci0gICAgICAgICptYXhfcHJvY2Vzc2VzID0gMDsKLSAgICB9Ci0KLSAgICBpbnQgcmV0cnkgPSByZXRyaWVzOwotICAgIGludCBwcm9jZXNzZXM7Ci0gICAgd2hpbGUgKChwcm9jZXNzZXMgPSBEb0tpbGxQcm9jZXNzR3JvdXBPbmNlKGNncm91cCwgdWlkLCBpbml0aWFsUGlkLCBzaWduYWwpKSA+IDApIHsKLSAgICAgICAgaWYgKG1heF9wcm9jZXNzZXMgIT0gbnVsbHB0ciAmJiBwcm9jZXNzZXMgPiAqbWF4X3Byb2Nlc3NlcykgewotICAgICAgICAgICAgKm1heF9wcm9jZXNzZXMgPSBwcm9jZXNzZXM7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJLaWxsZWQgIiA8PCBwcm9jZXNzZXMgPDwgIiBwcm9jZXNzZXMgZm9yIHByb2Nlc3Nncm91cCAiIDw8IGluaXRpYWxQaWQ7Ci0gICAgICAgIGlmICghQ2dyb3Vwc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICAvLyBtYWtlcyBubyBzZW5zZSB0byByZXRyeSwgYmVjYXVzZSB0aGVyZSBhcmUgbm8gY2dyb3VwX3Byb2NzIGZpbGUKLSAgICAgICAgICAgIHByb2Nlc3NlcyA9IDA7ICAvLyBubyByZW1haW5pbmcgcHJvY2Vzc2VzCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0cnkgPiAwKSB7Ci0gICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoNW1zKTsKLSAgICAgICAgICAgIC0tcmV0cnk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcm9jZXNzZXMgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBlbmNvdW50ZXJlZCBraWxsaW5nIHByb2Nlc3MgY2dyb3VwIHVpZCAiIDw8IHVpZCA8PCAiIHBpZCAiCi0gICAgICAgICAgICAgICAgICAgIDw8IGluaXRpYWxQaWQ7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXZlbnRzZmlsZSA9IGNncm91cF92Ml9wYXRoICsgJy8nICsgUFJPQ0VTU0dST1VQX0NHUk9VUF9FVkVOVFNfRklMRTsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZXZlbnRzX2ZkKG9wZW4oZXZlbnRzZmlsZS5jX3N0cigpLCBPX1JET05MWSkpOworICAgIGlmIChldmVudHNfZmQuZ2V0KCkgPT0gLTEpIHsKKyAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRXJyb3Igb3BlbmluZyAiIDw8IGV2ZW50c2ZpbGUgPDwgIiBmb3IgS2lsbFByb2Nlc3NHcm91cCI7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGVuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwotICAgIGF1dG8gbXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbmQgLSBzdGFydCkuY291bnQoKTsKKyAgICBzdHJ1Y3QgcG9sbGZkIGZkcyA9IHsKKyAgICAgICAgLmZkID0gZXZlbnRzX2ZkLAorICAgICAgICAuZXZlbnRzID0gUE9MTFBSSSwKKyAgICB9OwogCi0gICAgLy8gV2Ugb25seSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiAncHJvY2Vzc2VzJyB3aGVuIGtpbGxpbmcgdGhlIHByb2Nlc3Nlcy4KLSAgICAvLyBJbiB0aGUgcmV0cmllcyA9PSAwIGNhc2UsIHdlIG9ubHkga2lsbCB0aGUgcHJvY2Vzc2VzIG9uY2UgYW5kIHRoZXJlZm9yZQotICAgIC8vIHdpbGwgbm90IGhhdmUgd2FpdGVkIHRoZW4gcmVjYWxjdWxhdGVkIGhvdyBtYW55IHByb2Nlc3NlcyBhcmUgcmVtYWluaW5nCi0gICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IHNpZ25hbHMgaGF2ZSBiZWVuIHNlbnQuCi0gICAgLy8gTG9nZ2luZyBhbnl0aGluZyByZWdhcmRpbmcgdGhlIG51bWJlciBvZiAncHJvY2Vzc2VzJyBoZXJlIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCisgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwogCi0gICAgaWYgKHByb2Nlc3NlcyA9PSAwKSB7Ci0gICAgICAgIGlmIChyZXRyaWVzID4gMCkgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJTdWNjZXNzZnVsbHkga2lsbGVkIHByb2Nlc3MgY2dyb3VwIHVpZCAiIDw8IHVpZCA8PCAiIHBpZCAiIDw8IGluaXRpYWxQaWQKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgc3RhdGljX2Nhc3Q8aW50PihtcykgPDwgIm1zIjsKKyAgICAvLyBUaGUgcHJpbWFyeSByZWFzb24gdG8gbG9vcCBoZXJlIGlzIHRvIGNhcHR1cmUgYW55IG5ldyBmb3JrcyBvciBtaWdyYXRpb25zIHRoYXQgY291bGQgb2NjdXIKKyAgICAvLyBhZnRlciB3ZSBzZW5kIHNpZ25hbHMgdG8gdGhlIG9yaWdpbmFsIHNldCBvZiBwcm9jZXNzZXMsIGJ1dCBiZWZvcmUgYWxsIG9mIHRob3NlIHByb2Nlc3NlcworICAgIC8vIGV4aXQgYW5kIHRoZSBjZ3JvdXAgYmVjb21lcyB1bnBvcHVsYXRlZCwgb3IgYmVmb3JlIHdlIHJlbW92ZSB0aGUgY2dyb3VwLiBXZSB0cnkgaGFyZCB0bworICAgIC8vIGVuc3VyZSB0aGlzIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgdG8gYXZvaWQgcGVybWFuZW50IG1lbW9yeSBsZWFrcywgYnV0IHdlIHN0aWxsIHBsYWNlIGEKKyAgICAvLyBsYXJnZSBkZWZhdWx0IHVwcGVyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgdGltZSB3ZSBzcGVuZCBpbiB0aGlzIGxvb3AuIFRoZSBhbW91bnQgb2YgQ1BVCisgICAgLy8gY29udGVudGlvbiwgYW5kIHRoZSBhbW91bnQgb2Ygd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaW4gZG9fZXhpdCBmb3IgZWFjaCBwcm9jZXNzCisgICAgLy8gZGV0ZXJtaW5lcyBob3cgbG9uZyB0aGlzIHdpbGwgdGFrZS4KKyAgICBpbnQgcmV0OworICAgIGRvIHsKKyAgICAgICAgcG9wdWxhdGVkX3N0YXR1cyBwb3B1bGF0ZWQ7CisgICAgICAgIHdoaWxlICgocG9wdWxhdGVkID0gY2dyb3VwSXNQb3B1bGF0ZWQoZXZlbnRzX2ZkLmdldCgpKSkgPT0gcG9wdWxhdGVkX3N0YXR1czo6cG9wdWxhdGVkICYmCisgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSA8IHVudGlsKSB7CisKKyAgICAgICAgICAgIHNlbmRTaWduYWxUb1Byb2Nlc3NHcm91cCh1aWQsIGluaXRpYWxQaWQsIHNpZ25hbCk7CisgICAgICAgICAgICBpZiAob25jZSkgeworICAgICAgICAgICAgICAgIHBvcHVsYXRlZCA9IGNncm91cElzUG9wdWxhdGVkKGV2ZW50c19mZC5nZXQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgcG9sbF9zdGFydCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworCisgICAgICAgICAgICBpZiAocG9sbF9zdGFydCA8IHVudGlsKQorICAgICAgICAgICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwb2xsKCZmZHMsIDEsIHRvTWlsbGlzZWModW50aWwgLSBwb2xsX3N0YXJ0KS5jb3VudCgpKSk7CisKKyAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byA1bXMgc2xlZXBzIGlmIHBvbGwgZmFpbHMKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiUG9sbCBvbiAiIDw8IGV2ZW50c2ZpbGUgPDwgImZhaWxlZCI7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICAgICAgICAgICAgICBpZiAobm93IDwgdW50aWwpCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6Om1pbig1bXMsIHRvTWlsbGlzZWModW50aWwgLSBub3cpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiV2FpdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b01pbGxpc2VjKHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gcG9sbF9zdGFydCkuY291bnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbXMgZm9yICIgPDwgZXZlbnRzZmlsZSA8PCAiIHBvbGwiOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFDZ3JvdXBzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSwgaWYgY2dyb3VwcyBpc24ndCBhdmFpbGFibGUKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGtpbGxfZHVyYXRpb24gPQorICAgICAgICAgICAgICAgIHRvTWlsbGlzZWMoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBzdGFydCk7CisKKyAgICAgICAgaWYgKHBvcHVsYXRlZCA9PSBwb3B1bGF0ZWRfc3RhdHVzOjpwb3B1bGF0ZWQpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiU3RpbGwgd2FpdGluZyBvbiBwcm9jZXNzKGVzKSB0byBleGl0IGZvciBjZ3JvdXAgIiA8PCBjZ3JvdXBfdjJfcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYWZ0ZXIgIiA8PCBraWxsX2R1cmF0aW9uLmNvdW50KCkgPDwgIiBtcyI7CisgICAgICAgICAgICAvLyBXZSdsbCBzdGlsbCB0cnkgdGhlIGNncm91cCByZW1vdmFsIGJlbG93IHdoaWNoIHdlIGV4cGVjdCB0byBsb2cgYW4gZXJyb3IuCisgICAgICAgIH0gZWxzZSBpZiAocG9wdWxhdGVkID09IHBvcHVsYXRlZF9zdGF0dXM6Om5vdF9wb3B1bGF0ZWQpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiS2lsbGVkIGFsbCBwcm9jZXNzZXMgdW5kZXIgY2dyb3VwICIgPDwgY2dyb3VwX3YyX3BhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFmdGVyICIgPDwga2lsbF9kdXJhdGlvbi5jb3VudCgpIDw8ICIgbXMiOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gNDAwIHJldHJpZXMgY29ycmVzcG9uZCB0byAyIHNlY3MgbWF4IHRpbWVvdXQKLSAgICAgICAgaW50IGVyciA9IFJlbW92ZVByb2Nlc3NHcm91cChjZ3JvdXAsIHVpZCwgaW5pdGlhbFBpZCwgNDAwKTsKKyAgICAgICAgcmV0ID0gUmVtb3ZlQ2dyb3VwKGhpZXJhcmNoeV9yb290X3BhdGguY19zdHIoKSwgdWlkLCBpbml0aWFsUGlkKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmVtb3ZlIGNncm91cCAiIDw8IGNncm91cF92Ml9wYXRoOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMT0coSU5GTykgPDwgIlJlbW92ZWQgY2dyb3VwICIgPDwgY2dyb3VwX3YyX3BhdGg7CiAKICAgICAgICAgaWYgKGlzTWVtb3J5Q2dyb3VwU3VwcG9ydGVkKCkgJiYgVXNlUGVyQXBwTWVtY2coKSkgeworICAgICAgICAgICAgLy8gVGhpcyBwZXItYXBwbGljYXRpb24gbWVtY2cgdjEgY2FzZSBzaG91bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkIGFmdGVyIG1pZ3JhdGlvbiB0bworICAgICAgICAgICAgLy8gbWVtY2cgdjIuCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZW1jZ19hcHBzX3BhdGg7CiAgICAgICAgICAgICBpZiAoQ2dyb3VwR2V0TWVtY2dBcHBzUGF0aCgmbWVtY2dfYXBwc19wYXRoKSAmJgotICAgICAgICAgICAgICAgIFJlbW92ZVByb2Nlc3NHcm91cChtZW1jZ19hcHBzX3BhdGguY19zdHIoKSwgdWlkLCBpbml0aWFsUGlkLCA0MDApIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAocmV0ID0gUmVtb3ZlQ2dyb3VwKG1lbWNnX2FwcHNfcGF0aC5jX3N0cigpLCB1aWQsIGluaXRpYWxQaWQpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIG1lbWNnX3YxX2Nncm91cF9wYXRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRVaWRQaWRUb1BhdGgobWVtY2dfYXBwc19wYXRoLmNfc3RyKCksIHVpZCwgaW5pdGlhbFBpZCk7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byByZW1vdmUgbWVtY2cgdjEgY2dyb3VwICIgPDwgbWVtY2dfdjFfY2dyb3VwX3BhdGg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChyZXRyaWVzID4gMCkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGtpbGwgcHJvY2VzcyBjZ3JvdXAgdWlkICIgPDwgdWlkIDw8ICIgcGlkICIgPDwgaW5pdGlhbFBpZAotICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgc3RhdGljX2Nhc3Q8aW50PihtcykgPDwgIm1zLCAiIDw8IHByb2Nlc3NlcwotICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHByb2Nlc3NlcyByZW1haW4iOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgICAgIGlmIChvbmNlKSBicmVhazsKKyAgICAgICAgaWYgKHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpID49IHVudGlsKSBicmVhazsKKyAgICB9IHdoaWxlIChyZXQgJiYgZXJybm8gPT0gRUJVU1kpOworCisgICAgcmV0dXJuIHJldDsKIH0KIAotaW50IGtpbGxQcm9jZXNzR3JvdXAodWlkX3QgdWlkLCBpbnQgaW5pdGlhbFBpZCwgaW50IHNpZ25hbCwgaW50KiBtYXhfcHJvY2Vzc2VzKSB7Ci0gICAgcmV0dXJuIEtpbGxQcm9jZXNzR3JvdXAodWlkLCBpbml0aWFsUGlkLCBzaWduYWwsIDQwIC8qcmV0cmllcyovLCBtYXhfcHJvY2Vzc2VzKTsKK2ludCBraWxsUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwpIHsKKyAgICByZXR1cm4gS2lsbFByb2Nlc3NHcm91cCh1aWQsIGluaXRpYWxQaWQsIHNpZ25hbCk7CiB9CiAKLWludCBraWxsUHJvY2Vzc0dyb3VwT25jZSh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsLCBpbnQqIG1heF9wcm9jZXNzZXMpIHsKLSAgICByZXR1cm4gS2lsbFByb2Nlc3NHcm91cCh1aWQsIGluaXRpYWxQaWQsIHNpZ25hbCwgMCAvKnJldHJpZXMqLywgbWF4X3Byb2Nlc3Nlcyk7Ci19Ci0KLWludCBzZW5kU2lnbmFsVG9Qcm9jZXNzR3JvdXAodWlkX3QgdWlkLCBpbnQgaW5pdGlhbFBpZCwgaW50IHNpZ25hbCkgewotICAgIHN0ZDo6c3RyaW5nIGhpZXJhcmNoeV9yb290X3BhdGg7Ci0gICAgaWYgKENncm91cHNBdmFpbGFibGUoKSkgewotICAgICAgICBDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9DT05UUk9MTEVSX05BTUUsICZoaWVyYXJjaHlfcm9vdF9wYXRoKTsKLSAgICB9Ci0gICAgY29uc3QgY2hhciogY2dyb3VwID0gaGllcmFyY2h5X3Jvb3RfcGF0aC5jX3N0cigpOwotICAgIHJldHVybiBEb0tpbGxQcm9jZXNzR3JvdXBPbmNlKGNncm91cCwgdWlkLCBpbml0aWFsUGlkLCBzaWduYWwpOworaW50IGtpbGxQcm9jZXNzR3JvdXBPbmNlKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwpIHsKKyAgICByZXR1cm4gS2lsbFByb2Nlc3NHcm91cCh1aWQsIGluaXRpYWxQaWQsIHNpZ25hbCwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgY3JlYXRlUHJvY2Vzc0dyb3VwSW50ZXJuYWwodWlkX3QgdWlkLCBpbnQgaW5pdGlhbFBpZCwgc3RkOjpzdHJpbmcgY2dyb3VwLApAQCAtNTg4LDcgKzY3Nyw3IEBACiAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgfQogCi0gICAgYXV0byB1aWRfcGlkX3Byb2NzX2ZpbGUgPSB1aWRfcGlkX3BhdGggKyBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEU7CisgICAgYXV0byB1aWRfcGlkX3Byb2NzX2ZpbGUgPSB1aWRfcGlkX3BhdGggKyAnLycgKyBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEU7CiAKICAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKHN0ZDo6dG9fc3RyaW5nKGluaXRpYWxQaWQpLCB1aWRfcGlkX3Byb2NzX2ZpbGUpKSB7CiAgICAgICAgIHJldCA9IC1lcnJubzsKQEAgLTYwMyw3ICs2OTIsNyBAQAogICAgIENIRUNLX0dUKGluaXRpYWxQaWQsIDApOwogCiAgICAgaWYgKG1lbUNvbnRyb2wgJiYgIVVzZVBlckFwcE1lbWNnKCkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgInNlcnZpY2UgbWVtb3J5IGNvbnRyb2xzIGFyZSB1c2VkIHdpdGhvdXQgcGVyLXByb2Nlc3MgbWVtb3J5IGNncm91cCBzdXBwb3J0IjsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2VydmljZSBtZW1vcnkgY29udHJvbHMgYXJlIHVzZWQgd2l0aG91dCBwZXItcHJvY2VzcyBtZW1vcnkgY2dyb3VwIHN1cHBvcnQiOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTYxOSwxOSArNzA4LDE5IEBACiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgY2dyb3VwOwotICAgIENncm91cEdldENvbnRyb2xsZXJQYXRoKENHUk9VUFYyX0NPTlRST0xMRVJfTkFNRSwgJmNncm91cCk7CisgICAgQ2dyb3VwR2V0Q29udHJvbGxlclBhdGgoQ0dST1VQVjJfSElFUkFSQ0hZX05BTUUsICZjZ3JvdXApOwogICAgIHJldHVybiBjcmVhdGVQcm9jZXNzR3JvdXBJbnRlcm5hbCh1aWQsIGluaXRpYWxQaWQsIGNncm91cCwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBib29sIFNldFByb2Nlc3NHcm91cFZhbHVlKGludCB0aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyX25hbWUsIGludDY0X3QgdmFsdWUpIHsKICAgICBpZiAoIWlzTWVtb3J5Q2dyb3VwU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIk1lbWNnIGlzIG5vdCBtb3VudGVkLiI7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk1lbWNnIGlzIG5vdCBtb3VudGVkLiI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBwYXRoOwogICAgIGlmICghQ2dyb3VwR2V0QXR0cmlidXRlUGF0aEZvclRhc2soYXR0cl9uYW1lLCB0aWQsICZwYXRoKSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZpbmQgYXR0cmlidXRlICciIDw8IGF0dHJfbmFtZSA8PCAiJyI7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmaW5kIGF0dHJpYnV0ZSAnIiA8PCBhdHRyX25hbWUgPDwgIiciOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC02NjYsNCArNzU1LDQgQEAKICAgICB9CiAKICAgICByZXR1cm4gdHAtPklzVmFsaWRGb3JQcm9jZXNzKHVpZCwgcGlkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvY2dyb3Vwcy5qc29uIGIvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL2Nncm91cHMuanNvbgppbmRleCAzZTQzOTNkLi5kMDEzZWM4IDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvY2dyb3Vwcy5qc29uCisrKyBiL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy9jZ3JvdXBzLmpzb24KQEAgLTEsMTMgKzEsNiBAQAogewogICAiQ2dyb3VwcyI6IFsKICAgICB7Ci0gICAgICAiQ29udHJvbGxlciI6ICJibGtpbyIsCi0gICAgICAiUGF0aCI6ICIvZGV2L2Jsa2lvIiwKLSAgICAgICJNb2RlIjogIjA3NzUiLAotICAgICAgIlVJRCI6ICJzeXN0ZW0iLAotICAgICAgIkdJRCI6ICJzeXN0ZW0iCi0gICAgfSwKLSAgICB7CiAgICAgICAiQ29udHJvbGxlciI6ICJjcHUiLAogICAgICAgIlBhdGgiOiAiL2Rldi9jcHVjdGwiLAogICAgICAgIk1vZGUiOiAiMDc1NSIsCkBAIC0zOSw2ICszMiwxMiBAQAogICAgICAgewogICAgICAgICAiQ29udHJvbGxlciI6ICJmcmVlemVyIiwKICAgICAgICAgIlBhdGgiOiAiLiIKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJDb250cm9sbGVyIjogImlvIiwKKyAgICAgICAgIlBhdGgiOiAiLiIsCisgICAgICAgICJOZWVkc0FjdGl2YXRpb24iOiB0cnVlLAorICAgICAgICAiT3B0aW9uYWwiOiB0cnVlCiAgICAgICB9CiAgICAgXQogICB9CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvdGFza19wcm9maWxlcy5qc29uIGIvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL3Rhc2tfcHJvZmlsZXMuanNvbgppbmRleCAxZmM2NmJhLi5mMmVmMzE2IDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvdGFza19wcm9maWxlcy5qc29uCisrKyBiL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy90YXNrX3Byb2ZpbGVzLmpzb24KQEAgLTc2LDYgKzc2LDI2IEBACiAgICAgICAiTmFtZSI6ICJGcmVlemVyU3RhdGUiLAogICAgICAgIkNvbnRyb2xsZXIiOiAiZnJlZXplciIsCiAgICAgICAiRmlsZSI6ICJjZ3JvdXAuZnJlZXplIgorICAgIH0sCisgICAgeworICAgICAgIk5hbWUiOiAiQmZxV2VpZ2h0IiwKKyAgICAgICJDb250cm9sbGVyIjogImlvIiwKKyAgICAgICJGaWxlIjogImlvLmJmcS53ZWlnaHQiCisgICAgfSwKKyAgICB7CisgICAgICAiTmFtZSI6ICJDZnFHcm91cElkbGUiLAorICAgICAgIkNvbnRyb2xsZXIiOiAiaW8iLAorICAgICAgIkZpbGUiOiAiaW8uZ3JvdXBfaWRsZSIKKyAgICB9LAorICAgIHsKKyAgICAgICJOYW1lIjogIkNmcVdlaWdodCIsCisgICAgICAiQ29udHJvbGxlciI6ICJpbyIsCisgICAgICAiRmlsZSI6ICJpby53ZWlnaHQiCisgICAgfSwKKyAgICB7CisgICAgICAiTmFtZSI6ICJJb1ByaW9DbGFzcyIsCisgICAgICAiQ29udHJvbGxlciI6ICJpbyIsCisgICAgICAiRmlsZSI6ICJpby5wcmlvLmNsYXNzIgogICAgIH0KICAgXSwKIApAQCAtNDM5LDExICs0NTksMzkgQEAKICAgICAgICJOYW1lIjogIkxvd0lvUHJpb3JpdHkiLAogICAgICAgIkFjdGlvbnMiOiBbCiAgICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKKyAgICAgICAgICAiTmFtZSI6ICJTZXRBdHRyaWJ1dGUiLAogICAgICAgICAgICJQYXJhbXMiOgogICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogImJsa2lvIiwKLSAgICAgICAgICAgICJQYXRoIjogImJhY2tncm91bmQiCisgICAgICAgICAgICAiTmFtZSI6ICJCZnFXZWlnaHQiLAorICAgICAgICAgICAgIlZhbHVlIjogIjEwIiwKKyAgICAgICAgICAgICJPcHRpb25hbCI6ICJ0cnVlIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCisgICAgICAgICAgIlBhcmFtcyI6CisgICAgICAgICAgeworICAgICAgICAgICAgIk5hbWUiOiAiQ2ZxR3JvdXBJZGxlIiwKKyAgICAgICAgICAgICJWYWx1ZSI6ICIwIiwKKyAgICAgICAgICAgICJPcHRpb25hbCI6ICJ0cnVlIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCisgICAgICAgICAgIlBhcmFtcyI6CisgICAgICAgICAgeworICAgICAgICAgICAgIk5hbWUiOiAiQ2ZxV2VpZ2h0IiwKKyAgICAgICAgICAgICJWYWx1ZSI6ICIyMDAiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKKyAgICAgICAgICAiUGFyYW1zIjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAiTmFtZSI6ICJJb1ByaW9DbGFzcyIsCisgICAgICAgICAgICAiVmFsdWUiOiAicmVzdHJpY3QtdG8tYmUiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICBdCkBAIC00NTIsMTEgKzUwMCwzOSBAQAogICAgICAgIk5hbWUiOiAiTm9ybWFsSW9Qcmlvcml0eSIsCiAgICAgICAiQWN0aW9ucyI6IFsKICAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAorICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCiAgICAgICAgICAgIlBhcmFtcyI6CiAgICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAiYmxraW8iLAotICAgICAgICAgICAgIlBhdGgiOiAiIgorICAgICAgICAgICAgIk5hbWUiOiAiQmZxV2VpZ2h0IiwKKyAgICAgICAgICAgICJWYWx1ZSI6ICIxMDAiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKKyAgICAgICAgICAiUGFyYW1zIjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAiTmFtZSI6ICJDZnFHcm91cElkbGUiLAorICAgICAgICAgICAgIlZhbHVlIjogIjAiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKKyAgICAgICAgICAiUGFyYW1zIjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAiTmFtZSI6ICJDZnFXZWlnaHQiLAorICAgICAgICAgICAgIlZhbHVlIjogIjEwMDAiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKKyAgICAgICAgICAiUGFyYW1zIjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAiTmFtZSI6ICJJb1ByaW9DbGFzcyIsCisgICAgICAgICAgICAiVmFsdWUiOiAicmVzdHJpY3QtdG8tYmUiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICBdCkBAIC00NjUsMTEgKzU0MSwzOSBAQAogICAgICAgIk5hbWUiOiAiSGlnaElvUHJpb3JpdHkiLAogICAgICAgIkFjdGlvbnMiOiBbCiAgICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKKyAgICAgICAgICAiTmFtZSI6ICJTZXRBdHRyaWJ1dGUiLAogICAgICAgICAgICJQYXJhbXMiOgogICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogImJsa2lvIiwKLSAgICAgICAgICAgICJQYXRoIjogIiIKKyAgICAgICAgICAgICJOYW1lIjogIkJmcVdlaWdodCIsCisgICAgICAgICAgICAiVmFsdWUiOiAiMTAwIiwKKyAgICAgICAgICAgICJPcHRpb25hbCI6ICJ0cnVlIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCisgICAgICAgICAgIlBhcmFtcyI6CisgICAgICAgICAgeworICAgICAgICAgICAgIk5hbWUiOiAiQ2ZxR3JvdXBJZGxlIiwKKyAgICAgICAgICAgICJWYWx1ZSI6ICIwIiwKKyAgICAgICAgICAgICJPcHRpb25hbCI6ICJ0cnVlIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCisgICAgICAgICAgIlBhcmFtcyI6CisgICAgICAgICAgeworICAgICAgICAgICAgIk5hbWUiOiAiQ2ZxV2VpZ2h0IiwKKyAgICAgICAgICAgICJWYWx1ZSI6ICIxMDAwIiwKKyAgICAgICAgICAgICJPcHRpb25hbCI6ICJ0cnVlIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCisgICAgICAgICAgIlBhcmFtcyI6CisgICAgICAgICAgeworICAgICAgICAgICAgIk5hbWUiOiAiSW9QcmlvQ2xhc3MiLAorICAgICAgICAgICAgIlZhbHVlIjogInByb21vdGUtdG8tcnQiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICBdCkBAIC00NzgsMTEgKzU4MiwzOSBAQAogICAgICAgIk5hbWUiOiAiTWF4SW9Qcmlvcml0eSIsCiAgICAgICAiQWN0aW9ucyI6IFsKICAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAorICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCiAgICAgICAgICAgIlBhcmFtcyI6CiAgICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAiYmxraW8iLAotICAgICAgICAgICAgIlBhdGgiOiAiIgorICAgICAgICAgICAgIk5hbWUiOiAiQmZxV2VpZ2h0IiwKKyAgICAgICAgICAgICJWYWx1ZSI6ICIxMDAiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKKyAgICAgICAgICAiUGFyYW1zIjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAiTmFtZSI6ICJDZnFHcm91cElkbGUiLAorICAgICAgICAgICAgIlZhbHVlIjogIjAiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKKyAgICAgICAgICAiUGFyYW1zIjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAiTmFtZSI6ICJDZnFXZWlnaHQiLAorICAgICAgICAgICAgIlZhbHVlIjogIjEwMDAiLAorICAgICAgICAgICAgIk9wdGlvbmFsIjogInRydWUiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKKyAgICAgICAgICAiUGFyYW1zIjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAiTmFtZSI6ICJJb1ByaW9DbGFzcyIsCisgICAgICAgICAgICAiVmFsdWUiOiAicHJvbW90ZS10by1ydCIsCisgICAgICAgICAgICAiT3B0aW9uYWwiOiAidHJ1ZSIKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIF0KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9zZXR1cC9jZ3JvdXBfbWFwX3dyaXRlLmNwcCBiL2xpYnByb2Nlc3Nncm91cC9zZXR1cC9jZ3JvdXBfbWFwX3dyaXRlLmNwcAppbmRleCBmYmVlZGY5Li40ZTQ0YzkxIDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvc2V0dXAvY2dyb3VwX21hcF93cml0ZS5jcHAKKysrIGIvbGlicHJvY2Vzc2dyb3VwL3NldHVwL2Nncm91cF9tYXBfd3JpdGUuY3BwCkBAIC0yMTIsNyArMjEyLDcgQEAKICAgICBpZiAocm9vdC5pc01lbWJlcigiQ2dyb3VwczIiKSkgewogICAgICAgICBjb25zdCBKc29uOjpWYWx1ZSYgY2dyb3VwczIgPSByb290WyJDZ3JvdXBzMiJdOwogICAgICAgICBzdGQ6OnN0cmluZyByb290X3BhdGggPSBjZ3JvdXBzMlsiUGF0aCJdLmFzU3RyaW5nKCk7Ci0gICAgICAgIE1lcmdlQ2dyb3VwVG9EZXNjcmlwdG9ycyhkZXNjcmlwdG9ycywgY2dyb3VwczIsIENHUk9VUFYyX0NPTlRST0xMRVJfTkFNRSwgIiIsIDIpOworICAgICAgICBNZXJnZUNncm91cFRvRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnMsIGNncm91cHMyLCBDR1JPVVBWMl9ISUVSQVJDSFlfTkFNRSwgIiIsIDIpOwogCiAgICAgICAgIGNvbnN0IEpzb246OlZhbHVlJiBjaGlsZEdyb3VwcyA9IGNncm91cHMyWyJDb250cm9sbGVycyJdOwogICAgICAgICBmb3IgKEpzb246OlZhbHVlOjpBcnJheUluZGV4IGkgPSAwOyBpIDwgY2hpbGRHcm91cHMuc2l6ZSgpOyArK2kpIHsKQEAgLTM1OCw3ICszNTgsNyBAQAogICAgIGNvbnN0IGZvcm1hdDo6Q2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlciA9IGRlc2NyaXB0b3IuY29udHJvbGxlcigpOwogCiAgICAgaWYgKGNvbnRyb2xsZXItPnZlcnNpb24oKSA9PSAyKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGNvbnRyb2xsZXItPm5hbWUoKSwgQ0dST1VQVjJfQ09OVFJPTExFUl9OQU1FKSkgeworICAgICAgICBpZiAoIXN0cmNtcChjb250cm9sbGVyLT5uYW1lKCksIENHUk9VUFYyX0hJRVJBUkNIWV9OQU1FKSkgewogICAgICAgICAgICAgcmV0dXJuIE1vdW50VjJDZ3JvdXBDb250cm9sbGVyKGRlc2NyaXB0b3IpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIEFjdGl2YXRlVjJDZ3JvdXBDb250cm9sbGVyKGRlc2NyaXB0b3IpOwpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL3Rhc2tfcHJvZmlsZXMuY3BwIGIvbGlicHJvY2Vzc2dyb3VwL3Rhc2tfcHJvZmlsZXMuY3BwCmluZGV4IDQ0ZGJhMmEuLmQ1YmQ0N2MgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC90YXNrX3Byb2ZpbGVzLmNwcAorKysgYi9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlcy5jcHAKQEAgLTExNCw5ICsxMTQsMjYgQEAKIAogSVByb2ZpbGVBdHRyaWJ1dGU6On5JUHJvZmlsZUF0dHJpYnV0ZSgpID0gZGVmYXVsdDsKIAotdm9pZCBQcm9maWxlQXR0cmlidXRlOjpSZXNldChjb25zdCBDZ3JvdXBDb250cm9sbGVyJiBjb250cm9sbGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKSB7Citjb25zdCBzdGQ6OnN0cmluZyYgUHJvZmlsZUF0dHJpYnV0ZTo6ZmlsZV9uYW1lKCkgY29uc3QgeworICAgIGlmIChjb250cm9sbGVyKCktPnZlcnNpb24oKSA9PSAyICYmICFmaWxlX3YyX25hbWVfLmVtcHR5KCkpIHJldHVybiBmaWxlX3YyX25hbWVfOworICAgIHJldHVybiBmaWxlX25hbWVfOworfQorCit2b2lkIFByb2ZpbGVBdHRyaWJ1dGU6OlJlc2V0KGNvbnN0IENncm91cENvbnRyb2xsZXImIGNvbnRyb2xsZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3YyX25hbWUpIHsKICAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7CiAgICAgZmlsZV9uYW1lXyA9IGZpbGVfbmFtZTsKKyAgICBmaWxlX3YyX25hbWVfID0gZmlsZV92Ml9uYW1lOworfQorCitib29sIFByb2ZpbGVBdHRyaWJ1dGU6OkdldFBhdGhGb3JQcm9jZXNzKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgY29uc3QgeworICAgIGlmIChjb250cm9sbGVyKCktPnZlcnNpb24oKSA9PSAyKSB7CisgICAgICAgIC8vIGFsbCBjZ3JvdXAgdjIgYXR0cmlidXRlcyB1c2UgdGhlIHNhbWUgcHJvY2VzcyBncm91cCBoaWVyYXJjaHkKKyAgICAgICAgKnBhdGggPSBTdHJpbmdQcmludGYoIiVzL3VpZF8ldS9waWRfJWQvJXMiLCBjb250cm9sbGVyKCktPnBhdGgoKSwgdWlkLCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIEdldFBhdGhGb3JUYXNrKHBpZCwgcGF0aCk7CiB9CiAKIGJvb2wgUHJvZmlsZUF0dHJpYnV0ZTo6R2V0UGF0aEZvclRhc2soaW50IHRpZCwgc3RkOjpzdHJpbmcqIHBhdGgpIGNvbnN0IHsKQEAgLTEyOSwxMiArMTQ2LDExIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUgPQotICAgICAgICAgICAgY29udHJvbGxlcigpLT52ZXJzaW9uKCkgPT0gMiAmJiAhZmlsZV92Ml9uYW1lXy5lbXB0eSgpID8gZmlsZV92Ml9uYW1lXyA6IGZpbGVfbmFtZV87CiAgICAgaWYgKHN1Ymdyb3VwLmVtcHR5KCkpIHsKLSAgICAgICAgKnBhdGggPSBTdHJpbmdQcmludGYoIiVzLyVzIiwgY29udHJvbGxlcigpLT5wYXRoKCksIGZpbGVfbmFtZS5jX3N0cigpKTsKKyAgICAgICAgKnBhdGggPSBTdHJpbmdQcmludGYoIiVzLyVzIiwgY29udHJvbGxlcigpLT5wYXRoKCksIGZpbGVfbmFtZSgpLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgICpwYXRoID0gU3RyaW5nUHJpbnRmKCIlcy8lcy8lcyIsIGNvbnRyb2xsZXIoKS0+cGF0aCgpLCBzdWJncm91cC5jX3N0cigpLCBmaWxlX25hbWUuY19zdHIoKSk7CisgICAgICAgICpwYXRoID0gU3RyaW5nUHJpbnRmKCIlcy8lcy8lcyIsIGNvbnRyb2xsZXIoKS0+cGF0aCgpLCBzdWJncm91cC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUoKS5jX3N0cigpKTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0xNDQsOSArMTYwLDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSA9Ci0gICAgICAgICAgICBjb250cm9sbGVyKCktPnZlcnNpb24oKSA9PSAyICYmICFmaWxlX3YyX25hbWVfLmVtcHR5KCkgPyBmaWxlX3YyX25hbWVfIDogZmlsZV9uYW1lXzsKLSAgICAqcGF0aCA9IFN0cmluZ1ByaW50ZigiJXMvdWlkXyVkLyVzIiwgY29udHJvbGxlcigpLT5wYXRoKCksIHVpZCwgZmlsZV9uYW1lLmNfc3RyKCkpOworICAgICpwYXRoID0gU3RyaW5nUHJpbnRmKCIlcy91aWRfJXUvJXMiLCBjb250cm9sbGVyKCktPnBhdGgoKSwgdWlkLCBmaWxlX25hbWUoKS5jX3N0cigpKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjA1LDE4ICsyMTksNyBAQAogCiAjZW5kaWYKIAotYm9vbCBTZXRBdHRyaWJ1dGVBY3Rpb246OkV4ZWN1dGVGb3JQcm9jZXNzKHVpZF90LCBwaWRfdCBwaWQpIGNvbnN0IHsKLSAgICByZXR1cm4gRXhlY3V0ZUZvclRhc2socGlkKTsKLX0KLQotYm9vbCBTZXRBdHRyaWJ1dGVBY3Rpb246OkV4ZWN1dGVGb3JUYXNrKGludCB0aWQpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBwYXRoOwotCi0gICAgaWYgKCFhdHRyaWJ1dGVfLT5HZXRQYXRoRm9yVGFzayh0aWQsICZwYXRoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmluZCBjZ3JvdXAgZm9yIHRpZCAiIDw8IHRpZDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQorYm9vbCBTZXRBdHRyaWJ1dGVBY3Rpb246OldyaXRlVmFsdWVUb0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0IHsKICAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKHZhbHVlXywgcGF0aCkpIHsKICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIEZfT0spIDwgMCkgewogICAgICAgICAgICAgaWYgKG9wdGlvbmFsXykgewpAQCAtMjM2LDYgKzIzOSwyOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIFNldEF0dHJpYnV0ZUFjdGlvbjo6RXhlY3V0ZUZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoOworCisgICAgaWYgKCFhdHRyaWJ1dGVfLT5HZXRQYXRoRm9yUHJvY2Vzcyh1aWQsIHBpZCwgJnBhdGgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmaW5kIGNncm91cCBmb3IgdWlkICIgPDwgdWlkIDw8ICIgcGlkICIgPDwgcGlkOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIFdyaXRlVmFsdWVUb0ZpbGUocGF0aCk7Cit9CisKK2Jvb2wgU2V0QXR0cmlidXRlQWN0aW9uOjpFeGVjdXRlRm9yVGFzayhpbnQgdGlkKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcGF0aDsKKworICAgIGlmICghYXR0cmlidXRlXy0+R2V0UGF0aEZvclRhc2sodGlkLCAmcGF0aCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZpbmQgY2dyb3VwIGZvciB0aWQgIiA8PCB0aWQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gV3JpdGVWYWx1ZVRvRmlsZShwYXRoKTsKK30KKwogYm9vbCBTZXRBdHRyaWJ1dGVBY3Rpb246OkV4ZWN1dGVGb3JVSUQodWlkX3QgdWlkKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmcgcGF0aDsKIApAQCAtMjkxLDcgKzMxNiw3IEBACiAgICAgRmRDYWNoZUhlbHBlcjo6SW5pdChjb250cm9sbGVyXy5HZXRQcm9jc0ZpbGVQYXRoKHBhdGhfLCAwLCAwKSwgZmRfW1Byb2ZpbGVBY3Rpb246OlJDVF9QUk9DRVNTXSk7CiB9CiAKLWJvb2wgU2V0Q2dyb3VwQWN0aW9uOjpBZGRUaWRUb0Nncm91cChpbnQgdGlkLCBpbnQgZmQsIGNvbnN0IGNoYXIqIGNvbnRyb2xsZXJfbmFtZSkgeworYm9vbCBTZXRDZ3JvdXBBY3Rpb246OkFkZFRpZFRvQ2dyb3VwKGludCB0aWQsIGludCBmZCwgUmVzb3VyY2VDYWNoZVR5cGUgY2FjaGVfdHlwZSkgY29uc3QgewogICAgIGlmICh0aWQgPD0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0zMDcsNiArMzMyLDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgY29uc3QgY2hhciogY29udHJvbGxlcl9uYW1lID0gY29udHJvbGxlcigpLT5uYW1lKCk7CiAgICAgLy8gRU5PU1BDIGlzIHJldHVybmVkIHdoZW4gY3B1c2V0IGNncm91cCB0aGF0IHdlIGFyZSBqb2luaW5nIGhhcyBubyBvbmxpbmUgY3B1cwogICAgIGlmIChlcnJubyA9PSBFTk9TUEMgJiYgIXN0cmNtcChjb250cm9sbGVyX25hbWUsICJjcHVzZXQiKSkgewogICAgICAgICAvLyBUaGlzIGlzIGFuIGFibm9ybWFsIGNhc2UgaGFwcGVuaW5nIG9ubHkgaW4gdGVzdGluZywgc28gcmVwb3J0IGl0IG9ubHkgb25jZQpAQCAtMzIwLDcgKzM0Niw4IEBACiAgICAgICAgICAgICAgICAgICAgPDwgIicgaW50byBjcHVzZXQgYmVjYXVzZSBhbGwgY3B1cyBpbiB0aGF0IGNwdXNldCBhcmUgb2ZmbGluZSI7CiAgICAgICAgIGVtcHR5X2NwdXNldF9yZXBvcnRlZCA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkFkZFRpZFRvQ2dyb3VwIGZhaWxlZCB0byB3cml0ZSAnIiA8PCB2YWx1ZSA8PCAiJzsgZmQ9IiA8PCBmZDsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkFkZFRpZFRvQ2dyb3VwIGZhaWxlZCB0byB3cml0ZSAnIiA8PCB2YWx1ZSA8PCAiJzsgcGF0aD0iIDw8IHBhdGhfIDw8ICI7ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgKGNhY2hlX3R5cGUgPT0gUkNUX1RBU0sgPyAidGFzayIgOiAicHJvY2VzcyIpOwogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsKQEAgLTMzMSw3ICszNTgsNyBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGZkX211dGV4Xyk7CiAgICAgaWYgKEZkQ2FjaGVIZWxwZXI6OklzQ2FjaGVkKGZkX1tjYWNoZV90eXBlXSkpIHsKICAgICAgICAgLy8gZmQgaXMgY2FjaGVkLCByZXVzZSBpdAotICAgICAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKGlkLCBmZF9bY2FjaGVfdHlwZV0sIGNvbnRyb2xsZXIoKS0+bmFtZSgpKSkgeworICAgICAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKGlkLCBmZF9bY2FjaGVfdHlwZV0sIGNhY2hlX3R5cGUpKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWRkIHRhc2sgaW50byBjZ3JvdXAiOwogICAgICAgICAgICAgcmV0dXJuIFByb2ZpbGVBY3Rpb246OkZBSUw7CiAgICAgICAgIH0KQEAgLTM2Niw3ICszOTMsNyBAQAogICAgICAgICBQTE9HKFdBUk5JTkcpIDw8IE5hbWUoKSA8PCAiOjoiIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBvcGVuICIgPDwgcHJvY3NfcGF0aDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKHBpZCwgdG1wX2ZkLCBjb250cm9sbGVyKCktPm5hbWUoKSkpIHsKKyAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKHBpZCwgdG1wX2ZkLCBSQ1RfUFJPQ0VTUykpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFkZCB0YXNrIGludG8gY2dyb3VwIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTM4Nyw3ICs0MTQsNyBAQAogICAgICAgICBQTE9HKFdBUk5JTkcpIDw8IE5hbWUoKSA8PCAiOjoiIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBvcGVuICIgPDwgdGFza3NfcGF0aDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKHRpZCwgdG1wX2ZkLCBjb250cm9sbGVyKCktPm5hbWUoKSkpIHsKKyAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKHRpZCwgdG1wX2ZkLCBSQ1RfVEFTSykpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFkZCB0YXNrIGludG8gY2dyb3VwIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTgxNiw3ICs4NDMsNyBAQAogICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfW25hbWVdID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8UHJvZmlsZUF0dHJpYnV0ZT4oY29udHJvbGxlciwgZmlsZV9hdHRyLCBmaWxlX3YyX2F0dHIpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPlJlc2V0KGNvbnRyb2xsZXIsIGZpbGVfYXR0cik7CisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5SZXNldChjb250cm9sbGVyLCBmaWxlX2F0dHIsIGZpbGVfdjJfYXR0cik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkNvbnRyb2xsZXIgIiA8PCBjb250cm9sbGVyX25hbWUgPDwgIiBpcyBub3QgZm91bmQiOwpAQCAtODQxLDcgKzg2OCwxMyBAQAogCiAgICAgICAgICAgICAgICAgYXV0byBjb250cm9sbGVyID0gY2dfbWFwLkZpbmRDb250cm9sbGVyKGNvbnRyb2xsZXJfbmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuSGFzVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5BZGQoc3RkOjptYWtlX3VuaXF1ZTxTZXRDZ3JvdXBBY3Rpb24+KGNvbnRyb2xsZXIsIHBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIudmVyc2lvbigpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPkFkZChzdGQ6Om1ha2VfdW5pcXVlPFNldENncm91cEFjdGlvbj4oY29udHJvbGxlciwgcGF0aCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJBIEpvaW5DZ3JvdXAgYWN0aW9uIGluIHRoZSAiIDw8IHByb2ZpbGVfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcHJvZmlsZSBpcyB1c2VkIGZvciBjb250cm9sbGVyICIgPDwgY29udHJvbGxlcl9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbiB0aGUgY2dyb3VwIHYyIGhpZXJhcmNoeSBhbmQgd2lsbCBiZSBpZ25vcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSm9pbkNncm91cDogY29udHJvbGxlciAiIDw8IGNvbnRyb2xsZXJfbmFtZSA8PCAiIGlzIG5vdCBmb3VuZCI7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL3Rhc2tfcHJvZmlsZXMuaCBiL2xpYnByb2Nlc3Nncm91cC90YXNrX3Byb2ZpbGVzLmgKaW5kZXggYTYyYzViMC4uMTZmZmU2MyAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL3Rhc2tfcHJvZmlsZXMuaAorKysgYi9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlcy5oCkBAIC0zMiw5ICszMiwxMSBAQAogY2xhc3MgSVByb2ZpbGVBdHRyaWJ1dGUgewogICBwdWJsaWM6CiAgICAgdmlydHVhbCB+SVByb2ZpbGVBdHRyaWJ1dGUoKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFJlc2V0KGNvbnN0IENncm91cENvbnRyb2xsZXImIGNvbnRyb2xsZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgUmVzZXQoY29uc3QgQ2dyb3VwQ29udHJvbGxlciYgY29udHJvbGxlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfdjJfbmFtZSkgPSAwOwogICAgIHZpcnR1YWwgY29uc3QgQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlcigpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIEdldFBhdGhGb3JQcm9jZXNzKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBHZXRQYXRoRm9yVGFzayhpbnQgdGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBHZXRQYXRoRm9yVUlEKHVpZF90IHVpZCwgc3RkOjpzdHJpbmcqIHBhdGgpIGNvbnN0ID0gMDsKIH07CkBAIC01MCw5ICs1MiwxMSBAQAogICAgIH5Qcm9maWxlQXR0cmlidXRlKCkgPSBkZWZhdWx0OwogCiAgICAgY29uc3QgQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICZjb250cm9sbGVyXzsgfQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmaWxlX25hbWVfOyB9Ci0gICAgdm9pZCBSZXNldChjb25zdCBDZ3JvdXBDb250cm9sbGVyJiBjb250cm9sbGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKSBvdmVycmlkZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBSZXNldChjb25zdCBDZ3JvdXBDb250cm9sbGVyJiBjb250cm9sbGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfdjJfbmFtZSkgb3ZlcnJpZGU7CiAKKyAgICBib29sIEdldFBhdGhGb3JQcm9jZXNzKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgYm9vbCBHZXRQYXRoRm9yVGFzayhpbnQgdGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgYm9vbCBHZXRQYXRoRm9yVUlEKHVpZF90IHVpZCwgc3RkOjpzdHJpbmcqIHBhdGgpIGNvbnN0IG92ZXJyaWRlOwogCkBAIC0xMzEsNiArMTM1LDggQEAKICAgICBjb25zdCBJUHJvZmlsZUF0dHJpYnV0ZSogYXR0cmlidXRlXzsKICAgICBzdGQ6OnN0cmluZyB2YWx1ZV87CiAgICAgYm9vbCBvcHRpb25hbF87CisKKyAgICBib29sIFdyaXRlVmFsdWVUb0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0OwogfTsKIAogLy8gU2V0IGNncm91cCBwcm9maWxlIGVsZW1lbnQKQEAgLTE1NCw3ICsxNjAsNyBAQAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZF9bUHJvZmlsZUFjdGlvbjo6UkNUX0NPVU5UXTsKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggZmRfbXV0ZXhfOwogCi0gICAgc3RhdGljIGJvb2wgQWRkVGlkVG9DZ3JvdXAoaW50IHRpZCwgaW50IGZkLCBjb25zdCBjaGFyKiBjb250cm9sbGVyX25hbWUpOworICAgIGJvb2wgQWRkVGlkVG9DZ3JvdXAoaW50IHRpZCwgaW50IGZkLCBSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlKSBjb25zdDsKICAgICBDYWNoZVVzZVJlc3VsdCBVc2VDYWNoZWRGZChSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlLCBpbnQgaWQpIGNvbnN0OwogfTsKIApkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL3Rhc2tfcHJvZmlsZXNfdGVzdC5jcHAgYi9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlc190ZXN0LmNwcAppbmRleCBlYWRiZTc2Li5iMTdlNjk1IDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlc190ZXN0LmNwcAorKysgYi9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlc190ZXN0LmNwcApAQCAtMTAyLDcgKzEwMiw4IEBACiAgIHB1YmxpYzoKICAgICBQcm9maWxlQXR0cmlidXRlTW9jayhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKSA6IGZpbGVfbmFtZV8oZmlsZV9uYW1lKSB7fQogICAgIH5Qcm9maWxlQXR0cmlidXRlTW9jaygpIG92ZXJyaWRlID0gZGVmYXVsdDsKLSAgICB2b2lkIFJlc2V0KGNvbnN0IENncm91cENvbnRyb2xsZXImIGNvbnRyb2xsZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUpIG92ZXJyaWRlIHsKKyAgICB2b2lkIFJlc2V0KGNvbnN0IENncm91cENvbnRyb2xsZXImIGNvbnRyb2xsZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV92Ml9uYW1lKSBvdmVycmlkZSB7CiAgICAgICAgIENIRUNLKGZhbHNlKTsKICAgICB9CiAgICAgY29uc3QgQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlcigpIGNvbnN0IG92ZXJyaWRlIHsKQEAgLTExMCw5ICsxMTEsMTIgQEAKICAgICAgICAgcmV0dXJuIHt9OwogICAgIH0KICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmlsZV9uYW1lXzsgfQorICAgIGJvb2wgR2V0UGF0aEZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBHZXRQYXRoRm9yVGFzayhwaWQsIHBhdGgpOworICAgIH0KICAgICBib29sIEdldFBhdGhGb3JUYXNrKGludCB0aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCBvdmVycmlkZSB7CiAjaWZkZWYgX19BTkRST0lEX18KLSAgICAgICAgQ0hFQ0soQ2dyb3VwR2V0Q29udHJvbGxlclBhdGgoQ0dST1VQVjJfQ09OVFJPTExFUl9OQU1FLCBwYXRoKSk7CisgICAgICAgIENIRUNLKENncm91cEdldENvbnRyb2xsZXJQYXRoKENHUk9VUFYyX0hJRVJBUkNIWV9OQU1FLCBwYXRoKSk7CiAgICAgICAgIENIRUNLX0dUKHBhdGgtPmxlbmd0aCgpLCAwKTsKICAgICAgICAgaWYgKHBhdGgtPnJiZWdpbigpWzBdICE9ICcvJykgewogICAgICAgICAgICAgKnBhdGggKz0gIi8iOwpAQCAtMTI1LDkgKzEyOSw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH07CiAKLSAgICBib29sIEdldFBhdGhGb3JVSUQodWlkX3QsIHN0ZDo6c3RyaW5nKikgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIGJvb2wgR2V0UGF0aEZvclVJRCh1aWRfdCwgc3RkOjpzdHJpbmcqKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCiAgIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lXzsKZGlmZiAtLWdpdCBhL2xpYnNwYXJzZS9BbmRyb2lkLmJwIGIvbGlic3BhcnNlL0FuZHJvaWQuYnAKaW5kZXggOGU4M2UxNi4uNDQ5MDdhMSAxMDA2NDQKLS0tIGEvbGlic3BhcnNlL0FuZHJvaWQuYnAKKysrIGIvbGlic3BhcnNlL0FuZHJvaWQuYnAKQEAgLTI4LDYgKzI4LDkgQEAKICAgICAgICAgImxpYmJhc2UiLAogICAgIF0sCiAgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKICAgICAgICAgd2luZG93czogewogICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgfSwKQEAgLTM4LDkgKzQxLDggQEAKICAgICBdLAogfQogCi1jY19iaW5hcnkgeworY2NfYmluYXJ5X2hvc3QgewogICAgIG5hbWU6ICJzaW1nMmltZyIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc3JjczogWwogICAgICAgICAic2ltZzJpbWcuY3BwIiwKICAgICAgICAgInNwYXJzZV9jcmMzMi5jcHAiLApAQCAtNTIsMTEgKzU0LDE1IEBACiAgICAgXSwKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCi1jY19iaW5hcnkgeworY2NfYmluYXJ5X2hvc3QgewogICAgIG5hbWU6ICJpbWcyc2ltZyIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc3JjczogWyJpbWcyc2ltZy5jcHAiXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3BhcnNlIiwKZGlmZiAtLWdpdCBhL2xpYnN0YXRzL09XTkVSUyBiL2xpYnN0YXRzL09XTkVSUwppbmRleCBkMzkxNjc5Li5lZmQzNjg2IDEwMDY0NAotLS0gYS9saWJzdGF0cy9PV05FUlMKKysrIGIvbGlic3RhdHMvT1dORVJTCkBAIC0xLDggKzEsOCBAQAogamVmZnJleWh1YW5nQGdvb2dsZS5jb20KLWp0bmd1eWVuQGdvb2dsZS5jb20KK21vbmljYW13YW5nQGdvb2dsZS5jb20KIG11aGFtbWFkcUBnb29nbGUuY29tCityYXloZGV6QGdvb2dsZS5jb20KIHNoYXJhaWVua29AZ29vZ2xlLmNvbQogc2luZ2h0ZWppbmRlckBnb29nbGUuY29tCiB0c2FpY2hyaXN0aW5lQGdvb2dsZS5jb20KIHlhb2NoZW5AZ29vZ2xlLmNvbQoteXJvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2xpYnN0YXRzL3B1bGxfcnVzdC9BbmRyb2lkLmJwIGIvbGlic3RhdHMvcHVsbF9ydXN0L0FuZHJvaWQuYnAKaW5kZXggODVhMzhmOC4uNDYwOWU2YiAxMDA2NDQKLS0tIGEvbGlic3RhdHMvcHVsbF9ydXN0L0FuZHJvaWQuYnAKKysrIGIvbGlic3RhdHMvcHVsbF9ydXN0L0FuZHJvaWQuYnAKQEAgLTI4LDcgKzI4LDYgQEAKICAgICBdLAogICAgIHNvdXJjZV9zdGVtOiAiYmluZGluZ3MiLAogICAgIGJpbmRnZW5fZmxhZ3M6IFsKLSAgICAgICAgIi0tc2l6ZV90LWlzLXVzaXplIiwKICAgICAgICAgIi0tYWxsb3dsaXN0LWZ1bmN0aW9uPUFTdGF0c0V2ZW50TGlzdF9hZGRTdGF0c0V2ZW50IiwKICAgICAgICAgIi0tYWxsb3dsaXN0LWZ1bmN0aW9uPUFTdGF0c0V2ZW50Xy4qIiwKICAgICAgICAgIi0tYWxsb3dsaXN0LWZ1bmN0aW9uPUFTdGF0c01hbmFnZXJfLioiLApkaWZmIC0tZ2l0IGEvbGlic3RhdHMvcHVsbF9ydXN0L3N0YXRzX3B1bGwucnMgYi9saWJzdGF0cy9wdWxsX3J1c3Qvc3RhdHNfcHVsbC5ycwppbmRleCAwOWIyNjIzLi5kMTg4YjVmIDEwMDY0NAotLS0gYS9saWJzdGF0cy9wdWxsX3J1c3Qvc3RhdHNfcHVsbC5ycworKysgYi9saWJzdGF0cy9wdWxsX3J1c3Qvc3RhdHNfcHVsbC5ycwpAQCAtMTExLDcgKzExMSw5IEBACiAgICAgc3RhdGljIHJlZiBDT09LSUVTOiBNdXRleDxIYXNoTWFwPGkzMiwgZm4oKSAtPiBTdGF0c1B1bGxSZXN1bHQ+PiA9IE11dGV4OjpuZXcoSGFzaE1hcDo6bmV3KCkpOwogfQogCi0vLyBTYWZldHk6IFdlIHN0b3JlIG91ciBjYWxsYmFja3MgaW4gdGhlIGdsb2JhbCBzbyB0aGV5IGFyZSB2YWxpZC4KKy8vLyAjIFNhZmV0eQorLy8vCisvLy8gYGRhdGFgIG11c3QgYmUgYSB2YWxpZCBwb2ludGVyIHdpdGggbm8gYWxpYXNlcy4KIHVuc2FmZSBleHRlcm4gIkMiIGZuIGNhbGxiYWNrX3dyYXBwZXIoCiAgICAgYXRvbV90YWc6IGkzMiwKICAgICBkYXRhOiAqbXV0IEFTdGF0c0V2ZW50TGlzdCwKQEAgLTEyNiw3ICsxMjgsOCBAQAogICAgICAgICAgICAgICAgIGxldCBzdGF0cyA9IGNiKCk7CiAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHN0YXRzCiAgICAgICAgICAgICAgICAgICAgIC5pdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLm1hcCh8c3RhdHwgc3RhdC5hZGRfYXN0YXRzX2V2ZW50KCZtdXQgKmRhdGEpKQorICAgICAgICAgICAgICAgICAgICAvLyBTYWZldHk6IFRoZSBjYWxsZXIgcHJvbWlzZXMgdGhhdCBgZGF0YWAgaXMgdmFsaWQgYW5kIHVuYWxpYXNlZC4KKyAgICAgICAgICAgICAgICAgICAgLm1hcCh8c3RhdHwgc3RhdC5hZGRfYXN0YXRzX2V2ZW50KHVuc2FmZSB7ICZtdXQgKmRhdGEgfSkpCiAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzwoKT4sIFN0YXRzRXJyb3I+PigpOwogICAgICAgICAgICAgICAgIG1hdGNoIHJlc3VsdCB7CiAgICAgICAgICAgICAgICAgICAgIE9rKF8pID0+IHsKZGlmZiAtLWdpdCBhL2xpYnN0YXRzL3B1c2hfY29tcGF0L0FuZHJvaWQuYnAgYi9saWJzdGF0cy9wdXNoX2NvbXBhdC9BbmRyb2lkLmJwCmluZGV4IDgxOTA2NmUuLmM1YzE5MzQgMTAwNjQ0Ci0tLSBhL2xpYnN0YXRzL3B1c2hfY29tcGF0L0FuZHJvaWQuYnAKKysrIGIvbGlic3RhdHMvcHVzaF9jb21wYXQvQW5kcm9pZC5icApAQCAtMjYsNyArMjYsNyBAQAogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJzdGF0c3B1c2hfY29tcGF0X2RlZmF1bHRzIiwKICAgICBzcmNzOiBbCi0gICAgICAgICJzdGF0c2Rfd3JpdGVyLmMiLAorICAgICAgICAic3RhdHNkX3dyaXRlci5jcHAiLAogICAgICAgICAic3RhdHNfZXZlbnRfbGlzdC5jIiwKICAgICAgICAgIlN0YXRzRXZlbnRDb21wYXQuY3BwIgogICAgIF0sCmRpZmYgLS1naXQgYS9saWJzdGF0cy9wdXNoX2NvbXBhdC9zdGF0c2Rfd3JpdGVyLmMgYi9saWJzdGF0cy9wdXNoX2NvbXBhdC9zdGF0c2Rfd3JpdGVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBsaWJzdGF0cy9wdXNoX2NvbXBhdC9zdGF0c2Rfd3JpdGVyLmMKcmVuYW1lIHRvIGxpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuY3BwCmluZGV4IDQ4MThkMTEuLmEzNjAwZjMgMTAwNjQ0Ci0tLSBhL2xpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuYworKysgYi9saWJzdGF0cy9wdXNoX2NvbXBhdC9zdGF0c2Rfd3JpdGVyLmNwcApAQCAtMTUsOSArMTUsOSBAQAogICovCiAjaW5jbHVkZSAic3RhdHNkX3dyaXRlci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvZnMuaD4KICNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgotI2luY2x1ZGUgPGN1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY2FzZSAtRUNPTk5SRUZVU0VEOgogICAgICAgICAgICAgICAgICAgICBjYXNlIC1FTk9FTlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBpID0gYXRvbWljX2V4Y2hhbmdlKCZzdGF0c2RMb2dnZXJXcml0ZS5zb2NrLCByZXQpOwotICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhSVSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgKiAgfTsKICAgICAgKi8KIAotICAgIGhlYWRlci50aWQgPSBnZXR0aWQoKTsKKyAgICBoZWFkZXIudGlkID0gYW5kcm9pZDo6YmFzZTo6R2V0VGhyZWFkSWQoKTsKICAgICBoZWFkZXIucmVhbHRpbWUudHZfc2VjID0gdHMtPnR2X3NlYzsKICAgICBoZWFkZXIucmVhbHRpbWUudHZfbnNlYyA9IHRzLT50dl9uc2VjOwogCkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gLWVycm5vOwogICAgICAgICAgICAgfQotICAgICAgICAvKiBGQUxMVEhSVSAqLworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzdGF0cy9wdXNoX2NvbXBhdC9zdGF0c2Rfd3JpdGVyLmggYi9saWJzdGF0cy9wdXNoX2NvbXBhdC9zdGF0c2Rfd3JpdGVyLmgKaW5kZXggZmUyZDM3Yy4uZjAzMGI5NiAxMDA2NDQKLS0tIGEvbGlic3RhdHMvcHVzaF9jb21wYXQvc3RhdHNkX3dyaXRlci5oCisrKyBiL2xpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuaApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KIAorX19CRUdJTl9ERUNMUworCiAvKioKICAqIEludGVybmFsIGxvY2sgc2hvdWxkIG5vdCBiZSBleHBvc2VkLiBUaGlzIGlzIGJhZCBkZXNpZ24uCiAgKiBUT0RPOiByZXdyaXRlIGl0IGluIGMrKyBjb2RlIGFuZCBlbmNhcHN1bGF0ZSB0aGUgZnVuY3Rpb25hbGl0eSBpbiBhCkBAIC00Miw0ICs0NCw2IEBACiAgICAgdm9pZCAoKm5vdGVEcm9wKShpbnQgZXJyb3IsIGludCB0YWcpOwogfTsKIAorX19FTkRfREVDTFMKKwogI2VuZGlmICAvLyBBTkRST0lEX1NUQVRTX0xPR19TVEFUU19XUklURVJfSApkaWZmIC0tZ2l0IGEvbGlic3lzdXRpbHMvQW5kcm9pZC5icCBiL2xpYnN5c3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggNWY0NzJiMi4uMWI0MWE2YiAxMDA2NDQKLS0tIGEvbGlic3lzdXRpbHMvQW5kcm9pZC5icAorKysgYi9saWJzeXN1dGlscy9BbmRyb2lkLmJwCkBAIC0yOSw2ICsyOSwxMCBAQAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImJwZl9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICB0aWR5OiB0cnVlLApkaWZmIC0tZ2l0IGEvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtFdmVudC5jcHAgYi9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcAppbmRleCA1MTVjYzEwLi41NWJiZTQ2IDEwMDY0NAotLS0gYS9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcAorKysgYi9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcApAQCAtMzcsMTAgKzM3LDEyIEBACiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGJwZi9LZXJuZWxVdGlscy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rRXZlbnQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UGFyc2VJbnQ7Cit1c2luZyBhbmRyb2lkOjpicGY6OmlzS2VybmVsNjRCaXQ7CiAKIC8qIEZyb20ga2VybmVsJ3MgbmV0L25ldGZpbHRlci94dF9xdW90YTIuYyAqLwogY29uc3QgaW50IExPQ0FMX1FMT0dfTkxfRVZFTlQgPSAxMTI7CkBAIC0xMzgsNjAgKzE0MCw2IEBACiBzdGF0aWNfYXNzZXJ0KHNpemVvZih1bG9nX3BhY2tldF9tc2czMl90KSA9PSAxNjgpOwogc3RhdGljX2Fzc2VydChzaXplb2YodWxvZ19wYWNrZXRfbXNnNjRfdCkgPT0gMTkyKTsKIAotLy8gRmlndXJlIG91dCB0aGUgYml0bmVzcyBvZiB1c2Vyc3BhY2UuCi0vLyBUcml2aWFsIGFuZCBrbm93biBhdCBjb21waWxlIHRpbWUuCi1zdGF0aWMgYm9vbCBpc1VzZXJzcGFjZTY0Yml0KHZvaWQpIHsKLSAgICByZXR1cm4gc2l6ZW9mKGxvbmcpID09IDg7Ci19Ci0KLS8vIEZpZ3VyZSBvdXQgdGhlIGJpdG5lc3Mgb2YgdGhlIGtlcm5lbC4KLXN0YXRpYyBib29sIGlzS2VybmVsNjRCaXQodm9pZCkgewotICAgIC8vIGEgNjQtYml0IHVzZXJzcGFjZSByZXF1aXJlcyBhIDY0LWJpdCBrZXJuZWwKLSAgICBpZiAoaXNVc2Vyc3BhY2U2NGJpdCgpKSByZXR1cm4gdHJ1ZTsKLQotICAgIHN0YXRpYyBib29sIGluaXQgPSBmYWxzZTsKLSAgICBzdGF0aWMgYm9vbCBjYWNoZSA9IGZhbHNlOwotICAgIGlmIChpbml0KSByZXR1cm4gY2FjaGU7Ci0KLSAgICAvLyBSZXRyaWV2ZSBjdXJyZW50IHBlcnNvbmFsaXR5IC0gb24gTGludXggdGhpcyBzeXN0ZW0gY2FsbCAqY2Fubm90KiBmYWlsLgotICAgIGludCBwID0gcGVyc29uYWxpdHkoMHhmZmZmZmZmZik7Ci0gICAgLy8gQnV0IGlmIGl0IGRvZXMganVzdCBhc3N1bWUga2VybmVsIGFuZCB1c2Vyc3BhY2UgKHdoaWNoIGlzIDMyLWJpdCkgbWF0Y2guLi4KLSAgICBpZiAocCA9PSAtMSkgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IG1hc2sgb3V0IHRoZSBib3R0b20gOCBiaXRzLCBhbmQgc3dpdGNoIHRvICduYXRpdmUnCi0gICAgLy8gcGVyc29uYWxpdHksIGFuZCB0aGVuIHJldHVybiB0aGUgcHJldmlvdXMgcGVyc29uYWxpdHkgb2YgdGhpcyB0aHJlYWQKLSAgICAvLyAobGlrZWx5IFBFUl9MSU5VWCBvciBQRVJfTElOVVgzMikgd2l0aCBhbnkgZXh0cmEgb3B0aW9ucyB1bm1vZGlmaWVkLgotICAgIGludCBxID0gcGVyc29uYWxpdHkoKHAgJiB+UEVSX01BU0spIHwgUEVSX0xJTlVYKTsKLSAgICAvLyBQZXIgbWFuIHBhZ2UgdGhpcyB0aGVvcmV0aWNhbGx5IGNvdWxkIGVycm9yIG91dCB3aXRoIEVJTlZBTCwKLSAgICAvLyBidXQga2VybmVsIGNvZGUgYW5hbHlzaXMgc3VnZ2VzdHMgc2V0dGluZyBQRVJfTElOVVggY2Fubm90IGZhaWwuCi0gICAgLy8gRWl0aGVyIHdheSwgYXNzdW1lIGtlcm5lbCBhbmQgdXNlcnNwYWNlICh3aGljaCBpcyAzMi1iaXQpIG1hdGNoLi4uCi0gICAgaWYgKHEgIT0gcCkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RydWN0IHV0c25hbWUgdTsKLSAgICAodm9pZCl1bmFtZSgmdSk7ICAvLyBvbmx5IHBvc3NpYmxlIGZhaWx1cmUgaXMgRUZBVUxULCBidXQgdSBpcyBvbiBzdGFjay4KLQotICAgIC8vIFN3aXRjaCBiYWNrIHRvIHByZXZpb3VzIHBlcnNvbmFsaXR5LgotICAgIC8vIFRoZW9yZXRpY2FsbHkgY291bGQgZmFpbCB3aXRoIEVJTlZBTCBvbiBhcm02NCB3aXRoIG5vIDMyLWJpdCBzdXBwb3J0LAotICAgIC8vIGJ1dCB0aGVuIHdlIHdvdWxkbid0IGhhdmUgZmV0Y2hlZCAncCcgZnJvbSB0aGUga2VybmVsIGluIHRoZSBmaXJzdCBwbGFjZS4KLSAgICAvLyBFaXRoZXIgd2F5IHRoZXJlJ3Mgbm90aGluZyBtZWFuaW5ndWwgd2UgY2FuIGRvIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAgLy8gU2luY2UgUEVSX0xJTlVYMzIgdnMgUEVSX0xJTlVYIG9ubHkgYWZmZWN0cyB1bmFtZS5tYWNoaW5lIGl0IGRvZXNuJ3QKLSAgICAvLyByZWFsbHkgaHVydCB1cyBlaXRoZXIuICBXZSdyZSByZWFsbHkganVzdCBzd2l0Y2hpbmcgYmFjayB0byBiZSAnY2xlYW4nLgotICAgICh2b2lkKXBlcnNvbmFsaXR5KHApOwotCi0gICAgLy8gUG9zc2libGUgdmFsdWVzIG9mIHV0c25hbWUubWFjaGluZSBvYnNlcnZlZCBvbiB4ODZfNjQgZGVza3RvcCAoYXJtIHZpYSBxZW11KToKLSAgICAvLyAgIHg4Nl82NCBpNjg2IGFhcmNoNjQgYXJtdjdsCi0gICAgLy8gYWRkaXRpb25hbGx5IG9ic2VydmVkIG9uIGFybSBkZXZpY2U6Ci0gICAgLy8gICBhcm12OGwKLSAgICAvLyBwcmVzdW1hYmx5IGFsc28gbWlnaHQganVzdCBiZSBwb3NzaWJsZToKLSAgICAvLyAgIGkzODYgaTQ4NiBpNTg2Ci0gICAgLy8gYW5kIHRoZXJlIG1pZ2h0IGJlIG90aGVyIHdlaXJkIGFybTMyIGNhc2VzLgotICAgIC8vIFdlIG5vdGUgdGhhdCB0aGUgNjQgaXMgcHJlc2VudCBpbiBib3RoIDY0LWJpdCBhcmNocywKLSAgICAvLyBhbmQgaW4gZ2VuZXJhbCBpcyBsaWtlbHkgdG8gYmUgcHJlc2VudCBpbiBvbmx5IDY0LWJpdCBhcmNocy4KLSAgICBjYWNoZSA9ICEhc3Ryc3RyKHUubWFjaGluZSwgIjY0Iik7Ci0gICAgaW5pdCA9IHRydWU7Ci0gICAgcmV0dXJuIGNhY2hlOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBOZXRsaW5rRXZlbnQ6Ok5ldGxpbmtFdmVudCgpIHsKQEAgLTIwMiwxNSArMTUwLDEwIEBACiB9CiAKIE5ldGxpbmtFdmVudDo6fk5ldGxpbmtFdmVudCgpIHsKLSAgICBpbnQgaTsKLSAgICBpZiAobVBhdGgpCi0gICAgICAgIGZyZWUobVBhdGgpOwotICAgIGlmIChtU3Vic3lzdGVtKQotICAgICAgICBmcmVlKG1TdWJzeXN0ZW0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBOTF9QQVJBTVNfTUFYOyBpKyspIHsKLSAgICAgICAgaWYgKCFtUGFyYW1zW2ldKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGZyZWUobVBhcmFtc1tpXSk7CisgICAgZnJlZShtUGF0aCk7CisgICAgZnJlZShtU3Vic3lzdGVtKTsKKyAgICBmb3IgKGF1dG8gcGFyYW0gOiBtUGFyYW1zKSB7CisgICAgICAgIGZyZWUocGFyYW0pOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvQW5kcm9pZC5icCBiL2xpYnV0aWxzL0FuZHJvaWQuYnAKaW5kZXggMTYyZjBmNC4uYWQ1Yjc1MiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvQW5kcm9pZC5icAorKysgYi9saWJ1dGlscy9BbmRyb2lkLmJwCkBAIC01Niw3ICs1Niw3IEBACiB9CiAKIGNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGlidXRpbHNfZGVmYXVsdHMiLAorICAgIG5hbWU6ICJsaWJ1dGlsc19kZWZhdWx0c19ub2RlcHMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgcHJvZHVjdF9hdmFpbGFibGU6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLApAQCAtNjgsMTggKzY4LDcgQEAKICAgICAgICAgIi1Xbm8tZXhpdC10aW1lLWRlc3RydWN0b3JzIiwKICAgICAgICAgIi1EQU5EUk9JRF9VVElMU19SRUZfQkFTRV9ESVNBQkxFX0lNUExJQ0lUX0NPTlNUUlVDVElPTiIsCiAgICAgXSwKLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKLSAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAotICAgIF0sCi0gICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwotICAgICAgICAibGlidXRpbHNfaGVhZGVycyIsCi0gICAgXSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImludGVnZXIiXSwKICAgICB9LApAQCAtMTI1LDYgKzExNCwxOCBAQAogfQogCiBjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnV0aWxzX2RlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlidXRpbHNfZGVmYXVsdHNfbm9kZXBzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCit9CisKK2NjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGlidXRpbHNfaW1wbF9kZWZhdWx0cyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYnV0aWxzX2RlZmF1bHRzIiwKQEAgLTEzMiwyNSArMTMzLDI3IEBACiAgICAgXSwKICAgICBuYXRpdmVfYnJpZGdlX3N1cHBvcnRlZDogdHJ1ZSwKIAorICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYnV0aWxzX2JpbmRlciJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBzcmNzOiBbCi0gICAgICAgICJFcnJvcnMuY3BwIiwKICAgICAgICAgIkZpbGVNYXAuY3BwIiwKICAgICAgICAgIkplbmtpbnNIYXNoLmNwcCIsCiAgICAgICAgICJMaWdodFJlZkJhc2UuY3BwIiwKICAgICAgICAgIk5hdGl2ZUhhbmRsZS5jcHAiLAogICAgICAgICAiUHJpbnRlci5jcHAiLAotICAgICAgICAiUmVmQmFzZS5jcHAiLAotICAgICAgICAiU2hhcmVkQnVmZmVyLmNwcCIsCiAgICAgICAgICJTdG9wV2F0Y2guY3BwIiwKLSAgICAgICAgIlN0cmluZzguY3BwIiwKLSAgICAgICAgIlN0cmluZzE2LmNwcCIsCi0gICAgICAgICJTdHJvbmdQb2ludGVyLmNwcCIsCiAgICAgICAgICJTeXN0ZW1DbG9jay5jcHAiLAogICAgICAgICAiVGhyZWFkcy5jcHAiLAogICAgICAgICAiVGltZXJzLmNwcCIsCiAgICAgICAgICJUb2tlbml6ZXIuY3BwIiwKLSAgICAgICAgIlVuaWNvZGUuY3BwIiwKLSAgICAgICAgIlZlY3RvckltcGwuY3BwIiwKICAgICAgICAgIm1pc2MuY3BwIiwKICAgICBdLAogCkBAIC0xODUsMTAgKzE4OCwyMyBAQAogICAgICAgICBzdXBwb3J0X3N5c3RlbV9wcm9jZXNzOiB0cnVlLAogICAgIH0sCiAKLSAgICBoZWFkZXJfYWJpX2NoZWNrZXI6IHsKLSAgICAgICAgLy8gQUZETyBhZmZlY3RzIHdlYWsgc3ltYm9scy4KLSAgICAgICAgZGlmZl9mbGFnczogWyItYWxsb3ctYWRkaW5nLXJlbW92aW5nLXdlYWstc3ltYm9scyJdLAotICAgICAgICByZWZfZHVtcF9kaXJzOiBbImFiaS1kdW1wcyJdLAorICAgIHRhcmdldDogeworICAgICAgICBwcm9kdWN0OiB7CisgICAgICAgICAgICBoZWFkZXJfYWJpX2NoZWNrZXI6IHsKKyAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgICAgIC8vIEFGRE8gYWZmZWN0cyB3ZWFrIHN5bWJvbHMuCisgICAgICAgICAgICAgICAgZGlmZl9mbGFnczogWyItYWxsb3ctYWRkaW5nLXJlbW92aW5nLXdlYWstc3ltYm9scyJdLAorICAgICAgICAgICAgICAgIHJlZl9kdW1wX2RpcnM6IFsiYWJpLWR1bXBzIl0sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICB2ZW5kb3I6IHsKKyAgICAgICAgICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogeworICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgLy8gQUZETyBhZmZlY3RzIHdlYWsgc3ltYm9scy4KKyAgICAgICAgICAgICAgICBkaWZmX2ZsYWdzOiBbIi1hbGxvdy1hZGRpbmctcmVtb3Zpbmctd2Vhay1zeW1ib2xzIl0sCisgICAgICAgICAgICAgICAgcmVmX2R1bXBfZGlyczogWyJhYmktZHVtcHMiXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCiAgICAgfSwKIH0KIApAQCAtMTk3LDcgKzIxMyw3IEBACiAgICAgZGVmYXVsdHM6IFsibGlidXRpbHNfaW1wbF9kZWZhdWx0cyJdLAogCiAgICAgY2ZsYWdzOiBbCi0gICAgICAgICItRENBTExTVEFDS1M9MSIsCisgICAgICAgICItRERFQlVHX0NBTExCQUNLUz0xIiwKICAgICAgICAgIi1EREVCVUdfUE9MTF9BTkRfV0FLRT0xIiwKICAgICAgICAgIi1EREVCVUdfUkVGUz0xIiwKICAgICAgICAgIi1EREVCVUdfVE9LRU5JWkVSPTEiLApAQCAtMjE3LDYgKzIzMywxNCBAQAogICAgICAgICBzdXBwb3J0X3N5c3RlbV9wcm9jZXNzOiB0cnVlLAogICAgIH0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlidXRpbHNfaGVhZGVycyIsCisgICAgXSwKKwogICAgIHNyY3M6IFsKICAgICAgICAgIkNhbGxTdGFjay5jcHAiLAogICAgIF0sCkBAIC0yNjQsMjQgKzI4OCw2IEBACiB9CiAKIGNjX2Z1enogewotICAgIG5hbWU6ICJsaWJ1dGlsc19mdXp6X3N0cmluZzgiLAotICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbIlN0cmluZzhfZnV6ei5jcHAiXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImxpYnV0aWxzX2Z1enpfc3RyaW5nMTYiLAotICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbIlN0cmluZzE2X2Z1enouY3BwIl0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJsaWJ1dGlsc19mdXp6X3ZlY3RvciIsCi0gICAgZGVmYXVsdHM6IFsibGlidXRpbHNfZnV6el9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsiVmVjdG9yX2Z1enouY3BwIl0sCi19Ci0KLWNjX2Z1enogewogICAgIG5hbWU6ICJsaWJ1dGlsc19mdXp6X3ByaW50ZXIiLAogICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2Z1enpfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbIlByaW50ZXJfZnV6ei5jcHAiXSwKQEAgLTMwNiwxMiArMzEyLDYgQEAKIH0KIAogY2NfZnV6eiB7Ci0gICAgbmFtZTogImxpYnV0aWxzX2Z1enpfcmVmYmFzZSIsCi0gICAgZGVmYXVsdHM6IFsibGlidXRpbHNfZnV6el9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsiUmVmQmFzZV9mdXp6LmNwcCJdLAotfQotCi1jY19mdXp6IHsKICAgICBuYW1lOiAibGlidXRpbHNfZnV6el9scnVjYWNoZSIsCiAgICAgZGVmYXVsdHM6IFsibGlidXRpbHNfZnV6el9kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsiTHJ1Q2FjaGVfZnV6ei5jcHAiXSwKQEAgLTMzMCwxOCArMzMwLDExIEBACiAgICAgc3JjczogWwogICAgICAgICAiQml0U2V0X3Rlc3QuY3BwIiwKICAgICAgICAgIkNhbGxTdGFja190ZXN0LmNwcCIsCi0gICAgICAgICJFcnJvcnNfdGVzdC5jcHAiLAogICAgICAgICAiRmlsZU1hcF90ZXN0LmNwcCIsCiAgICAgICAgICJMcnVDYWNoZV90ZXN0LmNwcCIsCiAgICAgICAgICJNdXRleF90ZXN0LmNwcCIsCi0gICAgICAgICJTaGFyZWRCdWZmZXJfdGVzdC5jcHAiLAogICAgICAgICAiU2luZ2xldG9uX3Rlc3QuY3BwIiwKLSAgICAgICAgIlN0cmluZzE2X3Rlc3QuY3BwIiwKLSAgICAgICAgIlN0cmluZzhfdGVzdC5jcHAiLAotICAgICAgICAiU3Ryb25nUG9pbnRlcl90ZXN0LmNwcCIsCiAgICAgICAgICJUaW1lcnNfdGVzdC5jcHAiLAotICAgICAgICAiVW5pY29kZV90ZXN0LmNwcCIsCi0gICAgICAgICJWZWN0b3JfdGVzdC5jcHAiLAogICAgIF0sCiAKICAgICB0YXJnZXQ6IHsKQEAgLTM2Myw3ICszNTYsNiBAQAogICAgICAgICBsaW51eDogewogICAgICAgICAgICAgc3JjczogWwogICAgICAgICAgICAgICAgICJMb29wZXJfdGVzdC5jcHAiLAotICAgICAgICAgICAgICAgICJSZWZCYXNlX3Rlc3QuY3BwIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCiAgICAgICAgIGhvc3Q6IHsKQEAgLTQxNyw5ICs0MDksMyBAQAogICAgIHNoYXJlZF9saWJzOiBbImxpYnV0aWxzX3Rlc3Rfc2luZ2xldG9uMSJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYnV0aWxzX2hlYWRlcnMiXSwKIH0KLQotY2NfYmVuY2htYXJrIHsKLSAgICBuYW1lOiAibGlidXRpbHNfYmVuY2htYXJrIiwKLSAgICBzcmNzOiBbIlZlY3Rvcl9iZW5jaG1hcmsuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGlidXRpbHMiXSwKLX0KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL0NhbGxTdGFjay5jcHAgYi9saWJ1dGlscy9DYWxsU3RhY2suY3BwCmluZGV4IDRkY2IzNWIuLmZlODI3ZWIgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL0NhbGxTdGFjay5jcHAKKysrIGIvbGlidXRpbHMvQ2FsbFN0YWNrLmNwcApAQCAtMTgsNyArMTgsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvUHJpbnRlci5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgPHVud2luZHN0YWNrL0FuZHJvaWRVbndpbmRlci5oPgogCkBAIC04Miw3ICs4Miw3IEBACiAKIHZvaWQgQ2FsbFN0YWNrOjpwcmludChQcmludGVyJiBwcmludGVyKSBjb25zdCB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRnJhbWVMaW5lcy5zaXplKCk7IGkrKykgewotICAgICAgICBwcmludGVyLnByaW50TGluZShtRnJhbWVMaW5lc1tpXSk7CisgICAgICAgIHByaW50ZXIucHJpbnRMaW5lKG1GcmFtZUxpbmVzW2ldLmNfc3RyKCkpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvRmlsZU1hcC5jcHAgYi9saWJ1dGlscy9GaWxlTWFwLmNwcAppbmRleCAwYWJiODYxLi4zYWNiY2U5IDEwMDY0NAotLS0gYS9saWJ1dGlscy9GaWxlTWFwLmNwcAorKysgYi9saWJ1dGlscy9GaWxlTWFwLmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2RlZmluZSBMT0dfVEFHICJmaWxlbWFwIgogCiAjaW5jbHVkZSA8dXRpbHMvRmlsZU1hcC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9fVVNFX01JTkdXX0FOU0lfU1RESU8pCiAjIGRlZmluZSBQUklkMzIgIkkzMmQiCmRpZmYgLS1naXQgYS9saWJ1dGlscy9Mb29wZXIuY3BwIGIvbGlidXRpbHMvTG9vcGVyLmNwcAppbmRleCA0MDJlNDNjLi43NzAwYzkwIDEwMDY0NAotLS0gYS9saWJ1dGlscy9Mb29wZXIuY3BwCisrKyBiL2xpYnV0aWxzL0xvb3Blci5jcHAKQEAgLTUzMiw5ICs1MzIsMzMgQEAKICAgICByZXR1cm4gcmVtb3ZlU2VxdWVuY2VOdW1iZXJMb2NrZWQoaXQtPnNlY29uZCk7CiB9CiAKK2ludCBMb29wZXI6OnJlcG9sbChpbnQgZmQpIHsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIGNvbnN0IGF1dG8mIGl0ID0gbVNlcXVlbmNlTnVtYmVyQnlGZC5maW5kKGZkKTsKKyAgICBpZiAoaXQgPT0gbVNlcXVlbmNlTnVtYmVyQnlGZC5lbmQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvJiByZXF1ZXN0X2l0ID0gbVJlcXVlc3RzLmZpbmQoaXQtPnNlY29uZCk7CisgICAgaWYgKHJlcXVlc3RfaXQgPT0gbVJlcXVlc3RzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBhdXRvJiBbc2VxLCByZXF1ZXN0XSA9ICpyZXF1ZXN0X2l0OworCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRigKKyAgICAgICAgICAgIGZkICE9IHJlcXVlc3QuZmQsCisgICAgICAgICAgICAiTG9vcGVyIGhhcyBpbmNvbnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUuIFdoZW4gbG9va2luZyB1cCBGRCAlZCBmb3VuZCBGRCAlZC4iLCBmZCwKKyAgICAgICAgICAgIHJlcXVlc3RfaXQtPnNlY29uZC5mZCk7CisKKyAgICBlcG9sbF9ldmVudCBldmVudEl0ZW0gPSBjcmVhdGVFcG9sbEV2ZW50KHJlcXVlc3QuZ2V0RXBvbGxFdmVudHMoKSwgc2VxKTsKKyAgICBpZiAoZXBvbGxfY3RsKG1FcG9sbEZkLmdldCgpLCBFUE9MTF9DVExfTU9ELCBmZCwgJmV2ZW50SXRlbSkgPT0gLTEpIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7ICAvLyBzdWNjZXNzCit9CisKIGludCBMb29wZXI6OnJlbW92ZVNlcXVlbmNlTnVtYmVyTG9ja2VkKFNlcXVlbmNlTnVtYmVyIHNlcSkgewogI2lmIERFQlVHX0NBTExCQUNLUwotICAgIEFMT0dEKCIlcCB+IHJlbW92ZUZkIC0gZmQ9JWQsIHNlcT0ldSIsIHRoaXMsIGZkLCBzZXEpOworICAgIEFMT0dEKCIlcCB+IHJlbW92ZUZkIC0gc2VxPSUiIFBSSXU2NCwgdGhpcywgc2VxKTsKICNlbmRpZgogCiAgICAgY29uc3QgYXV0byYgcmVxdWVzdF9pdCA9IG1SZXF1ZXN0cy5maW5kKHNlcSk7CmRpZmYgLS1naXQgYS9saWJ1dGlscy9McnVDYWNoZV90ZXN0LmNwcCBiL2xpYnV0aWxzL0xydUNhY2hlX3Rlc3QuY3BwCmluZGV4IDhiMTY5NDcuLjVjZDNjYmIgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL0xydUNhY2hlX3Rlc3QuY3BwCisrKyBiL2xpYnV0aWxzL0xydUNhY2hlX3Rlc3QuY3BwCkBAIC0yOSw2ICsyOSw4IEBACiBzdHJ1Y3QgQ29tcGxleEtleSB7CiAgICAgaW50IGs7CiAKKyAgICBleHBsaWNpdCBDb21wbGV4S2V5KCkgOiBrKDApIHsgaW5zdGFuY2VDb3VudCArPSAxOyB9CisKICAgICBleHBsaWNpdCBDb21wbGV4S2V5KGludCBrKSA6IGsoaykgewogICAgICAgICBpbnN0YW5jZUNvdW50ICs9IDE7CiAgICAgfQpAQCAtNTcsNiArNTksOCBAQAogc3RydWN0IENvbXBsZXhWYWx1ZSB7CiAgICAgaW50IHY7CiAKKyAgICBleHBsaWNpdCBDb21wbGV4VmFsdWUoKSA6IHYoMCkgeyBpbnN0YW5jZUNvdW50ICs9IDE7IH0KKwogICAgIGV4cGxpY2l0IENvbXBsZXhWYWx1ZShpbnQgdikgOiB2KHYpIHsKICAgICAgICAgaW5zdGFuY2VDb3VudCArPSAxOwogICAgIH0KQEAgLTgzLDEwICs4Nyw5IEBACiAKIHN0cnVjdCBLZXlGYWlsc09uQ29weSA6IHB1YmxpYyBDb21wbGV4S2V5IHsKICAgICBwdWJsaWM6Ci0gICAgS2V5RmFpbHNPbkNvcHkoY29uc3QgS2V5RmFpbHNPbkNvcHkmIGtleSkgOiBDb21wbGV4S2V5KGtleSkgewotICAgICAgICBBRERfRkFJTFVSRSgpOwotICAgIH0KLSAgICBLZXlGYWlsc09uQ29weShpbnQga2V5KSA6IENvbXBsZXhLZXkoa2V5KSB7IH0KKyAgICAgIEtleUZhaWxzT25Db3B5KCkgOiBDb21wbGV4S2V5KCkge30KKyAgICAgIEtleUZhaWxzT25Db3B5KGNvbnN0IEtleUZhaWxzT25Db3B5JiBrZXkpIDogQ29tcGxleEtleShrZXkpIHsgQUREX0ZBSUxVUkUoKTsgfQorICAgICAgS2V5RmFpbHNPbkNvcHkoaW50IGtleSkgOiBDb21wbGV4S2V5KGtleSkge30KIH07CiAKIH0gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9QcmludGVyLmNwcCBiL2xpYnV0aWxzL1ByaW50ZXIuY3BwCmluZGV4IGM5YWUyMTAuLjRiZDQ5ZjEgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1ByaW50ZXIuY3BwCisrKyBiL2xpYnV0aWxzL1ByaW50ZXIuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9QcmludGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCmRpZmYgLS1naXQgYS9saWJ1dGlscy9Qcm9jZXNzQ2FsbFN0YWNrLmNwcCBiL2xpYnV0aWxzL1Byb2Nlc3NDYWxsU3RhY2suY3BwCmluZGV4IGYwNTRkZTkuLjRiMjdiZGQgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1Byb2Nlc3NDYWxsU3RhY2suY3BwCisrKyBiL2xpYnV0aWxzL1Byb2Nlc3NDYWxsU3RhY2suY3BwCkBAIC0yMDUsOCArMjA1LDcgQEAKIH0KIAogdm9pZCBQcm9jZXNzQ2FsbFN0YWNrOjpwcmludEludGVybmFsKFByaW50ZXImIHByaW50ZXIsIFByaW50ZXImIGNzUHJpbnRlcikgY29uc3QgewotICAgIGR1bXBQcm9jZXNzSGVhZGVyKHByaW50ZXIsIGdldHBpZCgpLAotICAgICAgICAgICAgICAgICAgICAgIGdldFRpbWVTdHJpbmcobVRpbWVVcGRhdGVkKS5zdHJpbmcoKSk7CisgICAgZHVtcFByb2Nlc3NIZWFkZXIocHJpbnRlciwgZ2V0cGlkKCksIGdldFRpbWVTdHJpbmcobVRpbWVVcGRhdGVkKS5jX3N0cigpKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRocmVhZE1hcC5zaXplKCk7ICsraSkgewogICAgICAgICBwaWRfdCB0aWQgPSBtVGhyZWFkTWFwLmtleUF0KGkpOwpAQCAtMjE0LDcgKzIxMyw3IEBACiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHRocmVhZE5hbWUgPSB0aHJlYWRJbmZvLnRocmVhZE5hbWU7CiAKICAgICAgICAgcHJpbnRlci5wcmludExpbmUoIiIpOwotICAgICAgICBwcmludGVyLnByaW50Rm9ybWF0TGluZSgiXCIlc1wiIHN5c1RpZD0lZCIsIHRocmVhZE5hbWUuc3RyaW5nKCksIHRpZCk7CisgICAgICAgIHByaW50ZXIucHJpbnRGb3JtYXRMaW5lKCJcIiVzXCIgc3lzVGlkPSVkIiwgdGhyZWFkTmFtZS5jX3N0cigpLCB0aWQpOwogCiAgICAgICAgIHRocmVhZEluZm8uY2FsbFN0YWNrLnByaW50KGNzUHJpbnRlcik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvU3RvcFdhdGNoLmNwcCBiL2xpYnV0aWxzL1N0b3BXYXRjaC5jcHAKaW5kZXggMjhlMmQ3Ni4uYzg4ZDYwZiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3RvcFdhdGNoLmNwcAorKysgYi9saWJ1dGlscy9TdG9wV2F0Y2guY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAjZW5kaWYKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1N5c3RlbUNsb2NrLmNwcCBiL2xpYnV0aWxzL1N5c3RlbUNsb2NrLmNwcAppbmRleCA5YzcxMTQxLi5kZjNhODk4IDEwMDY0NAotLS0gYS9saWJ1dGlscy9TeXN0ZW1DbG9jay5jcHAKKysrIGIvbGlidXRpbHMvU3lzdGVtQ2xvY2suY3BwCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvVEVTVF9NQVBQSU5HIGIvbGlidXRpbHMvVEVTVF9NQVBQSU5HCmluZGV4IGM4ZWY0NWMuLjQ3MjE0NmYgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1RFU1RfTUFQUElORworKysgYi9saWJ1dGlscy9URVNUX01BUFBJTkcKQEAgLTIsNiArMiw5IEBACiAgICJwcmVzdWJtaXQiOiBbCiAgICAgewogICAgICAgIm5hbWUiOiAibGlidXRpbHNfdGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogImxpYnV0aWxzX2JpbmRlcl90ZXN0IgogICAgIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvVGhyZWFkcy5jcHAgYi9saWJ1dGlscy9UaHJlYWRzLmNwcAppbmRleCBlNzU2ZmVjLi45MGVhMjliIDEwMDY0NAotLS0gYS9saWJ1dGlscy9UaHJlYWRzLmNwcAorKysgYi9saWJ1dGlscy9UaHJlYWRzLmNwcApAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2VuZGlmCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQogI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuaD4KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1RpbWVycy5jcHAgYi9saWJ1dGlscy9UaW1lcnMuY3BwCmluZGV4IDRjZmFjNTcuLjk4MDgyYzkgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1RpbWVycy5jcHAKKysrIGIvbGlidXRpbHMvVGltZXJzLmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHRpbWUuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGNsb2NrX2lkX21heCA9IDU7CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1Rva2VuaXplci5jcHAgYi9saWJ1dGlscy9Ub2tlbml6ZXIuY3BwCmluZGV4IGMzZWMxNjUuLmFhMDk3YWUgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1Rva2VuaXplci5jcHAKKysrIGIvbGlidXRpbHMvVG9rZW5pemVyLmNwcApAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL1Rva2VuaXplci5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpZm5kZWYgREVCVUdfVE9LRU5JWkVSCiAvLyBFbmFibGVzIGRlYnVnIG91dHB1dCBmb3IgdGhlIHRva2VuaXplci4KQEAgLTUwLDE1ICs1MCwxNSBAQAogICAgICpvdXRUb2tlbml6ZXIgPSBudWxscHRyOwogCiAgICAgaW50IHJlc3VsdCA9IE9LOwotICAgIGludCBmZCA9IDo6b3BlbihmaWxlbmFtZS5zdHJpbmcoKSwgT19SRE9OTFkpOworICAgIGludCBmZCA9IDo6b3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JET05MWSk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICByZXN1bHQgPSAtZXJybm87Ci0gICAgICAgIEFMT0dFKCJFcnJvciBvcGVuaW5nIGZpbGUgJyVzJzogJXMiLCBmaWxlbmFtZS5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgQUxPR0UoIkVycm9yIG9wZW5pbmcgZmlsZSAnJXMnOiAlcyIsIGZpbGVuYW1lLmNfc3RyKCksIHN0cmVycm9yKGVycm5vKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RydWN0IHN0YXQgc3RhdDsKICAgICAgICAgaWYgKGZzdGF0KGZkLCAmc3RhdCkpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciBnZXR0aW5nIHNpemUgb2YgZmlsZSAnJXMnOiAlcyIsIGZpbGVuYW1lLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGdldHRpbmcgc2l6ZSBvZiBmaWxlICclcyc6ICVzIiwgZmlsZW5hbWUuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBzaXplX3Qoc3RhdC5zdF9zaXplKTsKIApAQCAtODAsNyArODAsNyBAQAogICAgICAgICAgICAgICAgIHNzaXplX3QgbnJkID0gcmVhZChmZCwgYnVmZmVyLCBsZW5ndGgpOwogICAgICAgICAgICAgICAgIGlmIChucmQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlYWRpbmcgZmlsZSAnJXMnOiAlcyIsIGZpbGVuYW1lLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBmaWxlICclcyc6ICVzIiwgZmlsZW5hbWUuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwogICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDYsNyArMTA2LDcgQEAKIAogU3RyaW5nOCBUb2tlbml6ZXI6OmdldExvY2F0aW9uKCkgY29uc3QgewogICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVzOiVkIiwgbUZpbGVuYW1lLnN0cmluZygpLCBtTGluZU51bWJlcik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJXM6JWQiLCBtRmlsZW5hbWUuY19zdHIoKSwgbUxpbmVOdW1iZXIpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1VuaWNvZGUuY3BwIGIvbGlidXRpbHMvVW5pY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZmNmN2UuLjAwMDAwMDAKLS0tIGEvbGlidXRpbHMvVW5pY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAidW5pY29kZSIKLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDx1dGlscy9Vbmljb2RlLmg+Ci0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLWV4dGVybiAiQyIgewotCi1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga0J5dGVNYXNrID0gMHgwMDAwMDBCRjsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrQnl0ZU1hcmsgPSAweDAwMDAwMDgwOwotCi0vLyBTdXJyb2dhdGVzIGFyZW4ndCB2YWxpZCBmb3IgVVRGLTMyIGNoYXJhY3RlcnMsIHNvIGRlZmluZSBzb21lCi0vLyBjb25zdGFudHMgdGhhdCB3aWxsIGxldCB1cyBzY3JlZW4gdGhlbSBvdXQuCi1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVIaWdoU3RhcnQgID0gMHgwMDAwRDgwMDsKLS8vIFVudXNlZCwgaGVyZSBmb3IgY29tcGxldGVuZXNzOgotLy8gc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlSGlnaEVuZCA9IDB4MDAwMERCRkY7Ci0vLyBzdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVMb3dTdGFydCA9IDB4MDAwMERDMDA7Ci1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVMb3dFbmQgICAgID0gMHgwMDAwREZGRjsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZVN0YXJ0ICAgICAgPSBrVW5pY29kZVN1cnJvZ2F0ZUhpZ2hTdGFydDsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUVuZCAgICAgICAgPSBrVW5pY29kZVN1cnJvZ2F0ZUxvd0VuZDsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZU1heENvZGVwb2ludCAgICAgICAgPSAweDAwMTBGRkZGOwotCi0vLyBNYXNrIHVzZWQgdG8gc2V0IGFwcHJvcHJpYXRlIGJpdHMgaW4gZmlyc3QgYnl0ZSBvZiBVVEYtOCBzZXF1ZW5jZSwKLS8vIGluZGV4ZWQgYnkgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzZXF1ZW5jZS4KLS8vIDB4eHh4eHh4Ci0vLyAtPiAoMDAtN2YpIDdiaXQuIEJpdCBtYXNrIGZvciB0aGUgZmlyc3QgYnl0ZSBpcyAweDAwMDAwMDAwCi0vLyAxMTB5eXl5eCAxMHh4eHh4eAotLy8gLT4gKGMwLWRmKSg4MC1iZikgMTFiaXQuIEJpdCBtYXNrIGlzIDB4MDAwMDAwQzAKLS8vIDExMTB5eXl5IDEweXh4eHh4IDEweHh4eHh4Ci0vLyAtPiAoZTAtZWYpKDgwLWJmKSg4MC1iZikgMTZiaXQuIEJpdCBtYXNrIGlzIDB4MDAwMDAwRTAKLS8vIDExMTEweXl5IDEweXl4eHh4IDEweHh4eHh4IDEweHh4eHh4Ci0vLyAtPiAoZjAtZjcpKDgwLWJmKSg4MC1iZikoODAtYmYpIDIxYml0LiBCaXQgbWFzayBpcyAweDAwMDAwMEYwCi1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga0ZpcnN0Qnl0ZU1hcmtbXSA9IHsKLSAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMEMwLCAweDAwMDAwMEUwLCAweDAwMDAwMEYwCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVVRGLTMyCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKioKLSAqIFJldHVybiBudW1iZXIgb2YgVVRGLTggYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBjaGFyYWN0ZXIuIElmIHRoZSBjaGFyYWN0ZXIKLSAqIGlzIGludmFsaWQsIHJldHVybiBzaXplIG9mIDAuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aChjaGFyMzJfdCBzcmNDaGFyKQotewotICAgIC8vIEZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgdGhlIHJlc3VsdCB3aWxsIHJlcXVpcmUuCi0gICAgaWYgKHNyY0NoYXIgPCAweDAwMDAwMDgwKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSBpZiAoc3JjQ2hhciA8IDB4MDAwMDA4MDApIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfSBlbHNlIGlmIChzcmNDaGFyIDwgMHgwMDAxMDAwMCkgewotICAgICAgICBpZiAoKHNyY0NoYXIgPCBrVW5pY29kZVN1cnJvZ2F0ZVN0YXJ0KSB8fCAoc3JjQ2hhciA+IGtVbmljb2RlU3Vycm9nYXRlRW5kKSkgewotICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTdXJyb2dhdGVzIGFyZSBpbnZhbGlkIFVURi0zMiBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gTWF4IGNvZGUgcG9pbnQgZm9yIFVuaWNvZGUgaXMgMHgwMDEwRkZGRi4KLSAgICBlbHNlIGlmIChzcmNDaGFyIDw9IGtVbmljb2RlTWF4Q29kZXBvaW50KSB7Ci0gICAgICAgIHJldHVybiA0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEludmFsaWQgVVRGLTMyIGNoYXJhY3Rlci4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vLyBXcml0ZSBvdXQgdGhlIHNvdXJjZSBjaGFyYWN0ZXIgdG8gPGRzdFA+LgotCi1zdGF0aWMgaW5saW5lIHZvaWQgdXRmMzJfY29kZXBvaW50X3RvX3V0ZjgodWludDhfdCogZHN0UCwgY2hhcjMyX3Qgc3JjQ2hhciwgc2l6ZV90IGJ5dGVzKQotewotICAgIGRzdFAgKz0gYnl0ZXM7Ci0gICAgc3dpdGNoIChieXRlcykKLSAgICB7ICAgLyogbm90ZTogZXZlcnl0aGluZyBmYWxscyB0aHJvdWdoLiAqLwotICAgICAgICBjYXNlIDQ6ICotLWRzdFAgPSAodWludDhfdCkoKHNyY0NoYXIgfCBrQnl0ZU1hcmspICYga0J5dGVNYXNrKTsgc3JjQ2hhciA+Pj0gNjsKLSAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICBjYXNlIDM6ICotLWRzdFAgPSAodWludDhfdCkoKHNyY0NoYXIgfCBrQnl0ZU1hcmspICYga0J5dGVNYXNrKTsgc3JjQ2hhciA+Pj0gNjsKLSAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICBjYXNlIDI6ICotLWRzdFAgPSAodWludDhfdCkoKHNyY0NoYXIgfCBrQnl0ZU1hcmspICYga0J5dGVNYXNrKTsgc3JjQ2hhciA+Pj0gNjsKLSAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICBjYXNlIDE6ICotLWRzdFAgPSAodWludDhfdCkoc3JjQ2hhciB8IGtGaXJzdEJ5dGVNYXJrW2J5dGVzXSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgdXRmMzJfYXRfaW50ZXJuYWwoY29uc3QgY2hhciogY3VyLCBzaXplX3QgKm51bV9yZWFkKQotewotICAgIGNvbnN0IGNoYXIgZmlyc3RfY2hhciA9ICpjdXI7Ci0gICAgaWYgKChmaXJzdF9jaGFyICYgMHg4MCkgPT0gMCkgeyAvLyBBU0NJSQotICAgICAgICAqbnVtX3JlYWQgPSAxOwotICAgICAgICByZXR1cm4gKmN1cjsKLSAgICB9Ci0gICAgY3VyKys7Ci0gICAgY2hhcjMyX3QgbWFzaywgdG9faWdub3JlX21hc2s7Ci0gICAgc2l6ZV90IG51bV90b19yZWFkID0gMDsKLSAgICBjaGFyMzJfdCB1dGYzMiA9IGZpcnN0X2NoYXI7Ci0gICAgZm9yIChudW1fdG9fcmVhZCA9IDEsIG1hc2sgPSAweDQwLCB0b19pZ25vcmVfbWFzayA9IDB4RkZGRkZGODA7Ci0gICAgICAgICAoZmlyc3RfY2hhciAmIG1hc2spOwotICAgICAgICAgbnVtX3RvX3JlYWQrKywgdG9faWdub3JlX21hc2sgfD0gbWFzaywgbWFzayA+Pj0gMSkgewotICAgICAgICAvLyAweDNGID09IDAwMTExMTExCi0gICAgICAgIHV0ZjMyID0gKHV0ZjMyIDw8IDYpICsgKCpjdXIrKyAmIDB4M0YpOwotICAgIH0KLSAgICB0b19pZ25vcmVfbWFzayB8PSBtYXNrOwotICAgIHV0ZjMyICY9IH4odG9faWdub3JlX21hc2sgPDwgKDYgKiAobnVtX3RvX3JlYWQgLSAxKSkpOwotCi0gICAgKm51bV9yZWFkID0gbnVtX3RvX3JlYWQ7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHV0ZjMyKTsKLX0KLQotaW50MzJfdCB1dGYzMl9mcm9tX3V0ZjhfYXQoY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjX2xlbiwgc2l6ZV90IGluZGV4LCBzaXplX3QgKm5leHRfaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4ID49IHNyY19sZW4pIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzaXplX3QgdW51c2VkX2luZGV4OwotICAgIGlmIChuZXh0X2luZGV4ID09IG51bGxwdHIpIHsKLSAgICAgICAgbmV4dF9pbmRleCA9ICZ1bnVzZWRfaW5kZXg7Ci0gICAgfQotICAgIHNpemVfdCBudW1fcmVhZDsKLSAgICBpbnQzMl90IHJldCA9IHV0ZjMyX2F0X2ludGVybmFsKHNyYyArIGluZGV4LCAmbnVtX3JlYWQpOwotICAgIGlmIChyZXQgPj0gMCkgewotICAgICAgICAqbmV4dF9pbmRleCA9IGluZGV4ICsgbnVtX3JlYWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3NpemVfdCB1dGYzMl90b191dGY4X2xlbmd0aChjb25zdCBjaGFyMzJfdCAqc3JjLCBzaXplX3Qgc3JjX2xlbikKLXsKLSAgICBpZiAoc3JjID09IG51bGxwdHIgfHwgc3JjX2xlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzaXplX3QgcmV0ID0gMDsKLSAgICBjb25zdCBjaGFyMzJfdCAqZW5kID0gc3JjICsgc3JjX2xlbjsKLSAgICB3aGlsZSAoc3JjIDwgZW5kKSB7Ci0gICAgICAgIHNpemVfdCBjaGFyX2xlbiA9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCgqc3JjKyspOwotICAgICAgICBpZiAoU1NJWkVfTUFYIC0gY2hhcl9sZW4gPCByZXQpIHsKLSAgICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucywgd2Ugd291bGQgb3ZlcmZsb3cgdGhlIHNzaXplX3QgdHlwZSB3aGVuCi0gICAgICAgICAgICAvLyByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBjYW5ub3QgZXhwcmVzcyBob3cKLSAgICAgICAgICAgIC8vIGxvbmcgdGhpcyBzdHJpbmcgaXMgaW4gYW4gc3NpemVfdC4KLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc3MjMwMjYiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXQgKz0gY2hhcl9sZW47Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgdXRmMzJfdG9fdXRmOChjb25zdCBjaGFyMzJfdCogc3JjLCBzaXplX3Qgc3JjX2xlbiwgY2hhciogZHN0LCBzaXplX3QgZHN0X2xlbikKLXsKLSAgICBpZiAoc3JjID09IG51bGxwdHIgfHwgc3JjX2xlbiA9PSAwIHx8IGRzdCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyMzJfdCAqY3VyX3V0ZjMyID0gc3JjOwotICAgIGNvbnN0IGNoYXIzMl90ICplbmRfdXRmMzIgPSBzcmMgKyBzcmNfbGVuOwotICAgIGNoYXIgKmN1ciA9IGRzdDsKLSAgICB3aGlsZSAoY3VyX3V0ZjMyIDwgZW5kX3V0ZjMyKSB7Ci0gICAgICAgIHNpemVfdCBsZW4gPSB1dGYzMl9jb2RlcG9pbnRfdXRmOF9sZW5ndGgoKmN1cl91dGYzMik7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZHN0X2xlbiA8IGxlbiwgIiV6dSA8ICV6dSIsIGRzdF9sZW4sIGxlbik7Ci0gICAgICAgIHV0ZjMyX2NvZGVwb2ludF90b191dGY4KCh1aW50OF90ICopY3VyLCAqY3VyX3V0ZjMyKyssIGxlbik7Ci0gICAgICAgIGN1ciArPSBsZW47Ci0gICAgICAgIGRzdF9sZW4gLT0gbGVuOwotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRzdF9sZW4gPCAxLCAiZHN0X2xlbiA8IDE6ICV6dSA8IDEiLCBkc3RfbGVuKTsKLSAgICAqY3VyID0gJ1wwJzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFVURi0xNgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IHN0cmNtcDE2KGNvbnN0IGNoYXIxNl90ICpzMSwgY29uc3QgY2hhcjE2X3QgKnMyKQotewotICBjaGFyMTZfdCBjaDsKLSAgaW50IGQgPSAwOwotCi0gIHdoaWxlICggMSApIHsKLSAgICBkID0gKGludCkoY2ggPSAqczErKykgLSAoaW50KSpzMisrOwotICAgIGlmICggZCB8fCAhY2ggKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gZDsKLX0KLQotaW50IHN0cm5jbXAxNihjb25zdCBjaGFyMTZfdCAqczEsIGNvbnN0IGNoYXIxNl90ICpzMiwgc2l6ZV90IG4pCi17Ci0gIGNoYXIxNl90IGNoOwotICBpbnQgZCA9IDA7Ci0KLSAgaWYgKG4gPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgZG8gewotICAgIGQgPSAoaW50KShjaCA9ICpzMSsrKSAtIChpbnQpKnMyKys7Ci0gICAgaWYgKCBkIHx8ICFjaCApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoLS1uKTsKLQotICByZXR1cm4gZDsKLX0KLQotc2l6ZV90IHN0cmxlbjE2KGNvbnN0IGNoYXIxNl90ICpzKQotewotICBjb25zdCBjaGFyMTZfdCAqc3MgPSBzOwotICB3aGlsZSAoICpzcyApCi0gICAgc3MrKzsKLSAgcmV0dXJuIHNzLXM7Ci19Ci0KLXNpemVfdCBzdHJubGVuMTYoY29uc3QgY2hhcjE2X3QgKnMsIHNpemVfdCBtYXhsZW4pCi17Ci0gIGNvbnN0IGNoYXIxNl90ICpzcyA9IHM7Ci0KLSAgLyogSW1wb3J0YW50OiB0aGUgbWF4bGVuIHRlc3QgbXVzdCBwcmVjZWRlIHRoZSByZWZlcmVuY2UgdGhyb3VnaCBzczsKLSAgICAgc2luY2UgdGhlIGJ5dGUgYmV5b25kIHRoZSBtYXhpbXVtIG1heSBzZWdmYXVsdCAqLwotICB3aGlsZSAoKG1heGxlbiA+IDApICYmICpzcykgewotICAgIHNzKys7Ci0gICAgbWF4bGVuLS07Ci0gIH0KLSAgcmV0dXJuIHNzLXM7Ci19Ci0KLWNoYXIxNl90KiBzdHJzdHIxNihjb25zdCBjaGFyMTZfdCogc3JjLCBjb25zdCBjaGFyMTZfdCogdGFyZ2V0KQotewotICAgIGNvbnN0IGNoYXIxNl90IG5lZWRsZSA9ICp0YXJnZXQ7Ci0gICAgaWYgKG5lZWRsZSA9PSAnXDAnKSByZXR1cm4gKGNoYXIxNl90KilzcmM7Ci0KLSAgICBjb25zdCBzaXplX3QgdGFyZ2V0X2xlbiA9IHN0cmxlbjE2KCsrdGFyZ2V0KTsKLSAgICBkbyB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICgqc3JjID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoKnNyYysrICE9IG5lZWRsZSk7Ci0gICAgfSB3aGlsZSAoc3RybmNtcDE2KHNyYywgdGFyZ2V0LCB0YXJnZXRfbGVuKSAhPSAwKTsKLSAgICBzcmMtLTsKLQotICAgIHJldHVybiAoY2hhcjE2X3QqKXNyYzsKLX0KLQotaW50IHN0cnpjbXAxNihjb25zdCBjaGFyMTZfdCAqczEsIHNpemVfdCBuMSwgY29uc3QgY2hhcjE2X3QgKnMyLCBzaXplX3QgbjIpCi17Ci0gICAgY29uc3QgY2hhcjE2X3QqIGUxID0gczErbjE7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGUyID0gczIrbjI7Ci0KLSAgICB3aGlsZSAoczEgPCBlMSAmJiBzMiA8IGUyKSB7Ci0gICAgICAgIGNvbnN0IGludCBkID0gKGludCkqczErKyAtIChpbnQpKnMyKys7Ci0gICAgICAgIGlmIChkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuMSA8IG4yCi0gICAgICAgID8gKDAgLSAoaW50KSpzMikKLSAgICAgICAgOiAobjEgPiBuMgotICAgICAgICAgICA/ICgoaW50KSpzMSAtIDApCi0gICAgICAgICAgIDogMCk7Ci19Ci0KLXZvaWQgdXRmMTZfdG9fdXRmOChjb25zdCBjaGFyMTZfdCogc3JjLCBzaXplX3Qgc3JjX2xlbiwgY2hhciogZHN0LCBzaXplX3QgZHN0X2xlbikKLXsKLSAgICBpZiAoc3JjID09IG51bGxwdHIgfHwgc3JjX2xlbiA9PSAwIHx8IGRzdCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyMTZfdCogY3VyX3V0ZjE2ID0gc3JjOwotICAgIGNvbnN0IGNoYXIxNl90KiBjb25zdCBlbmRfdXRmMTYgPSBzcmMgKyBzcmNfbGVuOwotICAgIGNoYXIgKmN1ciA9IGRzdDsKLSAgICB3aGlsZSAoY3VyX3V0ZjE2IDwgZW5kX3V0ZjE2KSB7Ci0gICAgICAgIGNoYXIzMl90IHV0ZjMyOwotICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMKLSAgICAgICAgaWYoKCpjdXJfdXRmMTYgJiAweEZDMDApID09IDB4RDgwMCAmJiAoY3VyX3V0ZjE2ICsgMSkgPCBlbmRfdXRmMTYKLSAgICAgICAgICAgICAgICAmJiAoKihjdXJfdXRmMTYgKyAxKSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7Ci0gICAgICAgICAgICB1dGYzMiA9ICgqY3VyX3V0ZjE2KysgLSAweEQ4MDApIDw8IDEwOwotICAgICAgICAgICAgdXRmMzIgfD0gKmN1cl91dGYxNisrIC0gMHhEQzAwOwotICAgICAgICAgICAgdXRmMzIgKz0gMHgxMDAwMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHV0ZjMyID0gKGNoYXIzMl90KSAqY3VyX3V0ZjE2Kys7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiA9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCh1dGYzMik7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZHN0X2xlbiA8IGxlbiwgIiV6dSA8ICV6dSIsIGRzdF9sZW4sIGxlbik7Ci0gICAgICAgIHV0ZjMyX2NvZGVwb2ludF90b191dGY4KCh1aW50OF90KiljdXIsIHV0ZjMyLCBsZW4pOwotICAgICAgICBjdXIgKz0gbGVuOwotICAgICAgICBkc3RfbGVuIC09IGxlbjsKLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihkc3RfbGVuIDwgMSwgIiV6dSA8IDEiLCBkc3RfbGVuKTsKLSAgICAqY3VyID0gJ1wwJzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFVURi04Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zc2l6ZV90IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKGNvbnN0IGNoYXIxNl90ICpzcmMsIHNpemVfdCBzcmNfbGVuKQotewotICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHNpemVfdCByZXQgPSAwOwotICAgIGNvbnN0IGNoYXIxNl90KiBjb25zdCBlbmQgPSBzcmMgKyBzcmNfbGVuOwotICAgIHdoaWxlIChzcmMgPCBlbmQpIHsKLSAgICAgICAgc2l6ZV90IGNoYXJfbGVuOwotICAgICAgICBpZiAoKCpzcmMgJiAweEZDMDApID09IDB4RDgwMCAmJiAoc3JjICsgMSkgPCBlbmQKLSAgICAgICAgICAgICAgICAmJiAoKihzcmMgKyAxKSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7Ci0gICAgICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMgYXJlIGFsd2F5cyA0IGJ5dGVzLgotICAgICAgICAgICAgY2hhcl9sZW4gPSA0OwotICAgICAgICAgICAgc3JjICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFyX2xlbiA9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCgoY2hhcjMyX3QpKnNyYysrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoU1NJWkVfTUFYIC0gY2hhcl9sZW4gPCByZXQpIHsKLSAgICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucywgd2Ugd291bGQgb3ZlcmZsb3cgdGhlIHNzaXplX3QgdHlwZSB3aGVuCi0gICAgICAgICAgICAvLyByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBjYW5ub3QgZXhwcmVzcyBob3cKLSAgICAgICAgICAgIC8vIGxvbmcgdGhpcyBzdHJpbmcgaXMgaW4gYW4gc3NpemVfdC4KLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc3MjMwMjYiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXQgKz0gY2hhcl9sZW47Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyAxLTQgYmFzZWQgb24gdGhlIG51bWJlciBvZiBsZWFkaW5nIGJpdHMuCi0gKgotICogMTExMSAtPiA0Ci0gKiAxMTEwIC0+IDMKLSAqIDExMHggLT4gMgotICogMTB4eCAtPiAxCi0gKiAweHh4IC0+IDEKLSAqLwotc3RhdGljIGlubGluZSBzaXplX3QgdXRmOF9jb2RlcG9pbnRfbGVuKHVpbnQ4X3QgY2gpCi17Ci0gICAgcmV0dXJuICgoMHhlNTAwMDAwMCA+PiAoKGNoID4+IDMpICYgMHgxZSkpICYgMykgKyAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdXRmOF9zaGlmdF9hbmRfbWFzayh1aW50MzJfdCogY29kZVBvaW50LCBjb25zdCB1aW50OF90IGJ5dGUpCi17Ci0gICAgKmNvZGVQb2ludCA8PD0gNjsKLSAgICAqY29kZVBvaW50IHw9IDB4M0YgJiBieXRlOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IHV0ZjhfdG9fdXRmMzJfY29kZXBvaW50KGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICB1aW50MzJfdCB1bmljb2RlOwotCi0gICAgc3dpdGNoIChsZW5ndGgpCi0gICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICByZXR1cm4gc3JjWzBdOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB1bmljb2RlID0gc3JjWzBdICYgMHgxZjsKLSAgICAgICAgICAgIHV0Zjhfc2hpZnRfYW5kX21hc2soJnVuaWNvZGUsIHNyY1sxXSk7Ci0gICAgICAgICAgICByZXR1cm4gdW5pY29kZTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgdW5pY29kZSA9IHNyY1swXSAmIDB4MGY7Ci0gICAgICAgICAgICB1dGY4X3NoaWZ0X2FuZF9tYXNrKCZ1bmljb2RlLCBzcmNbMV0pOwotICAgICAgICAgICAgdXRmOF9zaGlmdF9hbmRfbWFzaygmdW5pY29kZSwgc3JjWzJdKTsKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB1bmljb2RlID0gc3JjWzBdICYgMHgwNzsKLSAgICAgICAgICAgIHV0Zjhfc2hpZnRfYW5kX21hc2soJnVuaWNvZGUsIHNyY1sxXSk7Ci0gICAgICAgICAgICB1dGY4X3NoaWZ0X2FuZF9tYXNrKCZ1bmljb2RlLCBzcmNbMl0pOwotICAgICAgICAgICAgdXRmOF9zaGlmdF9hbmRfbWFzaygmdW5pY29kZSwgc3JjWzNdKTsKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKLSAgICB9Ci0KLSAgICAvL3ByaW50ZigiQ2hhciBhdCAlcDogbGVuPSVkLCB1dGYtMTY9JXBcbiIsIHNyYywgbGVuZ3RoLCAodm9pZCopcmVzdWx0KTsKLX0KLQotc3NpemVfdCB1dGY4X3RvX3V0ZjE2X2xlbmd0aChjb25zdCB1aW50OF90KiB1OHN0ciwgc2l6ZV90IHU4bGVuLCBib29sIG92ZXJyZWFkSXNGYXRhbCkKLXsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCB1OGVuZCA9IHU4c3RyICsgdThsZW47Ci0gICAgY29uc3QgdWludDhfdCogdThjdXIgPSB1OHN0cjsKLQotICAgIC8qIFZhbGlkYXRlIHRoYXQgdGhlIFVURi04IGlzIHRoZSBjb3JyZWN0IGxlbiAqLwotICAgIHNpemVfdCB1MTZtZWFzdXJlZExlbiA9IDA7Ci0gICAgd2hpbGUgKHU4Y3VyIDwgdThlbmQpIHsKLSAgICAgICAgdTE2bWVhc3VyZWRMZW4rKzsKLSAgICAgICAgaW50IHU4Y2hhckxlbiA9IHV0ZjhfY29kZXBvaW50X2xlbigqdThjdXIpOwotICAgICAgICAvLyBNYWxmb3JtZWQgdXRmOCwgc29tZSBjaGFyYWN0ZXJzIGFyZSBiZXlvbmQgdGhlIGVuZC4KLSAgICAgICAgLy8gQ2FzZXM6Ci0gICAgICAgIC8vIElmIHU4Y2hhckxlbiA9PSAxLCB0aGlzIGJlY29tZXMgdThjdXIgPj0gdThlbmQsIHdoaWNoIGNhbm5vdCBoYXBwZW4gYXMgdThjdXIgPCB1OGVuZCwKLSAgICAgICAgLy8gdGhlbiB0aGlzIGNvbmRpdGlvbiBmYWlsIGFuZCB3ZSBjb250aW51ZSwgYXMgZXhwZWN0ZWQuCi0gICAgICAgIC8vIElmIHU4Y2hhckxlbiA9PSAyLCB0aGlzIGJlY29tZXMgdThjdXIgKyAxID49IHU4ZW5kLCB3aGljaCBmYWlscyBvbmx5IGlmCi0gICAgICAgIC8vIHU4Y3VyID09IHU4ZW5kIC0gMSwgdGhhdCBpcywgdGhlcmUgd2FzIG9ubHkgb25lIHJlbWFpbmluZyBjaGFyYWN0ZXIgdG8gcmVhZCBidXQgd2UgbmVlZAotICAgICAgICAvLyAyIG9mIHRoZW0uIFRoaXMgY29uZGl0aW9uIGhvbGRzIGFuZCB3ZSByZXR1cm4gLTEsIGFzIGV4cGVjdGVkLgotICAgICAgICBpZiAodThjdXIgKyB1OGNoYXJMZW4gLSAxID49IHU4ZW5kKSB7Ci0gICAgICAgICAgICBpZiAob3ZlcnJlYWRJc0ZhdGFsKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQXR0ZW1wdCB0byBvdmVycmVhZCBjb21wdXRpbmcgbGVuZ3RoIG9mIHV0Zjggc3RyaW5nIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBjb2RlcG9pbnQgPSB1dGY4X3RvX3V0ZjMyX2NvZGVwb2ludCh1OGN1ciwgdThjaGFyTGVuKTsKLSAgICAgICAgaWYgKGNvZGVwb2ludCA+IDB4RkZGRikgdTE2bWVhc3VyZWRMZW4rKzsgLy8gdGhpcyB3aWxsIGJlIGEgc3Vycm9nYXRlIHBhaXIgaW4gdXRmMTYKLSAgICAgICAgdThjdXIgKz0gdThjaGFyTGVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2Ugc3VyZSB0aGF0IHdlIGVuZGVkIHdoZXJlIHdlIHRob3VnaHQgd2Ugd291bGQgYW5kIHRoZSBvdXRwdXQgVVRGLTE2Ci0gICAgICogd2lsbCBiZSBleGFjdGx5IGhvdyBsb25nIHdlIHdlcmUgdG9sZCBpdCB3b3VsZCBiZS4KLSAgICAgKi8KLSAgICBpZiAodThjdXIgIT0gdThlbmQpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiB1MTZtZWFzdXJlZExlbjsKLX0KLQotY2hhcjE2X3QqIHV0ZjhfdG9fdXRmMTYoY29uc3QgdWludDhfdCogdThzdHIsIHNpemVfdCB1OGxlbiwgY2hhcjE2X3QqIHUxNnN0ciwgc2l6ZV90IHUxNmxlbikgewotICAgIC8vIEEgdmFsdWUgPiBTU0laRV9NQVggaXMgcHJvYmFibHkgYSBuZWdhdGl2ZSB2YWx1ZSByZXR1cm5lZCBhcyBhbiBlcnJvciBhbmQgY2FzdGVkLgotICAgIExPR19BTFdBWVNfRkFUQUxfSUYodTE2bGVuID09IDAgfHwgdTE2bGVuID4gU1NJWkVfTUFYLCAidTE2bGVuIGlzICV6dSIsIHUxNmxlbik7Ci0gICAgY2hhcjE2X3QqIGVuZCA9IHV0ZjhfdG9fdXRmMTZfbm9fbnVsbF90ZXJtaW5hdG9yKHU4c3RyLCB1OGxlbiwgdTE2c3RyLCB1MTZsZW4gLSAxKTsKLSAgICAqZW5kID0gMDsKLSAgICByZXR1cm4gZW5kOwotfQotCi1jaGFyMTZfdCogdXRmOF90b191dGYxNl9ub19udWxsX3Rlcm1pbmF0b3IoCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNyY0xlbiwgY2hhcjE2X3QqIGRzdCwgc2l6ZV90IGRzdExlbikgewotICAgIGlmIChkc3RMZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gZHN0OwotICAgIH0KLSAgICAvLyBBIHZhbHVlID4gU1NJWkVfTUFYIGlzIHByb2JhYmx5IGEgbmVnYXRpdmUgdmFsdWUgcmV0dXJuZWQgYXMgYW4gZXJyb3IgYW5kIGNhc3RlZC4KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRzdExlbiA+IFNTSVpFX01BWCwgImRzdExlbiBpcyAlenUiLCBkc3RMZW4pOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHU4ZW5kID0gc3JjICsgc3JjTGVuOwotICAgIGNvbnN0IHVpbnQ4X3QqIHU4Y3VyID0gc3JjOwotICAgIGNvbnN0IGNoYXIxNl90KiBjb25zdCB1MTZlbmQgPSBkc3QgKyBkc3RMZW47Ci0gICAgY2hhcjE2X3QqIHUxNmN1ciA9IGRzdDsKLQotICAgIHdoaWxlICh1OGN1ciA8IHU4ZW5kICYmIHUxNmN1ciA8IHUxNmVuZCkgewotICAgICAgICBzaXplX3QgdThsZW4gPSB1dGY4X2NvZGVwb2ludF9sZW4oKnU4Y3VyKTsKLSAgICAgICAgdWludDMyX3QgY29kZXBvaW50ID0gdXRmOF90b191dGYzMl9jb2RlcG9pbnQodThjdXIsIHU4bGVuKTsKLQotICAgICAgICAvLyBDb252ZXJ0IHRoZSBVVEYzMiBjb2RlcG9pbnQgdG8gb25lIG9yIG1vcmUgVVRGMTYgY29kZXBvaW50cwotICAgICAgICBpZiAoY29kZXBvaW50IDw9IDB4RkZGRikgewotICAgICAgICAgICAgLy8gU2luZ2xlIFVURjE2IGNoYXJhY3RlcgotICAgICAgICAgICAgKnUxNmN1cisrID0gKGNoYXIxNl90KSBjb2RlcG9pbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBNdWx0aXBsZSBVVEYxNiBjaGFyYWN0ZXJzIHdpdGggc3Vycm9nYXRlcwotICAgICAgICAgICAgY29kZXBvaW50ID0gY29kZXBvaW50IC0gMHgxMDAwMDsKLSAgICAgICAgICAgICp1MTZjdXIrKyA9IChjaGFyMTZfdCkgKChjb2RlcG9pbnQgPj4gMTApICsgMHhEODAwKTsKLSAgICAgICAgICAgIGlmICh1MTZjdXIgPj0gdTE2ZW5kKSB7Ci0gICAgICAgICAgICAgICAgLy8gT29vcHMuLi4gIG5vdCBlbm91Z2ggcm9vbSBmb3IgdGhpcyBzdXJyb2dhdGUgcGFpci4KLSAgICAgICAgICAgICAgICByZXR1cm4gdTE2Y3VyLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqdTE2Y3VyKysgPSAoY2hhcjE2X3QpICgoY29kZXBvaW50ICYgMHgzRkYpICsgMHhEQzAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHU4Y3VyICs9IHU4bGVuOwotICAgIH0KLSAgICByZXR1cm4gdTE2Y3VyOwotfQotCi19CmRpZmYgLS1naXQgYS9saWJ1dGlscy9WZWN0b3JfZnV6ei5jcHAgYi9saWJ1dGlscy9WZWN0b3JfZnV6ei5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGYwNTEuLjAwMDAwMDAKLS0tIGEvbGlidXRpbHMvVmVjdG9yX2Z1enouY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCi1zdGF0aWMgY29uc3RleHByIHVpbnQxNl90IE1BWF9WRUNfU0laRSA9IDUwMDA7Ci0KLXZvaWQgcnVuVmVjdG9yRnV6eihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7Ci0gICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+IHZlYyA9IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PigpOwotICAgIC8vIFdlIHdhbnQgdG8gdGVzdCBoYW5kbGluZyBvZiBzaXplb2YgYXMgd2VsbC4KLSAgICBhbmRyb2lkOjpWZWN0b3I8dWludDMyX3Q+IHZlYzMyID0gYW5kcm9pZDo6VmVjdG9yPHVpbnQzMl90PigpOwotCi0gICAgLy8gV2UncmUgZ29pbmcgdG8gZ2VuZXJhdGUgdHdvIHZlY3RvcnMgb2YgdGhpcyBzaXplCi0gICAgc2l6ZV90IHZlY3RvclNpemUgPSBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9WRUNfU0laRSk7Ci0gICAgdmVjLnNldENhcGFjaXR5KHZlY3RvclNpemUpOwotICAgIHZlYzMyLnNldENhcGFjaXR5KHZlY3RvclNpemUpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yU2l6ZTsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgY291bnQgPSBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigxLCA1KTsKLSAgICAgICAgdmVjLmluc2VydEF0KCh1aW50OF90KWksIGksIGNvdW50KTsKLSAgICAgICAgdmVjMzIuaW5zZXJ0QXQoKHVpbnQzMl90KWksIGksIGNvdW50KTsKLSAgICAgICAgdmVjLnB1c2hfZnJvbnQoaSk7Ci0gICAgICAgIHZlYzMyLnB1c2goaSk7Ci0gICAgfQotCi0gICAgLy8gTm93IHdlJ2xsIHBlcmZvcm0gc29tZSB0ZXN0IG9wZXJhdGlvbnMgd2l0aCBhbnkgcmVtYWluaW5nIGRhdGEKLSAgICAvLyBJbmRleCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgYXQKLSAgICBzaXplX3QgaW5kZXggPSBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHZlYy5zaXplKCkpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlbWFpbmluZ1ZlYyA9IGRhdGFQcm92aWRlci5Db25zdW1lUmVtYWluaW5nQnl0ZXM8dWludDhfdD4oKTsKLSAgICAvLyBJbnNlcnQgYW4gYXJyYXkgYW5kIHZlY3RvcgotICAgIHZlYy5pbnNlcnRBcnJheUF0KHJlbWFpbmluZ1ZlYy5kYXRhKCksIGluZGV4LCByZW1haW5pbmdWZWMuc2l6ZSgpKTsKLSAgICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gdmVjQ29weSA9IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90Pih2ZWMpOwotICAgIHZlYy5pbnNlcnRWZWN0b3JBdCh2ZWNDb3B5LCBpbmRleCk7Ci0gICAgLy8gU2FtZSB0aGluZyBmb3IgMzIgYml0IHZlY3RvcgotICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50MzJfdD4gdmVjMzJDb3B5ID0gYW5kcm9pZDo6VmVjdG9yPHVpbnQzMl90Pih2ZWMzMik7Ci0gICAgdmVjMzIuaW5zZXJ0QXJyYXlBdCh2ZWMzMkNvcHkuYXJyYXkoKSwgaW5kZXgsIHZlYzMyLnNpemUoKSk7Ci0gICAgdmVjMzIuaW5zZXJ0VmVjdG9yQXQodmVjMzJDb3B5LCBpbmRleCk7Ci0gICAgLy8gUmVwbGFjZSBzaW5nbGUgY2hhcmFjdGVyCi0gICAgaWYgKHJlbWFpbmluZ1ZlYy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHZlYy5yZXBsYWNlQXQocmVtYWluaW5nVmVjWzBdLCBpbmRleCk7Ci0gICAgICAgIHZlYzMyLnJlcGxhY2VBdChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVtYWluaW5nVmVjWzBdKSwgaW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZlYy5yZXBsYWNlQXQoMCwgaW5kZXgpOwotICAgICAgICB2ZWMzMi5yZXBsYWNlQXQoMCwgaW5kZXgpOwotICAgIH0KLSAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBieXRlcwotICAgIGZvciAodWludDhfdCBpIDogcmVtYWluaW5nVmVjKSB7Ci0gICAgICAgIHZlYy5hZGQoaSk7Ci0gICAgICAgIHZlYzMyLmFkZChzdGF0aWNfY2FzdDx1aW50MzJfdD4oaSkpOwotICAgIH0KLSAgICAvLyBTaHJpbmsgY2FwYWN0aXkKLSAgICB2ZWMuc2V0Q2FwYWNpdHkocmVtYWluaW5nVmVjLnNpemUoKSk7Ci0gICAgdmVjMzIuc2V0Q2FwYWNpdHkocmVtYWluaW5nVmVjLnNpemUoKSk7Ci0gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcG9pbnRlcgotICAgIHNpemVfdCBzdW0gPSAwOwotICAgIGZvciAoYXV0byYgaXQgOiB2ZWMpIHsKLSAgICAgICAgc3VtICs9IGl0OwotICAgIH0KLSAgICBmb3IgKGF1dG8mIGl0IDogdmVjMzIpIHsKLSAgICAgICAgc3VtICs9IGl0OwotICAgIH0KLSAgICAvLyBDbGVhbnVwCi0gICAgdmVjLmNsZWFyKCk7Ci0gICAgdmVjQ29weS5jbGVhcigpOwotICAgIHZlYzMyLmNsZWFyKCk7Ci0gICAgdmVjMzJDb3B5LmNsZWFyKCk7Ci19Ci1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgcnVuVmVjdG9yRnV6eihkYXRhLCBzaXplKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2FiaS1kdW1wcy9hcm02NC9zb3VyY2UtYmFzZWQvbGlidXRpbHMuc28ubHNkdW1wIGIvbGlidXRpbHMvYWJpLWR1bXBzL2FybTY0L3NvdXJjZS1iYXNlZC9saWJ1dGlscy5zby5sc2R1bXAKaW5kZXggYzg5YWY5ZS4uODJkZGNhOCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvYWJpLWR1bXBzL2FybTY0L3NvdXJjZS1iYXNlZC9saWJ1dGlscy5zby5sc2R1bXAKKysrIGIvbGlidXRpbHMvYWJpLWR1bXBzL2FybTY0L3NvdXJjZS1iYXNlZC9saWJ1dGlscy5zby5sc2R1bXAKQEAgLTE2LDcgKzE2LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElEcyIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJQTFfRHMiLAogICAgInNpemUiIDogMiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCkBAIC00Niw2ICs0Niw3IEBACiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LAogICB7CisgICAiaXNfb2ZfdW5rbm93bl9ib3VuZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJQV9mIiwKICAgICJuYW1lIiA6ICJmbG9hdFtdIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIiwKQEAgLTQ5MSw2ICs0OTIsMTggQEAKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDI3YWRkX3N5c3Byb3BfY2hhbmdlX2NhbGxiYWNrRVBGdnZFaSIKICAgfSwKICAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRTVjbGVhckV2IgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFYVNFT1MyXyIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRTVjbGVhckV2IgorICB9LAorICB7CiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQzMGdldF9yZXBvcnRfc3lzcHJvcF9jaGFuZ2VfZnVuY0V2IgogICB9LAogICB7CkBAIC01NDUsNiArNTU4LDkgQEAKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI2YXdva2VuRXYiCiAgIH0sCiAgIHsKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI2cmVwb2xsRWkiCisgIH0sCisgIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI3cG9sbEFsbEVpUGlTMV9QUHYiCiAgIH0sCiAgIHsKQEAgLTcwNCw5ICs3MjAsNiBAQAogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2VEMkV2IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODEwYXBwZW5kUGF0aEVQS2MiCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDdTdHJpbmc4MTBsb2NrQnVmZmVyRW0iCiAgIH0sCiAgIHsKQEAgLTcyNSw5ICs3MzgsNiBAQAogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkN1N0cmluZzgxM2FwcGVuZEZvcm1hdFZFUEtjU3Q5X192YV9saXN0IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODE2Y29udmVydFRvUmVzUGF0aEV2IgotICB9LAotICB7CiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODVjbGVhckV2IgogICB9LAogICB7CkBAIC0xMTQ4LDE1ICsxMTU4LDYgQEAKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODEwZ2V0UGF0aERpckV2IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxMWdldEJhc2VQYXRoRXYiCi0gIH0sCi0gIHsKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODExZ2V0UGF0aExlYWZFdiIKLSAgfSwKLSAgewotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTRmaW5kX2V4dGVuc2lvbkV2IgotICB9LAotICB7CiAgICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxNmdldFBhdGhFeHRlbnNpb25FdiIKICAgfSwKICAgewpAQCAtMTE2Niw5ICsxMTY3LDYgQEAKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODZsZW5ndGhFdiIKICAgfSwKICAgewotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4OHdhbGtQYXRoRVBTMF8iCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ4U3RyaW5nMTYxMHN0YXJ0c1dpdGhFUEtEcyIKICAgfSwKICAgewpAQCAtMTIzNCw2ICsxMjMyLDE0IEBACiAgIH0sCiAgIHsKICAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSW1ON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJbVM1X05TXzRoYXNoSW1FRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSW1TNV9OU184ZXF1YWxfdG9JbUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTNV9FRUU0ZmluZEltRUVOU18xNV9faGFzaF9pdGVyYXRvcklQTlNfMTFfX2hhc2hfbm9kZUlTNV9QdkVFRUVSS1RfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUltTjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySW1TNV9OU180aGFzaEltRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEltUzVfTlNfOGVxdWFsX3RvSW1FRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFNWVyYXNlRU5TXzIxX19oYXNoX2NvbnN0X2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVM1X1B2RUVFRSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAogICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJbU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEVFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlckltUzVfTlNfNGhhc2hJbUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJbVM1X05TXzhlcXVhbF90b0ltRUVMYjFFRUVOU185YWxsb2NhdG9ySVM1X0VFRTZyZWhhc2hFbSIKICAgfSwKICAgewpAQCAtMTQyOSw2ICsxNDM1LDEwIEBACiAgIH0sCiAgIHsKICAgICJuYW1lIiA6ICJfWlRWTjdhbmRyb2lkOUZkUHJpbnRlckUiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfX2xsdm1fZnNfZGlzY3JpbWluYXRvcl9fIgogICB9CiAgXSwKICAiZW51bV90eXBlcyIgOgpAQCAtMjI2OSw2ICsyMjc5LDIzIEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEzLAorICAgICAibmFtZSIgOiAiSEFMX0NPTE9SX01PREVfRElTUExBWV9CVDIwMjAiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI1YW5kcm9pZF9jb2xvcl9tb2RlX3YxXzJfdCIsCisgICAibmFtZSIgOiAiYW5kcm9pZF9jb2xvcl9tb2RlX3YxXzJfdCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjVhbmRyb2lkX2NvbG9yX21vZGVfdjFfMl90IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVEkyNWFuZHJvaWRfY29sb3JfbW9kZV92MV8yX3QiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLWJhc2UtdjEuMi5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCiAgICAgICJuYW1lIiA6ICJIQUxfQ09MT1JfVFJBTlNGT1JNX0lERU5USVRZIgogICAgIH0sCkBAIC0yNTA4LDYgKzI1MzUsMzEgQEAKICAgICJlbnVtX2ZpZWxkcyIgOgogICAgWwogICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OkhBU19UUklWSUFMX0NUT1IiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpIQVNfVFJJVklBTF9EVE9SIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiA0LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6SEFTX1RSSVZJQUxfQ09QWSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsMTckSEFTX1RSSVZJQUxfQ09QWUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsMTckSEFTX1RSSVZJQUxfQ09QWUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsMTckSEFTX1RSSVZJQUxfQ09QWUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3BvaW50ZXI8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46OnZhbHVlIgogICAgIH0KQEAgLTI2NTIsNiArMjcwNCw5OSBAQAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCiAgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6T0siCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpOT19FUlJPUiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDgsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpVTktOT1dOX0VSUk9SIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMTIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpOT19NRU1PUlkiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0zOCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMjIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpCQURfVkFMVUUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQ3LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6QkFEX1RZUEUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6TkFNRV9OT1RfRk9VTkQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UEVSTUlTU0lPTl9ERU5JRUQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xOSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6Ok5PX0lOSVQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xNywKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OkFMUkVBRFlfRVhJU1RTIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMzIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpERUFEX09CSkVDVCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDYsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGQUlMRURfVFJBTlNBQ1RJT04iCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC03NSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OkJBRF9JTkRFWCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTYxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6Tk9UX0VOT1VHSF9EQVRBIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMTEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpXT1VMRF9CTE9DSyIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTExMCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlRJTUVEX09VVCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTc0LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGRFNfTk9UX0FMTE9XRUQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNSRBTFJFQURZX0VYSVNUU0UiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTUkQUxSRUFEWV9FWElTVFNFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL0Vycm9ycy5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTUkQUxSRUFEWV9FWElTVFNFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL0Vycm9ycy5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9FcnJvcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaSIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxOSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlBSSU9SSVRZX0xPV0VTVCIKICAgICB9LApAQCAtMjc4Miw2ICsyOTI3LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGJvb2w+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI3OTksNiArMjk2MSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZG91YmxlPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI4MTYsNiArMjk5NSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxkb3VibGU+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGRvdWJsZT46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGZsb2F0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI4MzMsNiArMzAyOSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxmbG9hdD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZmxvYXQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI4NTAsNiArMzA2MywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8aW50Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI4NjcsNiArMzA5NywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGludD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGludD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yODg0LDYgKzMxMzEsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgaW50Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI5MDEsNiArMzE2NSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yOTE4LDYgKzMxOTksMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHNob3J0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI5MzUsNiArMzIzMywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8c2hvcnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJc0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yOTUyLDYgKzMyNjcsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dm9pZD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yOTY5LDYgKzMzMDEsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dm9pZD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dm9pZD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmcgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yOTg2LDYgKzMzMzUsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzAwMiw2ICszMzY4LDIzIEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6dmFsdWUiCiAgICAgfQpAQCAtMzA3MSw2ICszNDU0LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGJvb2w+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJYkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMwODgsNiArMzQ4OCwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZG91YmxlPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMxMDUsNiArMzUyMiwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxkb3VibGU+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGRvdWJsZT46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGZsb2F0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMxMjIsNiArMzU1NiwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxmbG9hdD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZmxvYXQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMxMzksNiArMzU5MCwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8aW50Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMxNTYsNiArMzYyNCwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGludD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGludD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMTczLDYgKzM2NTgsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgaW50Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMxOTAsNiArMzY5MiwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMjA3LDYgKzM3MjYsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHNob3J0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMyMjQsNiArMzc2MCwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8c2hvcnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMjQxLDYgKzM3OTQsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMjU4LDYgKzM4MjgsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmcgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMjc1LDYgKzM4NjIsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8bG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzI5MSw2ICszODk1LDIzIEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6dmFsdWUiCiAgICAgfQpAQCAtMzM2MCw2ICszOTgxLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGJvb2w+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMzNzcsNiArNDAxNSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZG91YmxlPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMzOTQsNiArNDA0OSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGRvdWJsZT46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGZsb2F0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM0MTEsNiArNDA4MywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxmbG9hdD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZmxvYXQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM0MjgsNiArNDExNywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8aW50Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM0NDUsNiArNDE1MSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGludD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGludD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNDYyLDYgKzQxODUsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgaW50Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM0NzksNiArNDIxOSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNDk2LDYgKzQyNTMsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHNob3J0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM1MTMsNiArNDI4NywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklzRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8c2hvcnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNTMwLDYgKzQzMjEsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNTQ3LDYgKzQzNTUsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmcgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNTY0LDYgKzQzODksMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzU4MCw2ICs0NDIyLDIzIEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6dmFsdWUiCiAgICAgfQpAQCAtMzY0OSw2ICs0NTA4LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6U3RyaW5nOD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzdTdHJpbmc4RUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzE2Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM2NTcsNyArNDUzMyw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUU2JHZhbHVlRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgogICB9LAogICB7CkBAIC0zNjgzLDYgKzQ1NTksMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Ym9vbD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Ym9vbD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGNoYXI+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzcwMCw2ICs0NTkzLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGNoYXI+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxkb3VibGU+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzcxNyw2ICs0NjI3LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGRvdWJsZT46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZG91YmxlPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZmxvYXQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzczNCw2ICs0NjYxLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxmbG9hdD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzc1MSw2ICs0Njk1LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxpbnQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzc2OCw2ICs0NzI5LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8aW50Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgaW50Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM3ODUsNiArNDc2MywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGludD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzgwMiw2ICs0Nzk3LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM4MTksNiArNDgzMSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8c2hvcnQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzgzNiw2ICs0ODY1LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJc0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM4NTMsNiArNDg5OSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM4NzAsNiArNDkzMywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZyBsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM4ODcsNiArNDk2NywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zOTAzLDYgKzUwMDAsMjMgQEAKICAgICJlbnVtX2ZpZWxkcyIgOgogICAgWwogICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6TXV0ZXg6OlBSSVZBVEUiCiAgICAgfSwKQEAgLTQxNzUsNiArNTI4OSwyNCBAQAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCiAgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6RklSU1RfSU5DX1NUUk9ORyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxNyRGSVJTVF9JTkNfU1RST05HRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTE3JEZJUlNUX0lOQ19TVFJPTkdFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTckRklSU1RfSU5DX1NUUk9OR0UjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpPQkpFQ1RfTElGRVRJTUVfU1RST05HIgogICAgIH0sCkBAIC00MTk2LDYgKzUzMjgsMzIgQEAKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgogICB9LAogICB7CisgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLAorICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6T0JKRUNUX0xJRkVUSU1FX1NUUk9ORyIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6Ok9CSkVDVF9MSUZFVElNRV9XRUFLIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6T0JKRUNUX0xJRkVUSU1FX01BU0siCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMjEkT0JKRUNUX0xJRkVUSU1FX01BU0tFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMjEkT0JKRUNUX0xJRkVUSU1FX01BU0tFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMjEkT0JKRUNUX0xJRkVUSU1FX01BU0tFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKQEAgLTQzMDQsNyArNTQ2Miw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQS3ZTMF9FIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUEt2UzBfRSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTQzMjUsNyArNTQ4Myw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQS3ZTMF9QdkUiLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJRmlQS3ZTMF9QdkUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC00NDgxLDcgKzU2MzksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnNldENhcGFjaXR5IiwKQEAgLTQ0OTcsNyArNTY1NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6YXBwZW5kVmVjdG9yIiwKQEAgLTQ1MTMsNyArNTY3MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6ZWRpdEFycmF5SW1wbCIsCkBAIC00NTI2LDcgKzU2ODQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpmaW5pc2hfdmVjdG9yIiwKQEAgLTQ1MzksNyArNTY5Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6aW5zZXJ0QXJyYXlBdCIsCkBAIC00NTYxLDcgKzU3MTksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlbW92ZUl0ZW1zQXQiLApAQCAtNDU4MSw3ICs1NzM5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjppbnNlcnRWZWN0b3JBdCIsCkBAIC00NjAwLDcgKzU3NTgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTQ2MTQsNyArNTc3Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6ZWRpdEl0ZW1Mb2NhdGlvbiIsCkBAIC00NjMwLDcgKzU3ODgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjphZGQiLApAQCAtNDY0Niw3ICs1ODA0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjphZGQiLApAQCAtNDY1OSw3ICs1ODE3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpwb3AiLApAQCAtNDY3Miw3ICs1ODMwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpwdXNoIiwKQEAgLTQ2ODgsNyArNTg0Niw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6cHVzaCIsCkBAIC00NzAxLDcgKzU4NTksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnNvcnQiLApAQCAtNDcxNyw3ICs1ODc1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpzb3J0IiwKQEAgLTQ3MzYsNyArNTg5NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTQ3NTYsNyArNTkxNCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OmNsZWFyIiwKQEAgLTQ3NjksNyArNTkyNyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6cmVzaXplIiwKQEAgLTQ3ODUsNyArNTk0Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTQ4MDUsNyArNTk2Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6aW5zZXJ0QXQiLApAQCAtNDgyOCw3ICs1OTg2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjppbnNlcnRBdCIsCkBAIC00ODQ4LDcgKzYwMDYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlcGxhY2VBdCIsCkBAIC00ODY3LDcgKzYwMjUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlcGxhY2VBdCIsCkBAIC00ODgzLDcgKzYwNDEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OlZlY3RvckltcGwiLApAQCAtNDg5OSw3ICs2MDU3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpWZWN0b3JJbXBsIiwKQEAgLTQ5MTgsNyArNjA3Niw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6flZlY3RvckltcGwiLApAQCAtNDkzMSw3ICs2MDg5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjp+VmVjdG9ySW1wbCIsCkBAIC00OTQ0LDcgKzYxMDIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6On5WZWN0b3JJbXBsIiwKQEAgLTQ5NTcsNyArNjExNSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6b3BlcmF0b3I9IiwKQEAgLTQ5NzMsNyArNjEzMSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OnVwdGltZU5hbm9zIiwKQEAgLTUyNzQsNyArNjQzMiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU5TdDNfXzExMmJhc2ljX3N0cmluZ0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9FcnJvcnMuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjplbGFwc2VkUmVhbHRpbWUiLApAQCAtNTI5Niw3ICs2NDU0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjptZXJnZSIsCkBAIC01MzEyLDcgKzY0NzAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6Om1lcmdlIiwKQEAgLTUzMjgsNyArNjQ4Niw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6cmVtb3ZlIiwKQEAgLTUzNDQsNyArNjUwMiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6U29ydGVkVmVjdG9ySW1wbCIsCkBAIC01MzYwLDcgKzY1MTgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6OlNvcnRlZFZlY3RvckltcGwiLApAQCAtNTM3OSw3ICs2NTM3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjp+U29ydGVkVmVjdG9ySW1wbCIsCkBAIC01MzkyLDcgKzY1NTAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6On5Tb3J0ZWRWZWN0b3JJbXBsIiwKQEAgLTU0MDUsNyArNjU2Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6flNvcnRlZFZlY3RvckltcGwiLApAQCAtNTQxOCw3ICs2NTc2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjpvcGVyYXRvcj0iLApAQCAtNTQzNCw3ICs2NTkyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6SmVua2luc0hhc2hXaGl0ZW4iLApAQCAtNTY5OCw2ICs2ODU2LDQ4IEBACiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvbWlzYy5oIgogICB9LAogICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyQ2FsbGJhY2s+OjpjbGVhciIsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRTVjbGVhckV2IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPjo6b3BlcmF0b3I9IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFYVNFT1MyXyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6VGhyZWFkPjo6Y2xlYXIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDJzcElOU182VGhyZWFkRUU1Y2xlYXJFdiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKKyAgfSwKKyAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OkxpZ2h0UmVmQmFzZV9yZXBvcnRJbmNTdHJvbmdSZXF1aXJlU3Ryb25nRmFpbGVkIiwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ0N0xpZ2h0UmVmQmFzZV9yZXBvcnRJbmNTdHJvbmdSZXF1aXJlU3Ryb25nRmFpbGVkRVBLdiIsCiAgICAicGFyYW1ldGVycyIgOgpAQCAtNTk3NCw2ICs3MTc0LDIyIEBACiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCiAgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OnJlcG9sbCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjZyZXBvbGxFaSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNkxvb3BlckUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKKyAgfSwKKyAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6cG9sbEFsbCIsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNkxvb3Blcjdwb2xsQWxsRWlQaVMxX1BQdiIsCiAgICAicGFyYW1ldGVycyIgOgpAQCAtNjUxMSwxMSArNzcyNywxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC02NTMxLDcgKzc3NDcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC02NTQwLDcgKzc3NTYsNyBAQAogICAgInBhcmFtZXRlcnMiIDoKICAgIFsKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKQEAgLTY1NTAsNyArNzc2Niw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTY1NTksNyArNzc3NSw3IEBACiAgICAicGFyYW1ldGVycyIgOgogICAgWwogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCkBAIC02NTY5LDcgKzc3ODUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6YXR0ZW1wdEluY1dlYWsiLApAQCAtNjU3OCwxNCArNzc5NCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmF0dGVtcHRJbmNTdHJvbmciLApAQCAtNjU5NCwxNCArNzgxMCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmluY1dlYWtSZXF1aXJlV2VhayIsCkBAIC02NjEwLDE0ICs3ODI2LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6ZGVjV2VhayIsCkBAIC02NjI2LDE0ICs3ODQyLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6aW5jV2VhayIsCkBAIC02NjQyLDE0ICs3ODU4LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6dHJhY2tNZSIsCkBAIC02NjU4LDcgKzc4NzQsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiCkBAIC02NjY4LDcgKzc4ODQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY2NzgsMTQgKzc4OTQsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02Njk1LDE0ICs3OTExLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjcxMiwxNCArNzkyOCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02NzI5LDcgKzc5NDUsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKQEAgLTY3MzksNyArNzk1NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjc0OSwxMSArNzk2NSwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3NjMsMTEgKzc5NzksMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02Nzc3LDExICs3OTkzLDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjc5MSwxMSArODAwNywxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY4MDUsMjcgKzgwMjEsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgotICB9LAotICB7Ci0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kUGF0aCIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkN1N0cmluZzgxMGFwcGVuZFBhdGhFUEtjIiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6bG9ja0J1ZmZlciIsCkBAIC02ODM0LDE0ICs4MDM0LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQYyIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNjg1MSw3ICs4MDUxLDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTY4NjEsNyArODA2MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kRm9ybWF0IiwKQEAgLTY4NzAsMTQgKzgwNzAsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojp1bmxvY2tCdWZmZXIiLApAQCAtNjg4NiwxNCArODA4NiwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojp1bmxvY2tCdWZmZXIiLApAQCAtNjkwMiwxMSArODEwMiwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZEZvcm1hdFYiLApAQCAtNjkxNSw3ICs4MTE1LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTY5MjUsMjAgKzgxMjUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCi0gIH0sCi0gIHsKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojpjb252ZXJ0VG9SZXNQYXRoIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODE2Y29udmVydFRvUmVzUGF0aEV2IiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Y2xlYXIiLApAQCAtNjk0NywxMSArODEzNCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnNldFRvIiwKQEAgLTY5NjAsNyArODE0Nyw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgpAQCAtNjk3MCw3ICs4MTU3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpzZXRUbyIsCkBAIC02OTc5LDcgKzgxNjYsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEcyIKQEAgLTY5ODksNyArODE3Niw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6c2V0VG8iLApAQCAtNjk5OCwxNCArODE4NSwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnNldFRvIiwKQEAgLTcwMTQsNyArODIwMSw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC03MDI0LDcgKzgyMTEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnNldFRvIiwKQEAgLTcwMzMsMTQgKzgyMjAsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjphcHBlbmQiLApAQCAtNzA0OSwxNCArODIzNiwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZCIsCkBAIC03MDY1LDcgKzgyNTIsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgpAQCAtNzA3NSw3ICs4MjYyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjphcHBlbmQiLApAQCAtNzA4NCwxNCArODI3MSwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmZvcm1hdCIsCkBAIC03MTAyLDggKzgyODksOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Zm9ybWF0ViIsCkBAIC03MTE3LDggKzgzMDQsOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJU3Q5X192YV9saXN0IgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6dG9Mb3dlciIsCkBAIC03MTI3LDExICs4MzE0LDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6cmVtb3ZlQWxsIiwKQEAgLTcxNDAsMTQgKzgzMjcsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcxNTYsMTQgKzgzNDMsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRGkiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MTcyLDcgKzgzNTksNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEaSIKQEAgLTcxODIsNyArODM2OSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MTkxLDE0ICs4Mzc4LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzIwNyw3ICs4Mzk0LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRHMiCkBAIC03MjE3LDcgKzg0MDQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzIyNiwxNCArODQxMywxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzI0Miw3ICs4NDI5LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTcyNTIsNyArODQzOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MjYxLDE0ICs4NDQ4LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNkUiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03Mjc3LDE0ICs4NDY0LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MjkzLDExICs4NDgwLDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MzA2LDE0ICs4NDkzLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzMyMiw3ICs4NTA5LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRGkiCkBAIC03MzMyLDcgKzg1MTksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzM0MSwxNCArODUyOCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEcyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTczNTcsNyArODU0NCw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgpAQCAtNzM2Nyw3ICs4NTU0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTczNzYsMTQgKzg1NjMsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTczOTIsNyArODU3OSw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC03NDAyLDcgKzg1ODksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzQxMSwxNCArODU5OCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTZFIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzQyNywxNCArODYxNCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzQ0MywxMSArODYzMCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6On5TdHJpbmc4IiwKQEAgLTc0NTYsMTEgKzg2NDMsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojp+U3RyaW5nOCIsCkBAIC03NDY5LDExICs4NjU2LDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc0OTAsNyArODY3Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnJlcGxhY2VBbGwiLApAQCAtNzUwOSw3ICs4Njk2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NTI1LDcgKzg3MTIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQRHMiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzU0MSw3ICs4NzI4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc1NTUsNyArODc0Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc1NjgsNyArODc1NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnNldFRvIiwKQEAgLTc1ODQsNyArODc3MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c2V0VG8iLApAQCAtNzYwMyw3ICs4NzkwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzZXRUbyIsCkBAIC03NjE5LDcgKzg4MDYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnNldFRvIiwKQEAgLTc2NDIsNyArODgyOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6YXBwZW5kIiwKQEAgLTc2NjEsNyArODg0OCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6YXBwZW5kIiwKQEAgLTc2NzcsNyArODg2NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6aW5zZXJ0IiwKQEAgLTc2OTYsNyArODg4Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6aW5zZXJ0IiwKQEAgLTc3MTgsNyArODkwNSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzczMiw3ICs4OTE5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NzQ2LDcgKzg5MzMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc3NjIsNyArODk0OSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzc3OCw3ICs4OTY1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03Nzk3LDcgKzg5ODQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc4MTMsNyArOTAwMCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzgzMiw3ICs5MDE5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03ODQ0LDExICs5MDMxLDExIEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOFN0cmluZzE2RSIKICAgICB9LAogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03ODY0LDcgKzkwNTEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc4ODcsNyArOTA3NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzkwMCw3ICs5MDg3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTE2LDcgKzkxMDMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc5MzIsNyArOTExOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzk1MSw3ICs5MTM4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTY3LDcgKzkxNTQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc5ODYsNyArOTE3Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzk5OCwxMSArOTE4NSwxMSBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNkUiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtODAxOCw3ICs5MjA1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC04MDQxLDcgKzkyMjgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTgwNTQsNyArOTI0MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6flN0cmluZzE2IiwKQEAgLTgwNjcsNyArOTI1NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6flN0cmluZzE2IiwKQEAgLTgwODAsNyArOTI2Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6b3BlcmF0b3I9IiwKQEAgLTgwOTYsNyArOTI4Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ4U3RyaW5nMTZFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6RmRQcmludGVyOjpwcmludExpbmUiLApAQCAtODQxMCwxNCArOTU5NywxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBLdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpjYXBhY2l0eSIsCkBAIC04NDI2LDExICs5NjEzLDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEltIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTg0NDAsMTEgKzk2MjcsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSW0iLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTg0NjUsNyArOTY1Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6aW5kZXhPZiIsCkBAIC04NDgxLDcgKzk2NjgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6Om9yZGVyT2YiLApAQCAtODQ5Nyw3ICs5Njg0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OmdldEFsbG93Tm9uQ2FsbGJhY2tzIiwKQEAgLTg5ODEsMTQgKzEwMTY4LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmdldFdlYWtSZWZzIiwKQEAgLTg5OTcsMTEgKzEwMTg0LDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6Z2V0V2Vha0NvdW50IiwKQEAgLTkwMTQsNyArMTAyMDEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6cmVmQmFzZSIsCkBAIC05MDI2LDggKzEwMjEzLDggQEAKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6cHJpbnRSZWZzIiwKQEAgLTkwNDAsNyArMTAyMjcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmZvcmNlSW5jU3Ryb25nIiwKQEAgLTkwNDksMTQgKzEwMjM2LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpnZXRTdHJvbmdDb3VudCIsCkBAIC05MDY1LDExICsxMDI1MiwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6aW5jU3Ryb25nUmVxdWlyZVN0cm9uZyIsCkBAIC05MDc4LDE0ICsxMDI2NSwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6ZGVjU3Ryb25nIiwKQEAgLTkwOTQsMTQgKzEwMjgxLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjppbmNTdHJvbmciLApAQCAtOTExMCw4MCArMTAyOTcsNDIgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgeworICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Z2V0UGF0aERpciIsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTBnZXRQYXRoRGlyRXYiLAogICAgInBhcmFtZXRlcnMiIDoKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKLSAgfSwKLSAgewotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmdldEJhc2VQYXRoIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxMWdldEJhc2VQYXRoRXYiLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Z2V0UGF0aExlYWYiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODExZ2V0UGF0aExlYWZFdiIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6ZmluZF9leHRlbnNpb24iLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODE0ZmluZF9leHRlbnNpb25FdiIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUGMiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKLSAgfSwKLSAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmdldFBhdGhFeHRlbnNpb24iLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODE2Z2V0UGF0aEV4dGVuc2lvbkV2IiwKICAgICJwYXJhbWV0ZXJzIiA6CiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmZpbmQiLApAQCAtOTE5Miw3ICsxMDM0MSw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTkyMDMsNyArMTAzNTIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6Omxlbmd0aCIsCkBAIC05MjEyLDI4ICsxMDM2MSwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSW0iLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKLSAgfSwKLSAgewotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OndhbGtQYXRoIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzg4d2Fsa1BhdGhFUFMwXyIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9LAotICAgIHsKLSAgICAgImRlZmF1bHRfYXJnIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnN0YXJ0c1dpdGgiLApAQCAtOTI0OSw3ICsxMDM4MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c3RhcnRzV2l0aCIsCkBAIC05MjY1LDcgKzEwMzk3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2Ojppc1N0YXRpY1N0cmluZyIsCkBAIC05Mjc4LDcgKzEwNDEwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC05MjkyLDcgKzEwNDI0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzaXplIiwKQEAgLTkzMDUsNyArMTA0MzcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEltIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmNvbnRhaW5zIiwKQEAgLTkzMjEsNyArMTA0NTMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmZpbmRMYXN0IiwKQEAgLTkzMzcsNyArMTA0NjksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmZpbmRGaXJzdCIsCkBAIC05MzUzLDcgKzEwNDg1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0b3BXYXRjaDo6ZWxhcHNlZFRpbWUiLApAQCAtOTU0Niw3ICsxMDY3OCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RybGVuMTYiLApAQCAtOTU1OCw3ICsxMDY5MCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSW0iLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RybmNtcDE2IiwKQEAgLTk1NzYsNyArMTA3MDgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN0cm5sZW4xNiIsCkBAIC05NTkxLDcgKzEwNzIzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJzdHIxNiIsCkBAIC05NjA2LDcgKzEwNzM4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN0cnpjbXAxNiIsCkBAIC05NjI3LDcgKzEwNzU5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJzeXN0ZW1UaW1lIiwKQEAgLTk2NzYsNyArMTA4MDgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjE2X3RvX3V0ZjhfbGVuZ3RoIiwKQEAgLTk2OTEsNyArMTA4MjMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjMyX2Zyb21fdXRmOF9hdCIsCkBAIC05NzEyLDcgKzEwODQ0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1dGYzMl90b191dGY4IiwKQEAgLTk3MzMsNyArMTA4NjUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjMyX3RvX3V0ZjhfbGVuZ3RoIiwKQEAgLTk3NDgsNyArMTA4ODAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjhfdG9fdXRmMTYiLApAQCAtOTc2OSw3ICsxMDkwMSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBEcyIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1dGY4X3RvX3V0ZjE2X2xlbmd0aCIsCkBAIC05Nzg4LDcgKzEwOTIwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1dGY4X3RvX3V0ZjE2X25vX251bGxfdGVybWluYXRvciIsCkBAIC05ODA5LDcgKzEwOTQxLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfQogIF0sCiAgImdsb2JhbF92YXJzIiA6CkBAIC05ODMxLDE2ICsxMDk2MywxNiBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUExX0tEcyIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUkExX0tEcyIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9ySW1wbCAmIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTk4NDksNyArMTA5ODEsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtOTg1OCw3ICsxMDk5MCw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC05OTcwLDEyICsxMTEwMiwyMSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2OjpTdGF0aWNEYXRhPDE+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTG0xRUVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC05OTg0LDcgKzExMTI1LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMDA4OSwxOSArMTEyMzAsMTkgQEAKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsICYiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGwgJiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMDIxMywxMiArMTEzNTQsMjEgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOCAmIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTAzMDIsNyArMTE0NTIsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURzIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQRHMiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMDMyMCw3ICsxMTQ3MCw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQS3ZTMF9FIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQRmlQS3ZTMF9FIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTEwMzI5LDcgKzExNDc5LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGaVBLdlMwX1B2RSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUEZpUEt2UzBfUHZFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTEwMzgzLDcgKzExNTMzLDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLRGkiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLRGkiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTAzOTIsNyArMTE1NDIsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtEcyIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUEtEcyIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTA0MDUsNiArMTE1NTUsMTUgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3JJbXBsICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TGlnaHRSZWZCYXNlPGFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZT4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKQEAgLTEwNDI4LDcgKzExNTg3LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTEwNTkwLDcgKzExNzQ5LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMDYwOCw3ICsxMTc2Nyw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTEwNjIxLDYgKzExNzgwLDE1IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIiwKKyAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZCYXNlICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTdHJpbmc4ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUiLApAQCAtMTA2MzAsMjEgKzExNzk4LDIxIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIiwKKyAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTdHJpbmc4ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogOCwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OkNhbGxTdGFjayAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTA3MTMsMTAgKzExODgxLDEwIEBACiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbCAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTEwNzc5LDcgKzExOTQ3LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFN0YXRpY1N0cmluZzE2SUxtMUVFRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDE0U3RhdGljU3RyaW5nMTZJTG0xRUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTA4MDEsMTIgKzExOTY5LDIxIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZlcmVuY2VSZW5hbWVyICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsICoiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTA4MjgsNiArMTIwMDUsMTUgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlZpcnR1YWxMaWdodFJlZkJhc2UgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMjBTaW1wbGVMb29wZXJDYWxsYmFja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNpbXBsZUxvb3BlckNhbGxiYWNrICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFIiwKQEAgLTExMDQ5LDcgKzEyMjM1LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTEwOTgsNiArMTIyODQsMTUgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlRSIsCkBAIC0xMTEwNyw2ICsxMjMwMiwxNSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCkBAIC0xMTExNiwxMiArMTIzMjAsMjEgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdGF0aWNEYXRhPDE+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTG0xRUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTExMzAsMjUgKzEyMzQzLDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogOCwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJuYW1lIiA6ICJhbmRyb2lkOjpDYWxsU3RhY2s6OlN0YWNrRGVsZXRlciAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOUNhbGxTdGFjazEyU3RhY2tEZWxldGVyRSIsCi0gICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDgsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImFuZHJvaWQ6OkNhbGxTdGFjayAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTExMjM4LDcgKzEyNDMzLDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQbSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMTI2MCw3ICsxMjQ1NSw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJQTFfRHMiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUExX0tEcyIsCiAgICAic2l6ZSIgOiAyLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTExMjkwLDcgKzEyNDg1LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElEaSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJS0RpIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMiwKQEAgLTExMzAwLDcgKzEyNDk1LDE3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRHMiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUtEcyIsCiAgICAic2l6ZSIgOiAyLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImlzX2NvbnN0IiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9ySW1wbCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQwLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTExMzM3LDIwICsxMjU0MiwyMCBAQAogICAgImlzX2NvbnN0IiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAiaXNfY29uc3QiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDQwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMTU0MCw3ICsxMjc0NSw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLAogICAgInNpemUiIDogNDAsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMTU2NywxMCArMTI3NzIsMjAgQEAKICAgICJpc19jb25zdCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAogICAgInNpemUiIDogMSwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImlzX2NvbnN0IiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkN1JlZkJhc2VFIiwKKyAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZCYXNlIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDE2LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTExNTg3LDYgKzEyODAyLDE2IEBACiAgICAiaXNfY29uc3QiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzgiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzgiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAic2l6ZSIgOiA4LApAQCAtMTE2MDAsNyArMTI4MjUsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTG0xRUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTE2MTAsMTcgKzEyODM1LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKLSAgfSwKLSAgewotICAgImFsaWdubWVudCIgOiA4LAotICAgImlzX2NvbnN0IiA6IHRydWUsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OkNhbGxTdGFjayIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2l6ZSIgOiA0MCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTIzNTEsNiArMTM1NjYsODUgQEAKICAgIFsKICAgICB7CiAgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAorICAgICAiZmllbGRfbmFtZSIgOiAibVN0b3JhZ2UiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDY0LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAorICAgICAiZmllbGRfbmFtZSIgOiAibUNvdW50IiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAxMjgsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0sCisgICAgeworICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKKyAgICAgImZpZWxkX25hbWUiIDogIm1GbGFncyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMTkyLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2oiCisgICAgfSwKKyAgICB7CisgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAorICAgICAiZmllbGRfbmFtZSIgOiAibUl0ZW1TaXplIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAyNTYsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLbSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbCIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0MCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiY29tcGxldGVfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkMTBWZWN0b3JJbXBsRDFFdiIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImRlbGV0aW5nX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDEwVmVjdG9ySW1wbEQwRXYiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxMmRvX2NvbnN0cnVjdEVQdm0iCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxMGRvX2Rlc3Ryb3lFUHZtIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsN2RvX2NvcHlFUHZQS3ZtIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsOGRvX3NwbGF0RVB2UEt2bSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDE1ZG9fbW92ZV9mb3J3YXJkRVB2UEt2bSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDE2ZG9fbW92ZV9iYWNrd2FyZEVQdlBLdm0iCisgICAgfQorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKICAgICAgImZpZWxkX25hbWUiIDogIm1UYWciLAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKICAgICB9CkBAIC0xMjQwOCw2ICsxMzcwMiwyOCBAQAogICAgXQogICB9LAogICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKKyAgICAgImZpZWxkX25hbWUiIDogIm1Db3VudCIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElOU3QzX18xNmF0b21pY0lpRUUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzE5VmlydHVhbExpZ2h0UmVmQmFzZUVFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6TGlnaHRSZWZCYXNlPGFuZHJvaWQ6OlZpcnR1YWxMaWdodFJlZkJhc2U+IiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzE5VmlydHVhbExpZ2h0UmVmQmFzZUVFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xOVZpcnR1YWxMaWdodFJlZkJhc2VFRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgorICAgXQorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCkBAIC0xMjcxNyw2ICsxNDAzMywxNiBAQAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTRSZWZlcmVuY2VNb3ZlckUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZmVyZW5jZU1vdmVyIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0UmVmZXJlbmNlTW92ZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0UmVmZXJlbmNlTW92ZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCkBAIC0xMjczOSw3ICsxNDA2NSw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRTdGF0aWNTdHJpbmcxNklMbTFFRUUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0U3RhdGljU3RyaW5nMTZJTG0xRUVFIiwKICAgICJzaXplIiA6IDE2LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTEyODIyLDYgKzE0MTQ4LDMwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZmVyZW5jZVJlbmFtZXIiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyY2xFbSIKKyAgICB9CisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKICAgICJiYXNlX3NwZWNpZmllcnMiIDoKICAgIFsKICAgICB7CkBAIC0xMjg4Myw2ICsxNDIzMyw2OCBAQAogICAgXQogICB9LAogICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiYmFzZV9zcGVjaWZpZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQwLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiLAorICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CisgICBbCisgICAgeworICAgICAia2luZCIgOiAib2Zmc2V0X3RvX3RvcCIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogInJ0dGkiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJjb21wbGV0ZV9kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxEMUV2IgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiZGVsZXRpbmdfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRDBFdiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDEyZG9fY29uc3RydWN0RVB2bSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDEwZG9fZGVzdHJveUVQdm0iCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGw3ZG9fY29weUVQdlBLdm0iCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGw4ZG9fc3BsYXRFUHZQS3ZtIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTVkb19tb3ZlX2ZvcndhcmRFUHZQS3ZtIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTZkb19tb3ZlX2JhY2t3YXJkRVB2UEt2bSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbDEwZG9fY29tcGFyZUVQS3ZTMl8iCisgICAgfQorICAgXQorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCkBAIC0xMzA4Nyw2ICsxNDQ5OSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxib29sPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWIiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGNoYXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRUUiLApAQCAtMTMxMDAsNiArMTQ1MjUsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Y2hhcj4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEljIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxkb3VibGU+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRUUiLApAQCAtMTMxMTMsNiArMTQ1NTEsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZG91YmxlPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGZsb2F0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZkVFIiwKQEAgLTEzMTI2LDYgKzE0NTc3LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGZsb2F0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWYiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRUUiLApAQCAtMTMxMzksNiArMTQ2MDMsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgY2hhcj4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEloIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxpbnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRUUiLApAQCAtMTMxNTIsNiArMTQ2MjksMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8aW50PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGludD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFRSIsCkBAIC0xMzE2NSw2ICsxNDY1NSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBpbnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFRSIsCkBAIC0xMzE3OCw2ICsxNDY4MSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWwiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRUUiLApAQCAtMTMxOTEsNiArMTQ3MDcsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEltIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxzaG9ydD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFRSIsCkBAIC0xMzIwNCw2ICsxNDczMywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxzaG9ydD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElzIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBzaG9ydD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFRSIsCkBAIC0xMzIxNyw2ICsxNDc1OSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBzaG9ydD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl0IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx2b2lkPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkVFIiwKQEAgLTEzMjMwLDYgKzE0Nzg1LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZyBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeEVFIiwKQEAgLTEzMjQzLDYgKzE0ODExLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmcgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl4IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl5RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nIGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl5RUUiLApAQCAtMTMyNTYsNiArMTQ4MzcsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLApAQCAtMTMzMDgsNiArMTQ5MDIsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJYkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8Ym9vbD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEliIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0VFIiwKQEAgLTEzMzIxLDYgKzE0OTI4LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGNoYXI+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZG91YmxlPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEVFIiwKQEAgLTEzMzM0LDYgKzE0OTU0LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGRvdWJsZT4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElkIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxmbG9hdD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFRSIsCkBAIC0xMzM0Nyw2ICsxNDk4MCwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxmbG9hdD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElmIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEVFIiwKQEAgLTEzMzYwLDYgKzE1MDA2LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGNoYXI+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8aW50PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUVFIiwKQEAgLTEzMzczLDYgKzE1MDMyLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWlFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGludD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElpIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBpbnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRUUiLApAQCAtMTMzODYsNiArMTUwNTgsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgaW50PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWoiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRUUiLApAQCAtMTMzOTksNiArMTUwODQsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8bG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElsIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUVFIiwKQEAgLTEzNDEyLDYgKzE1MTEwLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJbSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8c2hvcnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRUUiLApAQCAtMTM0MjUsNiArMTUxMzYsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8c2hvcnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJcyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RUUiLApAQCAtMTM0MzgsNiArMTUxNjIsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFRSIsCkBAIC0xMzQ1MSw2ICsxNTE4OCwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx2b2lkPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXYiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmcgbG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFRSIsCkBAIC0xMzQ2NCw2ICsxNTIxNCwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nIGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKQEAgLTEzNDc3LDYgKzE1MjQwLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl5RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl5IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKQEAgLTEzNTI5LDYgKzE1MzA1LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGJvb2w+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckliRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Y2hhcj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFRSIsCkBAIC0xMzU0Miw2ICsxNTMzMSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckljRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxjaGFyPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGRvdWJsZT4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFRSIsCkBAIC0xMzU1NSw2ICsxNTM1NywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZmxvYXQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRUUiLApAQCAtMTM1NjgsNiArMTUzODMsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZmxvYXQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgY2hhcj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFRSIsCkBAIC0xMzU4MSw2ICsxNTQwOSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckloRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBjaGFyPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGludD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFRSIsCkBAIC0xMzU5NCw2ICsxNTQzNSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgaW50PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFIiwKQEAgLTEzNjA3LDYgKzE1NDYxLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGludD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklqRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElqIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEVFIiwKQEAgLTEzNjIwLDYgKzE1NDg3LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJbCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FRSIsCkBAIC0xMzYzMyw2ICsxNTUxMywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSW0iCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHNob3J0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0VFIiwKQEAgLTEzNjQ2LDYgKzE1NTM5LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHNob3J0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIHNob3J0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEVFIiwKQEAgLTEzNjU5LDYgKzE1NTY1LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIHNob3J0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHZvaWQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RUUiLApAQCAtMTM2NzIsNiArMTU1OTEsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl2IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nIGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUiLApAQCAtMTM2ODUsNiArMTU2MTcsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZyBsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFRSIsCkBAIC0xMzY5OCw2ICsxNTY0MywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nIGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCkBAIC0xMzc1MCwxMiArMTU3MDgsMjUgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpTdHJpbmc4PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU184U3RyaW5nMTZFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpTdHJpbmcxNj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzhTdHJpbmcxNkVFRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUVFIiwKICAgICJzaXplIiA6IDEsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKICAgIFsKICAgICAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiCkBAIC0xMzc3Niw2ICsxNTc0NywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxib29sPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWIiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGNoYXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRUUiLApAQCAtMTM3ODksNiArMTU3NzMsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Y2hhcj4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEljIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxkb3VibGU+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRUUiLApAQCAtMTM4MDIsNiArMTU3OTksMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZG91YmxlPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkVFIiwKQEAgLTEzODE1LDYgKzE1ODI1LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWYiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGNoYXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRUUiLApAQCAtMTM4MjgsNiArMTU4NTEsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgY2hhcj4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEloIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxpbnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRUUiLApAQCAtMTM4NDEsNiArMTU4NzcsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8aW50PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGludD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSIsCkBAIC0xMzg1NCw2ICsxNTkwMywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBpbnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFRSIsCkBAIC0xMzg2Nyw2ICsxNTkyOSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWwiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRUUiLApAQCAtMTM4ODAsNiArMTU5NTUsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEltIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFRSIsCkBAIC0xMzg5Myw2ICsxNTk4MSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElzIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBzaG9ydD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXRFRSIsCkBAIC0xMzkwNiw2ICsxNjAwNywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBzaG9ydD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl0IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkVFIiwKQEAgLTEzOTE5LDYgKzE2MDMzLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHZvaWQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZyBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFIiwKQEAgLTEzOTMyLDYgKzE2MDU5LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmcgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl4IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nIGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RUUiLApAQCAtMTM5NDQsNiArMTYwODQsMTkgQEAKICAgIF0KICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXkiCisgICBdCisgIH0sCisgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJiYXNlX3NwZWNpZmllcnMiIDoKICAgIFsKQEAgLTEzOTgyLDYgKzE2MTM1LDQwIEBACiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCiAgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlZpcnR1YWxMaWdodFJlZkJhc2UiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMTYsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiY29tcGxldGVfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRDFFdiIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImRlbGV0aW5nX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUQwRXYiCisgICAgfQorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiYmFzZV9zcGVjaWZpZXJzIiA6CisgICBbCisgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0UiCiAgICAgfQogICAgXSwKQEAgLTE0OTUxLDcgKzE3MTM4LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCkBAIC0xNDk2MCwxMCArMTcxNDcsMTAgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzaXplIiA6IDQwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKICAgIFsKLSAgICAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybTY0X2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHNfbHRvLW5vbmUvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgXSwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgogICAgWwpAQCAtMTUxNTEsNiArMTczMzgsMTYgQEAKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJmaWVsZHMiIDoKICAgIFsKQEAgLTE1MjA1LDYgKzE3NDAyLDU1IEBACiAgICBbCiAgICAgewogICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKKyAgICAgImZpZWxkX25hbWUiIDogIm1SZWZzIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiA2NCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfaW1wbEUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZSIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMTYsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIsCisgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJraW5kIiA6ICJvZmZzZXRfdG9fdG9wIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAicnR0aSIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiY29tcGxldGVfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2VEMUV2IgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiZGVsZXRpbmdfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2VEMEV2IgorICAgIH0sCisgICAgeworICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZTEwb25GaXJzdFJlZkV2IgorICAgIH0sCisgICAgeworICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZTE1b25MYXN0U3Ryb25nUmVmRVBLdiIKKyAgICB9LAorICAgIHsKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2UyMG9uSW5jU3Ryb25nQXR0ZW1wdGVkRWpQS3YiCisgICAgfSwKKyAgICB7CisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDdSZWZCYXNlMTNvbkxhc3RXZWFrUmVmRVBLdiIKKyAgICB9CisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJmaWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAogICAgICAiZmllbGRfbmFtZSIgOiAibVN0cmluZyIsCiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCiAgICAgfQpAQCAtMTUyMTgsNiArMTc0NjQsMjQgQEAKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJmaWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAorICAgICAiZmllbGRfbmFtZSIgOiAibVN0cmluZyIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOCIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm02NF9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzX2x0by1ub25lL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtNjRfYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlsc19sdG8tbm9uZS9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAiZmllbGRzIiA6CiAgICBbCkBAIC0xNTIzNiw3ICsxNzUwMCw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxtMUVFRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxtMUVFRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTE1MjU0LDM0ICsxNzUxOCw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogMSwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2sxMlN0YWNrRGVsZXRlckUiLAotICAgIm5hbWUiIDogImFuZHJvaWQ6OkNhbGxTdGFjazo6U3RhY2tEZWxldGVyIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJzaXplIiA6IDEsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogOCwKLSAgICJmaWVsZHMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgICAiZmllbGRfbmFtZSIgOiAibUZyYW1lTGluZXMiLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIKLSAgICB9Ci0gICBdLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImFuZHJvaWQ6OkNhbGxTdGFjayIsCi0gICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNpemUiIDogNDAsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTE1NTQ3LDcgKzE3Nzg0LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0KICBdCiB9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9hYmktZHVtcHMvYXJtX2FybTY0L3NvdXJjZS1iYXNlZC9saWJ1dGlscy5zby5sc2R1bXAgYi9saWJ1dGlscy9hYmktZHVtcHMvYXJtX2FybTY0L3NvdXJjZS1iYXNlZC9saWJ1dGlscy5zby5sc2R1bXAKaW5kZXggZjg4ZGExNS4uZGZjMWFiNSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvYWJpLWR1bXBzL2FybV9hcm02NC9zb3VyY2UtYmFzZWQvbGlidXRpbHMuc28ubHNkdW1wCisrKyBiL2xpYnV0aWxzL2FiaS1kdW1wcy9hcm1fYXJtNjQvc291cmNlLWJhc2VkL2xpYnV0aWxzLnNvLmxzZHVtcApAQCAtMTYsNyArMTYsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURzIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElBMV9EcyIsCiAgICAic2l6ZSIgOiAyLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKQEAgLTQ2LDYgKzQ2LDcgQEAKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiCiAgIH0sCiAgIHsKKyAgICJpc19vZl91bmtub3duX2JvdW5kIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElBX2YiLAogICAgIm5hbWUiIDogImZsb2F0W10iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWYiLApAQCAtNDkxLDYgKzQ5MiwyMiBAQAogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkMjdhZGRfc3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tFUEZ2dkVpIgogICB9LAogICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFNWNsZWFyRXYiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDJzcElOU182TG9vcGVyRUVhU0VPUzJfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFNWNsZWFyRXYiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDJzcElOU182VGhyZWFkRUVhU0VPUzJfIgorICB9LAorICB7CiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQzMGdldF9yZXBvcnRfc3lzcHJvcF9jaGFuZ2VfZnVuY0V2IgogICB9LAogICB7CkBAIC01NDUsNiArNTYyLDkgQEAKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI2YXdva2VuRXYiCiAgIH0sCiAgIHsKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI2cmVwb2xsRWkiCisgIH0sCisgIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI3cG9sbEFsbEVpUGlTMV9QUHYiCiAgIH0sCiAgIHsKQEAgLTcwNCw5ICs3MjQsNiBAQAogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2VEMkV2IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODEwYXBwZW5kUGF0aEVQS2MiCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDdTdHJpbmc4MTBsb2NrQnVmZmVyRWoiCiAgIH0sCiAgIHsKQEAgLTcyNSw5ICs3NDIsNiBAQAogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkN1N0cmluZzgxM2FwcGVuZEZvcm1hdFZFUEtjU3Q5X192YV9saXN0IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODE2Y29udmVydFRvUmVzUGF0aEV2IgotICB9LAotICB7CiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODVjbGVhckV2IgogICB9LAogICB7CkBAIC0xMTQ4LDE1ICsxMTYyLDYgQEAKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODEwZ2V0UGF0aERpckV2IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxMWdldEJhc2VQYXRoRXYiCi0gIH0sCi0gIHsKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODExZ2V0UGF0aExlYWZFdiIKLSAgfSwKLSAgewotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTRmaW5kX2V4dGVuc2lvbkV2IgotICB9LAotICB7CiAgICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxNmdldFBhdGhFeHRlbnNpb25FdiIKICAgfSwKICAgewpAQCAtMTE2Niw5ICsxMTcxLDYgQEAKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODZsZW5ndGhFdiIKICAgfSwKICAgewotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4OHdhbGtQYXRoRVBTMF8iCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ4U3RyaW5nMTYxMHN0YXJ0c1dpdGhFUEtEcyIKICAgfSwKICAgewpAQCAtMTIxNCw2ICsxMjE2LDE0IEBACiAgIH0sCiAgIHsKICAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSWl5RUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJaVMyX05TXzRoYXNoSWlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSWlTMl9OU184ZXF1YWxfdG9JaUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTMl9FRUU0ZmluZElpRUVOU18xNV9faGFzaF9pdGVyYXRvcklQTlNfMTFfX2hhc2hfbm9kZUlTMl9QdkVFRUVSS1RfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUlpeUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySWlTMl9OU180aGFzaElpRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbElpUzJfTlNfOGVxdWFsX3RvSWlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzJfRUVFNWVyYXNlRU5TXzIxX19oYXNoX2NvbnN0X2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVMyX1B2RUVFRSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAogICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJaXlFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlcklpUzJfTlNfNGhhc2hJaUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJaVMyX05TXzhlcXVhbF90b0lpRUVMYjFFRUVOU185YWxsb2NhdG9ySVMyX0VFRTZyZWhhc2hFaiIKICAgfSwKICAgewpAQCAtMTIyNiwxMCArMTIzNiwzMCBAQAogICB9LAogICB7CiAgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUlpeUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySWlTMl9OU180aGFzaElpRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbElpUzJfTlNfOGVxdWFsX3RvSWlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzJfRUVFRDJFdiIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJeU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEVFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlckl5UzVfTlNfNGhhc2hJeUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJeVM1X05TXzhlcXVhbF90b0l5RUVMYjFFRUVOU185YWxsb2NhdG9ySVM1X0VFRTE0X19lcmFzZV91bmlxdWVJeUVFalJLVF8iCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSXlON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJeVM1X05TXzRoYXNoSXlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSXlTNV9OU184ZXF1YWxfdG9JeUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTNV9FRUUxN19fZGVhbGxvY2F0ZV9ub2RlRVBOU18xNl9faGFzaF9ub2RlX2Jhc2VJUE5TXzExX19oYXNoX25vZGVJUzVfUHZFRUVFIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCiAgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUl5TjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySXlTNV9OU180aGFzaEl5RUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEl5UzVfTlNfOGVxdWFsX3RvSXlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFMjVfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzSXlKUkt5UlM0X0VFRU5TXzRwYWlySU5TXzE1X19oYXNoX2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVM1X1B2RUVFRWJFRVJLVF9EcE9UMF8iCiAgIH0sCiAgIHsKICAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSXlON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJeVM1X05TXzRoYXNoSXlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSXlTNV9OU184ZXF1YWxfdG9JeUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTNV9FRUU0ZmluZEl5RUVOU18xNV9faGFzaF9pdGVyYXRvcklQTlNfMTFfX2hhc2hfbm9kZUlTNV9QdkVFRUVSS1RfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUl5TjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySXlTNV9OU180aGFzaEl5RUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEl5UzVfTlNfOGVxdWFsX3RvSXlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFNWVyYXNlRU5TXzIxX19oYXNoX2NvbnN0X2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVM1X1B2RUVFRSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAogICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJeU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEVFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlckl5UzVfTlNfNGhhc2hJeUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJeVM1X05TXzhlcXVhbF90b0l5RUVMYjFFRUVOU185YWxsb2NhdG9ySVM1X0VFRTZyZWhhc2hFaiIKICAgfSwKICAgewpAQCAtMTI0MSw2ICsxMjcxLDEwIEBACiAgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUl5TjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySXlTNV9OU180aGFzaEl5RUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEl5UzVfTlNfOGVxdWFsX3RvSXlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFOF9fcmVoYXNoRWoiCiAgIH0sCiAgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSXlON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJeVM1X05TXzRoYXNoSXlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSXlTNV9OU184ZXF1YWxfdG9JeUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTNV9FRUVEMkV2IgorICB9LAorICB7CiAgICAibmFtZSIgOiAiX1pUdjBfbjEyX043YW5kcm9pZDE0TG9vcGVyQ2FsbGJhY2tEMEV2IgogICB9LAogICB7CkBAIC0xNDI1LDYgKzE0NTksMTAgQEAKICAgfSwKICAgewogICAgIm5hbWUiIDogIl9aVFZON2FuZHJvaWQ5RmRQcmludGVyRSIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9fbGx2bV9mc19kaXNjcmltaW5hdG9yX18iCiAgIH0KICBdLAogICJlbnVtX3R5cGVzIiA6CkBAIC0yMjY1LDYgKzIzMDMsMjMgQEAKICAgICJlbnVtX2ZpZWxkcyIgOgogICAgWwogICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMTMsCisgICAgICJuYW1lIiA6ICJIQUxfQ09MT1JfTU9ERV9ESVNQTEFZX0JUMjAyMCIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjVhbmRyb2lkX2NvbG9yX21vZGVfdjFfMl90IiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkX2NvbG9yX21vZGVfdjFfMl90IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyNWFuZHJvaWRfY29sb3JfbW9kZV92MV8yX3QiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSTI1YW5kcm9pZF9jb2xvcl9tb2RlX3YxXzJfdCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4yLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKICAgICAgIm5hbWUiIDogIkhBTF9DT0xPUl9UUkFOU0ZPUk1fSURFTlRJVFkiCiAgICAgfSwKQEAgLTI1MDQsNiArMjU1OSwzMSBAQAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCiAgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6SEFTX1RSSVZJQUxfQ1RPUiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMiwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OkhBU19UUklWSUFMX0RUT1IiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDQsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpIQVNfVFJJVklBTF9DT1BZIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGwxNyRIQVNfVFJJVklBTF9DT1BZRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGwxNyRIQVNfVFJJVklBTF9DT1BZRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsMTckSEFTX1RSSVZJQUxfQ09QWUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF9wb2ludGVyPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+Ojp2YWx1ZSIKICAgICB9CkBAIC0yNjQ4LDYgKzI3MjgsOTkgQEAKICAgICJlbnVtX2ZpZWxkcyIgOgogICAgWwogICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6Ok9LIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6Tk9fRVJST1IiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQ4LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VU5LTk9XTl9FUlJPUiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTEyLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6Tk9fTUVNT1JZIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMzgsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIyLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6QkFEX1ZBTFVFIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMjE0NzQ4MzY0NywKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OkJBRF9UWVBFIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMiwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6Ok5BTUVfTk9UX0ZPVU5EIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlBFUk1JU1NJT05fREVOSUVEIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMTksCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpOT19JTklUIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMTcsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpBTFJFQURZX0VYSVNUUyIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTMyLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6REVBRF9PQkpFQ1QiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQ2LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6RkFJTEVEX1RSQU5TQUNUSU9OIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtNzUsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpCQURfSU5ERVgiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC02MSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6Ok5PVF9FTk9VR0hfREFUQSIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTExLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6V09VTERfQkxPQ0siCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xMTAsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpUSU1FRF9PVVQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC03NCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlVOS05PV05fVFJBTlNBQ1RJT04iCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6RkRTX05PVF9BTExPV0VEIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMjE0NzQ4MzY0MCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlVORVhQRUNURURfTlVMTCIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTUkQUxSRUFEWV9FWElTVFNFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE1JEFMUkVBRFlfRVhJU1RTRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvRXJyb3JzLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNSRBTFJFQURZX0VYSVNUU0UjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL0Vycm9ycy5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9FcnJvcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaSIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxOSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlBSSU9SSVRZX0xPV0VTVCIKICAgICB9LApAQCAtMjc3OCw2ICsyOTUxLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGJvb2w+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGNoYXI+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMjc5NSw2ICsyOTg1LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGNoYXI+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGRvdWJsZT46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yODEyLDYgKzMwMTksMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZG91YmxlPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxkb3VibGU+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGZsb2F0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI4MjksNiArMzA1MywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxmbG9hdD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZmxvYXQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMjg0Niw2ICszMDg3LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGludD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yODYzLDYgKzMxMjEsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8aW50Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxpbnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGludD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yODgwLDYgKzMxNTUsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgaW50Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMjg5Nyw2ICszMTg5LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMjkxNCw2ICszMjIzLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHNob3J0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI5MzEsNiArMzI1NywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8c2hvcnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTI5NDgsNiArMzI5MSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMjk2NSw2ICszMzI1LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmcgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yOTgyLDYgKzMzNTksMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0yOTk4LDYgKzMzOTIsMjMgQEAKICAgICJlbnVtX2ZpZWxkcyIgOgogICAgWwogICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46OnZhbHVlIgogICAgIH0KQEAgLTMwNjcsNiArMzQ3OCwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxib29sPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxib29sPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMwODQsNiArMzUxMiwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxkb3VibGU+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzEwMSw2ICszNTQ2LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGRvdWJsZT46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZG91YmxlPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxmbG9hdD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMTE4LDYgKzM1ODAsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZmxvYXQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGZsb2F0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMxMzUsNiArMzYxNCwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxpbnQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzE1Miw2ICszNjQ4LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8aW50Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzE2OSw2ICszNjgyLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMxODYsNiArMzcxNiwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMyMDMsNiArMzc1MCwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxzaG9ydD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMjIwLDYgKzM3ODQsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8c2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHNob3J0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMjM3LDYgKzM4MTgsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx2b2lkPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMyNTQsNiArMzg1MiwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx2b2lkPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx2b2lkPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nIGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzI3MSw2ICszODg2LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzI4Nyw2ICszOTE5LDIzIEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+Ojp2YWx1ZSIKICAgICB9CkBAIC0zMzU2LDYgKzQwMDUsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Ym9vbD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckliRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Ym9vbD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Y2hhcj46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zMzczLDYgKzQwMzksMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Y2hhcj46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckljRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Y2hhcj46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZG91YmxlPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTMzOTAsNiArNDA3MywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGRvdWJsZT46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZmxvYXQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzQwNyw2ICs0MTA3LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGZsb2F0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxmbG9hdD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgY2hhcj46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNDI0LDYgKzQxNDEsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgY2hhcj46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckloRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgY2hhcj46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8aW50Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM0NDEsNiArNDE3NSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGludD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgaW50Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM0NTgsNiArNDIwOSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGludD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNDc1LDYgKzQyNDMsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZz46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNDkyLDYgKzQyNzcsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8c2hvcnQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzUwOSw2ICs0MzExLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxzaG9ydD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzUyNiw2ICs0MzQ1LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBzaG9ydD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNTQzLDYgKzQzNzksMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZyBsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM1NjAsNiArNDQxMywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM1NzYsNiArNDQ0NiwyMyBAQAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCiAgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6dmFsdWUiCiAgICAgfQpAQCAtMzY0NSw2ICs0NTMyLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6U3RyaW5nOD46Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6U3RyaW5nMTY+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzY1Myw3ICs0NTU3LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU184U3RyaW5nMTZFRTYkdmFsdWVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU184U3RyaW5nMTZFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCiAgIH0sCiAgIHsKQEAgLTM2NzksNiArNDU4MywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxib29sPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWJFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxib29sPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM2OTYsNiArNDYxNywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxkb3VibGU+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzcxMyw2ICs0NjUxLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGRvdWJsZT46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZG91YmxlPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxmbG9hdD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zNzMwLDYgKzQ2ODUsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZmxvYXQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM3NDcsNiArNDcxOSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxpbnQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzc2NCw2ICs0NzUzLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8aW50Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzc4MSw2ICs0Nzg3LDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM3OTgsNiArNDgyMSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM4MTUsNiArNDg1NSwyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zODMyLDYgKzQ4ODksMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8c2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJc0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHNob3J0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgogICAgIH0KICAgIF0sCkBAIC0zODQ5LDYgKzQ5MjMsMjMgQEAKICAgIFsKICAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6dmFsdWUiCiAgICAgfQogICAgXSwKQEAgLTM4NjYsNiArNDk1NywyMyBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nIGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzg4Myw2ICs0OTkxLDIzIEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKICAgICB9CiAgICBdLApAQCAtMzg5OSw2ICs1MDI0LDIzIEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6TXV0ZXg6OlBSSVZBVEUiCiAgICAgfSwKQEAgLTQxNzEsNiArNTMxMywyNCBAQAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCiAgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6RklSU1RfSU5DX1NUUk9ORyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxNyRGSVJTVF9JTkNfU1RST05HRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6KHVubmFtZWQpIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTE3JEZJUlNUX0lOQ19TVFJPTkdFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTE3JEZJUlNUX0lOQ19TVFJPTkdFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKICAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6Ok9CSkVDVF9MSUZFVElNRV9TVFJPTkciCiAgICAgfSwKQEAgLTQxOTIsNiArNTM1MiwzMiBAQAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCiAgIH0sCiAgIHsKKyAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpPQkpFQ1RfTElGRVRJTUVfU1RST05HIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6T0JKRUNUX0xJRkVUSU1FX1dFQUsiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpPQkpFQ1RfTElGRVRJTUVfTUFTSyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UyMSRPQkpFQ1RfTElGRVRJTUVfTUFTS0UiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6Oih1bm5hbWVkKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UyMSRPQkpFQ1RfTElGRVRJTUVfTUFTS0UjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMjEkT0JKRUNUX0xJRkVUSU1FX01BU0tFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCkBAIC00MzAwLDcgKzU0ODYsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUEt2UzBfRSIsCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElGaVBLdlMwX0UiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC00MzIxLDcgKzU1MDcsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUEt2UzBfUHZFIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUEt2UzBfUHZFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtNDQ3Nyw3ICs1NjYzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpzZXRDYXBhY2l0eSIsCkBAIC00NDkzLDcgKzU2NzksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OmFwcGVuZFZlY3RvciIsCkBAIC00NTA5LDcgKzU2OTUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OmVkaXRBcnJheUltcGwiLApAQCAtNDUyMiw3ICs1NzA4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUHYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6ZmluaXNoX3ZlY3RvciIsCkBAIC00NTM1LDcgKzU3MjEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6Omluc2VydEFycmF5QXQiLApAQCAtNDU1Nyw3ICs1NzQzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpyZW1vdmVJdGVtc0F0IiwKQEAgLTQ1NzcsNyArNTc2Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6aW5zZXJ0VmVjdG9yQXQiLApAQCAtNDU5Niw3ICs1NzgyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC00NjEwLDcgKzU3OTYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OmVkaXRJdGVtTG9jYXRpb24iLApAQCAtNDYyNiw3ICs1ODEyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUHYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6YWRkIiwKQEAgLTQ2NDIsNyArNTgyOCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6YWRkIiwKQEAgLTQ2NTUsNyArNTg0MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6cG9wIiwKQEAgLTQ2NjgsNyArNTg1NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6cHVzaCIsCkBAIC00Njg0LDcgKzU4NzAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnB1c2giLApAQCAtNDY5Nyw3ICs1ODgzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpzb3J0IiwKQEAgLTQ3MTMsNyArNTg5OSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6c29ydCIsCkBAIC00NzMyLDcgKzU5MTgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC00NzUyLDcgKzU5MzgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpjbGVhciIsCkBAIC00NzY1LDcgKzU5NTEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlc2l6ZSIsCkBAIC00NzgxLDcgKzU5NjcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC00ODAxLDcgKzU5ODcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6Omluc2VydEF0IiwKQEAgLTQ4MjQsNyArNjAxMCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6aW5zZXJ0QXQiLApAQCAtNDg0NCw3ICs2MDMwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpyZXBsYWNlQXQiLApAQCAtNDg2Myw3ICs2MDQ5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpyZXBsYWNlQXQiLApAQCAtNDg3OSw3ICs2MDY1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpWZWN0b3JJbXBsIiwKQEAgLTQ4OTUsNyArNjA4MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6VmVjdG9ySW1wbCIsCkBAIC00OTE0LDcgKzYxMDAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6On5WZWN0b3JJbXBsIiwKQEAgLTQ5MjcsNyArNjExMyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6flZlY3RvckltcGwiLApAQCAtNDk0MCw3ICs2MTI2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjp+VmVjdG9ySW1wbCIsCkBAIC00OTUzLDcgKzYxMzksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6Om9wZXJhdG9yPSIsCkBAIC00OTY5LDcgKzYxNTUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjp1cHRpbWVOYW5vcyIsCkBAIC01MjcwLDcgKzY0NTYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElOU3QzX18xMTJiYXNpY19zdHJpbmdJY05TXzExY2hhcl90cmFpdHNJY0VFTlNfOWFsbG9jYXRvckljRUVFRSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6ZWxhcHNlZFJlYWx0aW1lIiwKQEAgLTUyOTIsNyArNjQ3OCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6bWVyZ2UiLApAQCAtNTMwOCw3ICs2NDk0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjptZXJnZSIsCkBAIC01MzI0LDcgKzY1MTAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6OnJlbW92ZSIsCkBAIC01MzQwLDcgKzY1MjYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6OlNvcnRlZFZlY3RvckltcGwiLApAQCAtNTM1Niw3ICs2NTQyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjpTb3J0ZWRWZWN0b3JJbXBsIiwKQEAgLTUzNzUsNyArNjU2MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6flNvcnRlZFZlY3RvckltcGwiLApAQCAtNTM4OCw3ICs2NTc0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjp+U29ydGVkVmVjdG9ySW1wbCIsCkBAIC01NDAxLDcgKzY1ODcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6On5Tb3J0ZWRWZWN0b3JJbXBsIiwKQEAgLTU0MTQsNyArNjYwMCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6b3BlcmF0b3I9IiwKQEAgLTU0MzAsNyArNjYxNiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OkplbmtpbnNIYXNoV2hpdGVuIiwKQEAgLTU2OTQsNiArNjg4MCw2NCBAQAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL21pc2MuaCIKICAgfSwKICAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrPjo6Y2xlYXIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUU1Y2xlYXJFdiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3Blcj46Om9wZXJhdG9yPSIsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRWFTRU9TMl8iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJT043YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlRocmVhZD46OmNsZWFyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFNWNsZWFyRXYiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+OjpvcGVyYXRvcj0iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDJzcElOU182VGhyZWFkRUVhU0VPUzJfIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCisgIH0sCisgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpMaWdodFJlZkJhc2VfcmVwb3J0SW5jU3Ryb25nUmVxdWlyZVN0cm9uZ0ZhaWxlZCIsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNDdMaWdodFJlZkJhc2VfcmVwb3J0SW5jU3Ryb25nUmVxdWlyZVN0cm9uZ0ZhaWxlZEVQS3YiLAogICAgInBhcmFtZXRlcnMiIDoKQEAgLTU5NzAsNiArNzIxNCwyMiBAQAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LAogICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpyZXBvbGwiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDZMb29wZXI2cmVwb2xsRWkiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDZMb29wZXJFIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCisgIH0sCisgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OnBvbGxBbGwiLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDZMb29wZXI3cG9sbEFsbEVpUGlTMV9QUHYiLAogICAgInBhcmFtZXRlcnMiIDoKQEAgLTY1MDcsMTEgKzc3NjcsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTY1MjcsNyArNzc4Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTY1MzYsNyArNzc5Niw3IEBACiAgICAicGFyYW1ldGVycyIgOgogICAgWwogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKQEAgLTY1NDYsNyArNzgwNiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTY1NTUsNyArNzgxNSw3IEBACiAgICAicGFyYW1ldGVycyIgOgogICAgWwogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgpAQCAtNjU2NSw3ICs3ODI1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmF0dGVtcHRJbmNXZWFrIiwKQEAgLTY1NzQsMTQgKzc4MzQsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6YXR0ZW1wdEluY1N0cm9uZyIsCkBAIC02NTkwLDE0ICs3ODUwLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmluY1dlYWtSZXF1aXJlV2VhayIsCkBAIC02NjA2LDE0ICs3ODY2LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmRlY1dlYWsiLApAQCAtNjYyMiwxNCArNzg4MiwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjppbmNXZWFrIiwKQEAgLTY2MzgsMTQgKzc4OTgsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6dHJhY2tNZSIsCkBAIC02NjU0LDcgKzc5MTQsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIgpAQCAtNjY2NCw3ICs3OTI0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02Njc0LDE0ICs3OTM0LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY2OTEsMTQgKzc5NTEsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjcwOCwxNCArNzk2OCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjcyNSw3ICs3OTg1LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgpAQCAtNjczNSw3ICs3OTk1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02NzQ1LDExICs4MDA1LDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3NTksMTEgKzgwMTksMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjc3MywxMSArODAzMywxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02Nzg3LDExICs4MDQ3LDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY4MDEsMjcgKzgwNjEsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKLSAgfSwKLSAgewotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZFBhdGgiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDdTdHJpbmc4MTBhcHBlbmRQYXRoRVBLYyIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmxvY2tCdWZmZXIiLApAQCAtNjgzMCwxNCArODA3NCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBjIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC02ODQ3LDcgKzgwOTEsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTY4NTcsNyArODEwMSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kRm9ybWF0IiwKQEAgLTY4NjYsMTQgKzgxMTAsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6dW5sb2NrQnVmZmVyIiwKQEAgLTY4ODIsMTQgKzgxMjYsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnVubG9ja0J1ZmZlciIsCkBAIC02ODk4LDExICs4MTQyLDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZEZvcm1hdFYiLApAQCAtNjkxMSw3ICs4MTU1LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC02OTIxLDIwICs4MTY1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Y29udmVydFRvUmVzUGF0aCIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkN1N0cmluZzgxNmNvbnZlcnRUb1Jlc1BhdGhFdiIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmNsZWFyIiwKQEAgLTY5NDMsMTEgKzgxNzQsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6c2V0VG8iLApAQCAtNjk1Niw3ICs4MTg3LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgpAQCAtNjk2Niw3ICs4MTk3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpzZXRUbyIsCkBAIC02OTc1LDcgKzgyMDYsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRHMiCkBAIC02OTg1LDcgKzgyMTYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnNldFRvIiwKQEAgLTY5OTQsMTQgKzgyMjUsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6c2V0VG8iLApAQCAtNzAxMCw3ICs4MjQxLDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC03MDIwLDcgKzgyNTEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnNldFRvIiwKQEAgLTcwMjksMTQgKzgyNjAsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZCIsCkBAIC03MDQ1LDE0ICs4Mjc2LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZCIsCkBAIC03MDYxLDcgKzgyOTIsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTcwNzEsNyArODMwMiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kIiwKQEAgLTcwODAsMTQgKzgzMTEsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmZvcm1hdCIsCkBAIC03MDk4LDggKzgzMjksOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmZvcm1hdFYiLApAQCAtNzExMyw4ICs4MzQ0LDggQEAKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVN0OV9fdmFfbGlzdCIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojp0b0xvd2VyIiwKQEAgLTcxMjMsMTEgKzgzNTQsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6cmVtb3ZlQWxsIiwKQEAgLTcxMzYsMTQgKzgzNjcsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MTUyLDE0ICs4MzgzLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEaSIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcxNjgsNyArODM5OSw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEaSIKQEAgLTcxNzgsNyArODQwOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MTg3LDE0ICs4NDE4LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEcyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcyMDMsNyArODQzNCw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEcyIKQEAgLTcyMTMsNyArODQ0NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MjIyLDE0ICs4NDUzLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzIzOCw3ICs4NDY5LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC03MjQ4LDcgKzg0NzksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzI1NywxNCArODQ4OCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkOFN0cmluZzE2RSIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcyNzMsMTQgKzg1MDQsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzI4OSwxMSArODUyMCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTczMDIsMTQgKzg1MzMsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzMxOCw3ICs4NTQ5LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgpAQCAtNzMyOCw3ICs4NTU5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTczMzcsMTQgKzg1NjgsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzM1Myw3ICs4NTg0LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgpAQCAtNzM2Myw3ICs4NTk0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTczNzIsMTQgKzg2MDMsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03Mzg4LDcgKzg2MTksNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTczOTgsNyArODYyOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03NDA3LDE0ICs4NjM4LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTZFIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzQyMywxNCArODY1NCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03NDM5LDExICs4NjcwLDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6On5TdHJpbmc4IiwKQEAgLTc0NTIsMTEgKzg2ODMsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6flN0cmluZzgiLApAQCAtNzQ2NSwxMSArODY5NiwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzQ4Niw3ICs4NzE3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUHYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6cmVwbGFjZUFsbCIsCkBAIC03NTA1LDcgKzg3MzYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc1MjEsNyArODc1Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBEcyIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NTM3LDcgKzg3NjgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQRHMiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzU1MSw3ICs4NzgyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUHYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzU2NCw3ICs4Nzk1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUHYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c2V0VG8iLApAQCAtNzU4MCw3ICs4ODExLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzZXRUbyIsCkBAIC03NTk5LDcgKzg4MzAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnNldFRvIiwKQEAgLTc2MTUsNyArODg0Niw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c2V0VG8iLApAQCAtNzYzOCw3ICs4ODY5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjphcHBlbmQiLApAQCAtNzY1Nyw3ICs4ODg4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjphcHBlbmQiLApAQCAtNzY3Myw3ICs4OTA0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjppbnNlcnQiLApAQCAtNzY5Miw3ICs4OTIzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjppbnNlcnQiLApAQCAtNzcxNCw3ICs4OTQ1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NzI4LDcgKzg5NTksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc3NDIsNyArODk3Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzc1OCw3ICs4OTg5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03Nzc0LDcgKzkwMDUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc3OTMsNyArOTAyNCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzgwOSw3ICs5MDQwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03ODI4LDcgKzkwNTksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc4NDAsMTEgKzkwNzEsMTEgQEAKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ4U3RyaW5nMTZFIgogICAgIH0sCiAgICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03ODYwLDcgKzkwOTEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc4ODMsNyArOTExNCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzg5Niw3ICs5MTI3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTEyLDcgKzkxNDMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc5MjgsNyArOTE1OSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzk0Nyw3ICs5MTc4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTYzLDcgKzkxOTQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc5ODIsNyArOTIxMyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzk5NCwxMSArOTIyNSwxMSBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNkUiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTgwMTQsNyArOTI0NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtODAzNyw3ICs5MjY4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC04MDUwLDcgKzkyODEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6On5TdHJpbmcxNiIsCkBAIC04MDYzLDcgKzkyOTQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6On5TdHJpbmcxNiIsCkBAIC04MDc2LDcgKzkzMDcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6Om9wZXJhdG9yPSIsCkBAIC04MDkyLDcgKzkzMjMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkOFN0cmluZzE2RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OkZkUHJpbnRlcjo6cHJpbnRMaW5lIiwKQEAgLTg0MDYsMTQgKzk2MzcsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUEt2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OmNhcGFjaXR5IiwKQEAgLTg0MjIsMTEgKzk2NTMsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTg0MzYsMTEgKzk2NjcsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC04NDYxLDcgKzk2OTIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6OmluZGV4T2YiLApAQCAtODQ3Nyw3ICs5NzA4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjpvcmRlck9mIiwKQEAgLTg0OTMsNyArOTcyNCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpnZXRBbGxvd05vbkNhbGxiYWNrcyIsCkBAIC04OTc3LDE0ICsxMDIwOCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmdldFdlYWtSZWZzIiwKQEAgLTg5OTMsMTEgKzEwMjI0LDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInJldHVybl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjpnZXRXZWFrQ291bnQiLApAQCAtOTAxMCw3ICsxMDI0MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjpyZWZCYXNlIiwKQEAgLTkwMjIsOCArMTAyNTMsOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInJldHVybl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6cHJpbnRSZWZzIiwKQEAgLTkwMzYsNyArMTAyNjcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmZvcmNlSW5jU3Ryb25nIiwKQEAgLTkwNDUsMTQgKzEwMjc2LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6Z2V0U3Ryb25nQ291bnQiLApAQCAtOTA2MSwxMSArMTAyOTIsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjppbmNTdHJvbmdSZXF1aXJlU3Ryb25nIiwKQEAgLTkwNzQsMTQgKzEwMzA1LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6ZGVjU3Ryb25nIiwKQEAgLTkwOTAsMTQgKzEwMzIxLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6aW5jU3Ryb25nIiwKQEAgLTkxMDYsODAgKzEwMzM3LDQyIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CisgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpnZXRQYXRoRGlyIiwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxMGdldFBhdGhEaXJFdiIsCiAgICAicGFyYW1ldGVycyIgOgogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKLSAgfSwKLSAgewotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmdldEJhc2VQYXRoIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxMWdldEJhc2VQYXRoRXYiLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Z2V0UGF0aExlYWYiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODExZ2V0UGF0aExlYWZFdiIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmZpbmRfZXh0ZW5zaW9uIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxNGZpbmRfZXh0ZW5zaW9uRXYiLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBjIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCi0gIH0sCi0gIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpnZXRQYXRoRXh0ZW5zaW9uIiwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxNmdldFBhdGhFeHRlbnNpb25FdiIsCiAgICAicGFyYW1ldGVycyIgOgogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmZpbmQiLApAQCAtOTE4OCw3ICsxMDM4MSw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC05MTk5LDcgKzEwMzkyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpsZW5ndGgiLApAQCAtOTIwOCwyOCArMTA0MDEsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6d2Fsa1BhdGgiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODh3YWxrUGF0aEVQUzBfIiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIgotICAgIH0sCi0gICAgewotICAgICAiZGVmYXVsdF9hcmciIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c3RhcnRzV2l0aCIsCkBAIC05MjQ1LDcgKzEwNDIxLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzdGFydHNXaXRoIiwKQEAgLTkyNjEsNyArMTA0MzcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmlzU3RhdGljU3RyaW5nIiwKQEAgLTkyNzQsNyArMTA0NTAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTkyODgsNyArMTA0NjQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnNpemUiLApAQCAtOTMwMSw3ICsxMDQ3Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6Y29udGFpbnMiLApAQCAtOTMxNyw3ICsxMDQ5Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6ZmluZExhc3QiLApAQCAtOTMzMyw3ICsxMDUwOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6ZmluZEZpcnN0IiwKQEAgLTkzNDksNyArMTA1MjUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RvcFdhdGNoOjplbGFwc2VkVGltZSIsCkBAIC05NTQyLDcgKzEwNzE4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJsZW4xNiIsCkBAIC05NTU0LDcgKzEwNzMwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJuY21wMTYiLApAQCAtOTU3Miw3ICsxMDc0OCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RybmxlbjE2IiwKQEAgLTk1ODcsNyArMTA3NjMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN0cnN0cjE2IiwKQEAgLTk2MDIsNyArMTA3NzgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQRHMiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyemNtcDE2IiwKQEAgLTk2MjMsNyArMTA3OTksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN5c3RlbVRpbWUiLApAQCAtOTY3Miw3ICsxMDg0OCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAidXRmMTZfdG9fdXRmOF9sZW5ndGgiLApAQCAtOTY4Nyw3ICsxMDg2Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAidXRmMzJfZnJvbV91dGY4X2F0IiwKQEAgLTk3MDgsNyArMTA4ODQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjMyX3RvX3V0ZjgiLApAQCAtOTcyOSw3ICsxMDkwNSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAidXRmMzJfdG9fdXRmOF9sZW5ndGgiLApAQCAtOTc0NCw3ICsxMDkyMCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAidXRmOF90b191dGYxNiIsCkBAIC05NzY1LDcgKzEwOTQxLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjhfdG9fdXRmMTZfbGVuZ3RoIiwKQEAgLTk3ODQsNyArMTA5NjAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjhfdG9fdXRmMTZfbm9fbnVsbF90ZXJtaW5hdG9yIiwKQEAgLTk4MDUsNyArMTA5ODEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQRHMiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9CiAgXSwKICAiZ2xvYmFsX3ZhcnMiIDoKQEAgLTk4MjcsMTYgKzExMDAzLDE2IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJQTFfS0RzIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElSQTFfS0RzIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3JJbXBsICYiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTk4NDUsNyArMTEwMjEsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtOTg1NCw3ICsxMTAzMCw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC05OTY2LDEyICsxMTE0MiwyMSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxqMUVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nMTY6OlN0YXRpY0RhdGE8MT4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMajFFRUUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxqMUVFRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTk5ODAsNyArMTExNjUsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTEwMDg1LDE5ICsxMTI3MCwxOSBAQAogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGwgJiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGwgJiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTAyMDksMTIgKzExMzk0LDIxIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ3U3RyaW5nOEUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzggJiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTAyOTgsNyArMTE0OTIsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURzIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQRHMiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMDMxNiw3ICsxMTUxMCw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQS3ZTMF9FIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQRmlQS3ZTMF9FIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTEwMzI1LDcgKzExNTE5LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGaVBLdlMwX1B2RSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUEZpUEt2UzBfUHZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTEwMzc5LDcgKzExNTczLDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLRGkiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLRGkiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTAzODgsNyArMTE1ODIsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtEcyIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJUEtEcyIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTA0MDEsNiArMTE1OTUsMTUgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3JJbXBsICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMaWdodFJlZkJhc2U8YW5kcm9pZDo6TmF0aXZlSGFuZGxlPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLApAQCAtMTA0MjQsNyArMTE2MjcsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTA1ODYsNyArMTE3ODksNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTEwNjA0LDcgKzExODA3LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTA2MTcsNiArMTE4MjAsMTUgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZkJhc2UgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFIiwKQEAgLTEwNjI2LDIxICsxMTgzOCwyMSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogNCwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OkNhbGxTdGFjayAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTA3MDksMTAgKzExOTIxLDEwIEBACiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbCAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMDc3NSw3ICsxMTk4Nyw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRTdGF0aWNTdHJpbmcxNklMajFFRUUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNFN0YXRpY1N0cmluZzE2SUxqMUVFRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTEwNzk3LDEyICsxMjAwOSwyMSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsICoiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTEwODI0LDYgKzEyMDQ1LDE1IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpWaXJ0dWFsTGlnaHRSZWZCYXNlICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMjBTaW1wbGVMb29wZXJDYWxsYmFja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNpbXBsZUxvb3BlckNhbGxiYWNrICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFIiwKQEAgLTExMDQ1LDcgKzEyMjc1LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTEwOTQsNiArMTIzMjQsMTUgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2UgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFIiwKQEAgLTExMTAzLDYgKzEyMzQyLDE1IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2UgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLApAQCAtMTExMTIsMTIgKzEyMzYwLDIxIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzggKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMajFFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdGF0aWNEYXRhPDE+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMajFFRUUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTExMjYsMjUgKzEyMzgzLDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogNCwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJuYW1lIiA6ICJhbmRyb2lkOjpDYWxsU3RhY2s6OlN0YWNrRGVsZXRlciAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOUNhbGxTdGFjazEyU3RhY2tEZWxldGVyRSIsCi0gICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDQsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImFuZHJvaWQ6OkNhbGxTdGFjayAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTExMjM0LDcgKzEyNDczLDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElQaiIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMTI1Niw3ICsxMjQ5NSw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJQTFfRHMiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUExX0tEcyIsCiAgICAic2l6ZSIgOiAyLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTExMjg2LDcgKzEyNTI1LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElEaSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJS0RpIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMiwKQEAgLTExMjk2LDcgKzEyNTM1LDE3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRHMiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUtEcyIsCiAgICAic2l6ZSIgOiAyLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImlzX2NvbnN0IiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9ySW1wbCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMjAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTEzMzMsMjAgKzEyNTgyLDIwIEBACiAgICAiaXNfY29uc3QiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZlcmVuY2VSZW5hbWVyIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAiaXNfY29uc3QiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiAyMCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTE1MzYsNyArMTI3ODUsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzaXplIiA6IDIwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTE1NjMsMTAgKzEyODEyLDIwIEBACiAgICAiaXNfY29uc3QiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCiAgICAic2l6ZSIgOiAxLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZkJhc2UiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTExNTgzLDYgKzEyODQyLDE2IEBACiAgICAiaXNfY29uc3QiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzgiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJzaXplIiA6IDQsCkBAIC0xMTU5Niw3ICsxMjg2NSw3IEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxqMUVFRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMajFFRUUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMTYwNiwxNyArMTI4NzUsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDQsCi0gICAiaXNfY29uc3QiIDogdHJ1ZSwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6Q2FsbFN0YWNrIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzaXplIiA6IDIwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMjM0Miw2ICsxMzYwMSw4NSBAQAogICAgXQogICB9LAogICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKKyAgICAgImZpZWxkX25hbWUiIDogIm1TdG9yYWdlIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAzMiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKKyAgICAgImZpZWxkX25hbWUiIDogIm1Db3VudCIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogNjQsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKKyAgICAgImZpZWxkX25hbWUiIDogIm1GbGFncyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogOTYsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLaiIKKyAgICB9LAorICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtSXRlbVNpemUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDEyOCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtqIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMjAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIsCisgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJraW5kIiA6ICJvZmZzZXRfdG9fdG9wIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAicnR0aSIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImNvbXBsZXRlX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDEwVmVjdG9ySW1wbEQxRXYiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJkZWxldGluZ19kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQxMFZlY3RvckltcGxEMEV2IgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTJkb19jb25zdHJ1Y3RFUHZqIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTBkb19kZXN0cm95RVB2aiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDdkb19jb3B5RVB2UEt2aiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDhkb19zcGxhdEVQdlBLdmoiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxNWRvX21vdmVfZm9yd2FyZEVQdlBLdmoiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxNmRvX21vdmVfYmFja3dhcmRFUHZQS3ZqIgorICAgIH0KKyAgIF0KKyAgfSwKKyAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImZpZWxkcyIgOgogICAgWwpAQCAtMTI0MDUsNiArMTM3NDMsMjggQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtQ291bnQiLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTlN0M19fMTZhdG9taWNJaUVFIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xOVZpcnR1YWxMaWdodFJlZkJhc2VFRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OkxpZ2h0UmVmQmFzZTxhbmRyb2lkOjpWaXJ0dWFsTGlnaHRSZWZCYXNlPiIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xOVZpcnR1YWxMaWdodFJlZkJhc2VFRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzE5VmlydHVhbExpZ2h0UmVmQmFzZUVFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImJhc2Vfc3BlY2lmaWVycyIgOgogICAgWwogICAgIHsKQEAgLTEyNzEzLDYgKzE0MDczLDE2IEBACiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CisgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNFJlZmVyZW5jZU1vdmVyRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmZXJlbmNlTW92ZXIiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRSZWZlcmVuY2VNb3ZlckUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0UmVmZXJlbmNlTW92ZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImJhc2Vfc3BlY2lmaWVycyIgOgogICAgWwpAQCAtMTI3MzUsNyArMTQxMDUsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0U3RhdGljU3RyaW5nMTZJTGoxRUVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFN0YXRpY1N0cmluZzE2SUxqMUVFRSIsCiAgICAic2l6ZSIgOiAxMiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMjgxOCw2ICsxNDE4OCwzMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZlcmVuY2VSZW5hbWVyIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyY2xFaiIKKyAgICB9CisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKICAgICJiYXNlX3NwZWNpZmllcnMiIDoKICAgIFsKICAgICB7CkBAIC0xMjg3OSw2ICsxNDI3Myw2OCBAQAogICAgXQogICB9LAogICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiYmFzZV9zcGVjaWZpZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbCIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDIwLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiLAorICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CisgICBbCisgICAgeworICAgICAia2luZCIgOiAib2Zmc2V0X3RvX3RvcCIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogInJ0dGkiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJjb21wbGV0ZV9kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxEMUV2IgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiZGVsZXRpbmdfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRDBFdiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDEyZG9fY29uc3RydWN0RVB2aiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDEwZG9fZGVzdHJveUVQdmoiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGw3ZG9fY29weUVQdlBLdmoiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGw4ZG9fc3BsYXRFUHZQS3ZqIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTVkb19tb3ZlX2ZvcndhcmRFUHZQS3ZqIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTZkb19tb3ZlX2JhY2t3YXJkRVB2UEt2aiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbDEwZG9fY29tcGFyZUVQS3ZTMl8iCisgICAgfQorICAgXQorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCkBAIC0xMzA4Myw2ICsxNDUzOSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxib29sPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Y2hhcj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFRSIsCkBAIC0xMzA5Niw2ICsxNDU2NSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxjaGFyPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZG91YmxlPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZEVFIiwKQEAgLTEzMTA5LDYgKzE0NTkxLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGRvdWJsZT4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGZsb2F0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZkVFIiwKQEAgLTEzMTIyLDYgKzE0NjE3LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGZsb2F0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgY2hhcj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFRSIsCkBAIC0xMzEzNSw2ICsxNDY0MywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBjaGFyPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8aW50PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaUVFIiwKQEAgLTEzMTQ4LDYgKzE0NjY5LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGludD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGludD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFRSIsCkBAIC0xMzE2MSw2ICsxNDY5NSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBpbnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElqIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEVFIiwKQEAgLTEzMTc0LDYgKzE0NzIxLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElsIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUVFIiwKQEAgLTEzMTg3LDYgKzE0NzQ3LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEltIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxzaG9ydD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFRSIsCkBAIC0xMzIwMCw2ICsxNDc3MywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxzaG9ydD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJc0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIHNob3J0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEVFIiwKQEAgLTEzMjEzLDYgKzE0Nzk5LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIHNob3J0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dm9pZD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFRSIsCkBAIC0xMzIyNiw2ICsxNDgyNSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx2b2lkPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZyBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeEVFIiwKQEAgLTEzMjM5LDYgKzE0ODUxLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmcgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmcgbG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFRSIsCkBAIC0xMzI1Miw2ICsxNDg3NywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl5RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nIGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl5RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl5IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKQEAgLTEzMzA0LDYgKzE0OTQyLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGJvb2w+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEliIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0VFIiwKQEAgLTEzMzE3LDYgKzE0OTY4LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGNoYXI+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEljIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxkb3VibGU+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUiLApAQCAtMTMzMzAsNiArMTQ5OTQsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZG91YmxlPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZmxvYXQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRUUiLApAQCAtMTMzNDMsNiArMTUwMjAsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZmxvYXQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElmIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEVFIiwKQEAgLTEzMzU2LDYgKzE1MDQ2LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGNoYXI+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEloIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxpbnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUiLApAQCAtMTMzNjksNiArMTUwNzIsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8aW50PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgaW50PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFIiwKQEAgLTEzMzgyLDYgKzE1MDk4LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGludD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWoiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRUUiLApAQCAtMTMzOTUsNiArMTUxMjQsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8bG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWwiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRUUiLApAQCAtMTM0MDgsNiArMTUxNTAsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSW0iCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHNob3J0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0VFIiwKQEAgLTEzNDIxLDYgKzE1MTc2LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHNob3J0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJcyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RUUiLApAQCAtMTM0MzQsNiArMTUyMDIsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl0IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx2b2lkPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkVFIiwKQEAgLTEzNDQ3LDYgKzE1MjI4LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHZvaWQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl2IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nIGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUiLApAQCAtMTM0NjAsNiArMTUyNTQsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8bG9uZyBsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKQEAgLTEzNDczLDYgKzE1MjgwLDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLApAQCAtMTM1MjUsNiArMTUzNDUsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Ym9vbD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWIiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGNoYXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckljRUUiLApAQCAtMTM1MzgsNiArMTUzNzEsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Y2hhcj4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGRvdWJsZT4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFRSIsCkBAIC0xMzU1MSw2ICsxNTM5NywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElkIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxmbG9hdD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFRSIsCkBAIC0xMzU2NCw2ICsxNTQyMywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxmbG9hdD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWYiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGNoYXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckloRUUiLApAQCAtMTM1NzcsNiArMTU0NDksMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgY2hhcj4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGludD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFRSIsCkBAIC0xMzU5MCw2ICsxNTQ3NSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElpIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklqRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBpbnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklqRUUiLApAQCAtMTM2MDMsNiArMTU1MDEsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgaW50PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklqRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFRSIsCkBAIC0xMzYxNiw2ICsxNTUyNywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJbCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FRSIsCkBAIC0xMzYyOSw2ICsxNTU1MywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJbSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8c2hvcnQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklzRUUiLApAQCAtMTM2NDIsNiArMTU1NzksMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8c2hvcnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElzIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl0RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBzaG9ydD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSIsCkBAIC0xMzY1NSw2ICsxNTYwNSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl0RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBzaG9ydD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHZvaWQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RUUiLApAQCAtMTM2NjgsNiArMTU2MzEsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXYiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmcgbG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFRSIsCkBAIC0xMzY4MSw2ICsxNTY1NywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nIGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl4IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nIGxvbmc+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUiLApAQCAtMTM2OTQsNiArMTU2ODMsMTkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCkBAIC0xMzc0NiwxMiArMTU3NDgsMjUgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpTdHJpbmc4PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzdTdHJpbmc4RUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU184U3RyaW5nMTZFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpTdHJpbmcxNj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzhTdHJpbmcxNkVFRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUVFIiwKICAgICJzaXplIiA6IDEsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKICAgIFsKICAgICAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiCkBAIC0xMzc3Miw2ICsxNTc4NywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxib29sPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Y2hhcj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFRSIsCkBAIC0xMzc4NSw2ICsxNTgxMywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZG91YmxlPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFIiwKQEAgLTEzNzk4LDYgKzE1ODM5LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGRvdWJsZT4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkVFIiwKQEAgLTEzODExLDYgKzE1ODY1LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgY2hhcj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFRSIsCkBAIC0xMzgyNCw2ICsxNTg5MSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8aW50PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFIiwKQEAgLTEzODM3LDYgKzE1OTE3LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGludD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGludD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSIsCkBAIC0xMzg1MCw2ICsxNTk0MywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBpbnQ+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElqIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEVFIiwKQEAgLTEzODYzLDYgKzE1OTY5LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElsIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUVFIiwKQEAgLTEzODc2LDYgKzE1OTk1LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEltIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFRSIsCkBAIC0xMzg4OSw2ICsxNjAyMSwxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJc0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIHNob3J0PiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEVFIiwKQEAgLTEzOTAyLDYgKzE2MDQ3LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIHNob3J0PiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dm9pZD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFRSIsCkBAIC0xMzkxNSw2ICsxNjA3MywxOSBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZyBsb25nPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFIiwKQEAgLTEzOTI4LDYgKzE2MDk5LDE5IEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmcgbG9uZz4iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmcgbG9uZz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFRSIsCkBAIC0xMzk0MCw2ICsxNjEyNCwxOSBAQAogICAgXQogICB9LAogICB7CisgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nIGxvbmc+IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl5IgorICAgXQorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCkBAIC0xMzk3OCw2ICsxNjE3NSw0MCBAQAogICAgImJhc2Vfc3BlY2lmaWVycyIgOgogICAgWwogICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzE5VmlydHVhbExpZ2h0UmVmQmFzZUVFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6VmlydHVhbExpZ2h0UmVmQmFzZSIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiY29tcGxldGVfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRDFFdiIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImRlbGV0aW5nX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUQwRXYiCisgICAgfQorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiYmFzZV9zcGVjaWZpZXJzIiA6CisgICBbCisgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0UiCiAgICAgfQogICAgXSwKQEAgLTE0OTQ3LDcgKzE3MTc4LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLApAQCAtMTQ5NTYsMTAgKzE3MTg3LDEwIEBACiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2l6ZSIgOiAyMCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CiAgICBbCi0gICAgIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICBdLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CiAgICBbCkBAIC0xNTE0Nyw2ICsxNzM3OCwxNiBAQAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZSIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAiZmllbGRzIiA6CiAgICBbCkBAIC0xNTIwMSw2ICsxNzQ0Miw1NSBAQAogICAgWwogICAgIHsKICAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtUmVmcyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMzIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX2ltcGxFIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2UiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yLlZhbmlsbGFJY2VDcmVhbV9hcm1fYXJtdjgtYV9zdGF0aWNfYWZkby1saWJ1dGlscy9lNTYwZDdiMTllYmY3Mjc2YjNlODUwZDNkMzQ2ZGVjOC9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJjb21wbGV0ZV9kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZUQxRXYiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJkZWxldGluZ19kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZUQwRXYiCisgICAgfSwKKyAgICB7CisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDdSZWZCYXNlMTBvbkZpcnN0UmVmRXYiCisgICAgfSwKKyAgICB7CisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDdSZWZCYXNlMTVvbkxhc3RTdHJvbmdSZWZFUEt2IgorICAgIH0sCisgICAgeworICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZTIwb25JbmNTdHJvbmdBdHRlbXB0ZWRFalBLdiIKKyAgICB9LAorICAgIHsKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2UxM29uTGFzdFdlYWtSZWZFUEt2IgorICAgIH0KKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCiAgICAgICJmaWVsZF9uYW1lIiA6ICJtU3RyaW5nIiwKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CkBAIC0xNTIxOCw2ICsxNzUwOCwyNCBAQAogICAgImZpZWxkcyIgOgogICAgWwogICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtU3RyaW5nIiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4IiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3IuVmFuaWxsYUljZUNyZWFtX2FybV9hcm12OC1hX3N0YXRpY19hZmRvLWxpYnV0aWxzL2U1NjBkN2IxOWViZjcyNzZiM2U4NTBkM2QzNDZkZWM4L29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvci5WYW5pbGxhSWNlQ3JlYW1fYXJtX2FybXY4LWFfc3RhdGljX2FmZG8tbGlidXRpbHMvZTU2MGQ3YjE5ZWJmNzI3NmIzZTg1MGQzZDM0NmRlYzgvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImZpZWxkX25hbWUiIDogInNpemUiLAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2oiCiAgICAgfSwKQEAgLTE1MjMyLDcgKzE3NTQwLDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTUyNTAsMzQgKzE3NTU4LDcgQEAKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKLSAgfSwKLSAgewotICAgImFsaWdubWVudCIgOiAxLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFjazEyU3RhY2tEZWxldGVyRSIsCi0gICAibmFtZSIgOiAiYW5kcm9pZDo6Q2FsbFN0YWNrOjpTdGFja0RlbGV0ZXIiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2sxMlN0YWNrRGVsZXRlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2sxMlN0YWNrRGVsZXRlckUiLAotICAgInNpemUiIDogMSwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCIKLSAgfSwKLSAgewotICAgImFsaWdubWVudCIgOiA0LAotICAgImZpZWxkcyIgOgotICAgWwotICAgIHsKLSAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCi0gICAgICJmaWVsZF9uYW1lIiA6ICJtRnJhbWVMaW5lcyIsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIgotICAgIH0KLSAgIF0sCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAibmFtZSIgOiAiYW5kcm9pZDo6Q2FsbFN0YWNrIiwKLSAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2l6ZSIgOiAyMCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTU1NDMsNyArMTc4MjQsNyBAQAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfQogIF0KIH0KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2JpbmRlci9BbmRyb2lkLmJwIGIvbGlidXRpbHMvYmluZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiMGNiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2JpbmRlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTQ5IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2NvcmVfbGlidXRpbHNfbGljZW5zZSJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnV0aWxzX2JpbmRlcl9pbXBsX2RlZmF1bHRzX25vZGVwcyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnV0aWxzX2RlZmF1bHRzX25vZGVwcyIsCisgICAgICAgICJhcGV4LWxvd2VzdC1taW4tc2RrLXZlcnNpb24iLAorICAgIF0sCisgICAgbmF0aXZlX2JyaWRnZV9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJFcnJvcnMuY3BwIiwKKyAgICAgICAgIlJlZkJhc2UuY3BwIiwKKyAgICAgICAgIlNoYXJlZEJ1ZmZlci5jcHAiLAorICAgICAgICAiU3RyaW5nMTYuY3BwIiwKKyAgICAgICAgIlN0cmluZzguY3BwIiwKKyAgICAgICAgIlN0cm9uZ1BvaW50ZXIuY3BwIiwKKyAgICAgICAgIlVuaWNvZGUuY3BwIiwKKyAgICAgICAgIlZlY3RvckltcGwuY3BwIiwKKyAgICBdLAorCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICBdLAorCisgICAgYWZkbzogdHJ1ZSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJ1dGlsc19iaW5kZXJfaW1wbF9kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnV0aWxzX2RlZmF1bHRzIiwKKyAgICAgICAgImxpYnV0aWxzX2JpbmRlcl9pbXBsX2RlZmF1bHRzX25vZGVwcyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnV0aWxzX2JpbmRlciIsCisgICAgZGVmYXVsdHM6IFsibGlidXRpbHNfYmluZGVyX2ltcGxfZGVmYXVsdHMiXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJ1dGlsc19iaW5kZXJfc2RrIiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19iaW5kZXJfaW1wbF9kZWZhdWx0c19ub2RlcHMiXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJsb2dfc3R1YiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTkRST0lEX0xPR19TVFVCX1dFQUtfUFJJTlQiLAorICAgICAgICAiLURBTkRST0lEX1VUSUxTX0NBTExTVEFDS19FTkFCTEVEPTAiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJ1dGlsc19iaW5kZXJfdGVzdF9jb21waWxlIiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19iaW5kZXJfaW1wbF9kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRERFQlVHX1JFRlM9MSIsCisgICAgXSwKKworICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlidXRpbHNfZnV6el9zdHJpbmc4IiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTdHJpbmc4X2Z1enouY3BwIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJ1dGlsc19mdXp6X3N0cmluZzE2IiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTdHJpbmcxNl9mdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlidXRpbHNfZnV6el92ZWN0b3IiLAorICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2Z1enpfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZlY3Rvcl9mdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlidXRpbHNfZnV6el9yZWZiYXNlIiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJSZWZCYXNlX2Z1enouY3BwIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJ1dGlsc19iaW5kZXJfdGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJFcnJvcnNfdGVzdC5jcHAiLAorICAgICAgICAiU2hhcmVkQnVmZmVyX3Rlc3QuY3BwIiwKKyAgICAgICAgIlN0cmluZzE2X3Rlc3QuY3BwIiwKKyAgICAgICAgIlN0cmluZzhfdGVzdC5jcHAiLAorICAgICAgICAiU3Ryb25nUG9pbnRlcl90ZXN0LmNwcCIsCisgICAgICAgICJVbmljb2RlX3Rlc3QuY3BwIiwKKyAgICAgICAgIlZlY3Rvcl90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBhbmRyb2lkOiB7CisgICAgICAgICAgICBzaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgICAgICAgICAibGlibG9nIiwKKyAgICAgICAgICAgICAgICAibGlibHptYSIsCisgICAgICAgICAgICAgICAgImxpYnV0aWxzIiwgLy8gd2hpY2ggaW5jbHVkZXMgbGlidXRpbHNfYmluZGVyCisgICAgICAgICAgICAgICAgImxpYnoiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgbGludXg6IHsKKyAgICAgICAgICAgIHNyY3M6IFsKKyAgICAgICAgICAgICAgICAiUmVmQmFzZV90ZXN0LmNwcCIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBob3N0OiB7CisgICAgICAgICAgICBzdGF0aWNfbGliczogWworICAgICAgICAgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgICAgICAgICAibGlibG9nIiwKKyAgICAgICAgICAgICAgICAibGlibHptYSIsCisgICAgICAgICAgICAgICAgImxpYnV0aWxzIiwgLy8gd2hpY2ggaW5jbHVkZXMgbGlidXRpbHNfYmluZGVyCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV3RocmVhZC1zYWZldHkiLAorICAgIF0sCisKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKK30KKworY2NfYmVuY2htYXJrIHsKKyAgICBuYW1lOiAibGlidXRpbHNfYmluZGVyX2JlbmNobWFyayIsCisgICAgc3JjczogWyJWZWN0b3JfYmVuY2htYXJrLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYnV0aWxzIl0sCit9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9FcnJvcnMuY3BwIGIvbGlidXRpbHMvYmluZGVyL0Vycm9ycy5jcHAKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbGlidXRpbHMvRXJyb3JzLmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL0Vycm9ycy5jcHAKaW5kZXggNzRmM2JlZi4uZGZiNGQ5YiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvRXJyb3JzLmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvRXJyb3JzLmNwcApAQCAtMTUsNiArMTUsOCBAQAogICovCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGQ6OnN0cmluZyBzdGF0dXNUb1N0cmluZyhzdGF0dXNfdCBzKSB7CmRpZmYgLS1naXQgYS9saWJ1dGlscy9FcnJvcnNfdGVzdC5jcHAgYi9saWJ1dGlscy9iaW5kZXIvRXJyb3JzX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9FcnJvcnNfdGVzdC5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9FcnJvcnNfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL0Z1enpGb3JtYXRUeXBlcy5oIGIvbGlidXRpbHMvYmluZGVyL0Z1enpGb3JtYXRUeXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9GdXp6Rm9ybWF0VHlwZXMuaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL0Z1enpGb3JtYXRUeXBlcy5oCmRpZmYgLS1naXQgYS9saWJ1dGlscy9SZWZCYXNlLmNwcCBiL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9SZWZCYXNlLmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1JlZkJhc2UuY3BwCmluZGV4IGFiMTIyYzcuLjJkMmU0MGIgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1JlZkJhc2UuY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLmNwcApAQCAtMTgsOCArMTgsNyBAQAogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxtdXRleD4KIAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgpAQCAtMjcsOCArMjYsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotCiAjaWZuZGVmIF9fdW51c2VkCiAjZGVmaW5lIF9fdW51c2VkIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQogI2VuZGlmCkBAIC01OCwxNSArNTUsMTcgQEAKIC8vIGxvZyBhbGwgcmVmZXJlbmNlIGNvdW50aW5nIG9wZXJhdGlvbnMKICNkZWZpbmUgUFJJTlRfUkVGUyAwCiAKKyNpZiAhZGVmaW5lZChBTkRST0lEX1VUSUxTX0NBTExTVEFDS19FTkFCTEVEKQogI2lmIGRlZmluZWQoX19saW51eF9fKQogLy8gQ2FsbFN0YWNrIGlzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4IHR5cGUgcGxhdGZvcm1zLgotI2RlZmluZSBDQUxMU1RBQ0tfRU5BQkxFRCAxCisjZGVmaW5lIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQgMQogI2Vsc2UKLSNkZWZpbmUgQ0FMTFNUQUNLX0VOQUJMRUQgMAotI2VuZGlmCisjZGVmaW5lIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQgMAorI2VuZGlmICAvLyBkZWZpbmVkKF9fbGludXhfXykKKyNlbmRpZiAgLy8gIWRlZmluZWQoQU5EUk9JRF9VVElMU19DQUxMU1RBQ0tfRU5BQkxFRCkKIAotI2lmIENBTExTVEFDS19FTkFCTEVECi0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+CisjaWYgQU5EUk9JRF9VVElMU19DQUxMU1RBQ0tfRU5BQkxFRAorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCiAjZW5kaWYKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMzMsNyArMjMyLDcgQEAKICAgICAgICAgICAgIHdoaWxlIChyZWZzKSB7CiAgICAgICAgICAgICAgICAgY2hhciBpbmMgPSByZWZzLT5yZWYgPj0gMCA/ICcrJyA6ICctJzsKICAgICAgICAgICAgICAgICBBTE9HRCgiXHQlYyBJRCAlcCAocmVmICVkKToiLCBpbmMsIHJlZnMtPmlkLCByZWZzLT5yZWYpOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgJiYgQ0FMTFNUQUNLX0VOQUJMRUQKKyNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICYmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgICAgICBDYWxsU3RhY2s6OmxvZ1N0YWNrKExPR19UQUcsIHJlZnMtPnN0YWNrLmdldCgpKTsKICNlbmRpZgogICAgICAgICAgICAgICAgIHJlZnMgPSByZWZzLT5uZXh0OwpAQCAtMjQ3LDcgKzI0Niw3IEBACiAgICAgICAgICAgICB3aGlsZSAocmVmcykgewogICAgICAgICAgICAgICAgIGNoYXIgaW5jID0gcmVmcy0+cmVmID49IDAgPyAnKycgOiAnLSc7CiAgICAgICAgICAgICAgICAgQUxPR0QoIlx0JWMgSUQgJXAgKHJlZiAlZCk6IiwgaW5jLCByZWZzLT5pZCwgcmVmcy0+cmVmKTsKLSNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICYmIENBTExTVEFDS19FTkFCTEVECisjaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRCAmJiBBTkRST0lEX1VUSUxTX0NBTExTVEFDS19FTkFCTEVECiAgICAgICAgICAgICAgICAgQ2FsbFN0YWNrOjpsb2dTdGFjayhMT0dfVEFHLCByZWZzLT5zdGFjay5nZXQoKSk7CiAjZW5kaWYKICAgICAgICAgICAgICAgICByZWZzID0gcmVmcy0+bmV4dDsKQEAgLTI1NSw3ICsyNTQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChkdW1wU3RhY2spIHsKICAgICAgICAgICAgIEFMT0dFKCJhYm92ZSBlcnJvcnMgYXQ6Iik7Ci0jaWYgQ0FMTFNUQUNLX0VOQUJMRUQKKyNpZiBBTkRST0lEX1VUSUxTX0NBTExTVEFDS19FTkFCTEVECiAgICAgICAgICAgICBDYWxsU3RhY2s6OmxvZ1N0YWNrKExPR19UQUcpOwogI2VuZGlmCiAgICAgICAgIH0KQEAgLTMxMCw3ICszMDksNyBAQAogICAgICAgICBTdHJpbmc4IHRleHQ7CiAKICAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobU11dGV4KTsKICAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07CiAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAogICAgICAgICAgICAgICAgICAgICAgIlN0cm9uZyByZWZlcmVuY2VzIG9uIFJlZkJhc2UgJXAgKHdlYWtyZWZfdHlwZSAlcCk6XG4iLApAQCAtMzMwLDcgKzMyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKICAgICAgICAgICAgIGludCByYyA9IG9wZW4obmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fQVBQRU5ELCAwNjQ0KTsKICAgICAgICAgICAgIGlmIChyYyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpd3JpdGUocmMsIHRleHQuc3RyaW5nKCksIHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICh2b2lkKXdyaXRlKHJjLCB0ZXh0LmNfc3RyKCksIHRleHQubGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgIGNsb3NlKHJjKTsKICAgICAgICAgICAgICAgICBBTE9HSSgiU1RBQ0sgVFJBQ0UgZm9yICVwIHNhdmVkIGluICVzIiwgdGhpcywgbmFtZSk7CiAgICAgICAgICAgICB9CkBAIC0zNDQsNyArMzQzLDcgQEAKICAgICB7CiAgICAgICAgIHJlZl9lbnRyeSogbmV4dDsKICAgICAgICAgY29uc3Qgdm9pZCogaWQ7Ci0jaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRCAmJiBDQUxMU1RBQ0tfRU5BQkxFRAorI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgJiYgQU5EUk9JRF9VVElMU19DQUxMU1RBQ0tfRU5BQkxFRAogICAgICAgICBDYWxsU3RhY2s6OkNhbGxTdGFja1VQdHIgc3RhY2s7CiAjZW5kaWYKICAgICAgICAgaW50MzJfdCByZWY7CkBAIC0zNTMsNyArMzUyLDcgQEAKICAgICB2b2lkIGFkZFJlZihyZWZfZW50cnkqKiByZWZzLCBjb25zdCB2b2lkKiBpZCwgaW50MzJfdCBtUmVmKQogICAgIHsKICAgICAgICAgaWYgKG1UcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1NdXRleCk7CiAKICAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmID0gbmV3IHJlZl9lbnRyeTsKICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBjb3VudCBhdCB0aGUgdGltZSBvZiB0aGUgc25hcHNob3QsIGJ1dCBiZWZvcmUgdGhlCkBAIC0zNjEsNyArMzYwLDcgQEAKICAgICAgICAgICAgIC8vIGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LgogICAgICAgICAgICAgcmVmLT5yZWYgPSBtUmVmOwogICAgICAgICAgICAgcmVmLT5pZCA9IGlkOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgJiYgQ0FMTFNUQUNLX0VOQUJMRUQKKyNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICYmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgIHJlZi0+c3RhY2sgPSBDYWxsU3RhY2s6OmdldEN1cnJlbnQoMik7CiAjZW5kaWYKICAgICAgICAgICAgIHJlZi0+bmV4dCA9ICpyZWZzOwpAQCAtMzcyLDcgKzM3MSw3IEBACiAgICAgdm9pZCByZW1vdmVSZWYocmVmX2VudHJ5KiogcmVmcywgY29uc3Qgdm9pZCogaWQpCiAgICAgewogICAgICAgICBpZiAobVRyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobU11dGV4KTsKIAogICAgICAgICAgICAgcmVmX2VudHJ5KiBjb25zdCBoZWFkID0gKnJlZnM7CiAgICAgICAgICAgICByZWZfZW50cnkqIHJlZiA9IGhlYWQ7CkBAIC0zOTcsNyArMzk2LDcgQEAKICAgICAgICAgICAgICAgICByZWYgPSByZWYtPm5leHQ7CiAgICAgICAgICAgICB9CiAKLSNpZiBDQUxMU1RBQ0tfRU5BQkxFRAorI2lmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgIENhbGxTdGFjazo6bG9nU3RhY2soTE9HX1RBRyk7CiAjZW5kaWYKICAgICAgICAgfQpAQCAtNDA2LDcgKzQwNSw3IEBACiAgICAgdm9pZCByZW5hbWVSZWZzSWQocmVmX2VudHJ5KiByLCBjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCkKICAgICB7CiAgICAgICAgIGlmIChtVHJhY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTXV0ZXgpOwogICAgICAgICAgICAgcmVmX2VudHJ5KiByZWYgPSByOwogICAgICAgICAgICAgd2hpbGUgKHJlZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJlZi0+aWQgPT0gb2xkX2lkKSB7CkBAIC00MjUsNyArNDI0LDcgQEAKICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJcdCVjIElEICVwIChyZWYgJWQpOlxuIiwKICAgICAgICAgICAgICAgICAgICAgIGluYywgcmVmcy0+aWQsIHJlZnMtPnJlZik7CiAgICAgICAgICAgICBvdXQtPmFwcGVuZChidWYpOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgJiYgQ0FMTFNUQUNLX0VOQUJMRUQKKyNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICYmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgIG91dC0+YXBwZW5kKENhbGxTdGFjazo6c3RhY2tUb1N0cmluZygiXHRcdCIsIHJlZnMtPnN0YWNrLmdldCgpKSk7CiAjZWxzZQogICAgICAgICAgICAgb3V0LT5hcHBlbmQoIlx0XHQoY2FsbCBzdGFja3MgZGlzYWJsZWQpIik7CkBAIC00MzQsNyArNDMzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG11dGFibGUgTXV0ZXggbU11dGV4OworICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CiAgICAgcmVmX2VudHJ5KiBtU3Ryb25nUmVmczsKICAgICByZWZfZW50cnkqIG1XZWFrUmVmczsKIApAQCAtNTM3LDcgKzUzNiw3IEBACiAgICAgY2FzZSBJTklUSUFMX1NUUk9OR19WQUxVRToKICAgICAgICAgcmVmcy0+bVN0cm9uZy5mZXRjaF9zdWIoSU5JVElBTF9TVFJPTkdfVkFMVUUsCiAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Ci0gICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CiAgICAgY2FzZSAwOgogICAgICAgICByZWZzLT5tQmFzZS0+b25GaXJzdFJlZigpOwogICAgIH0KQEAgLTc5MSw3ICs3OTAsNyBAQAogICAgICAgICAgICAgICAgICAgIm9iamVjdC4iLAogICAgICAgICAgICAgICAgICAgbVJlZnMtPm1XZWFrLmxvYWQoKSwgdGhpcyk7CiAKLSNpZiBDQUxMU1RBQ0tfRU5BQkxFRAorI2lmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgIENhbGxTdGFjazo6bG9nU3RhY2soTE9HX1RBRyk7CiAjZW5kaWYKICAgICAgICAgfSBlbHNlIGlmIChzdHJvbmdzICE9IDApIHsKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1JlZkJhc2VfZnV6ei5jcHAgYi9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZV9mdXp6LmNwcApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9SZWZCYXNlX2Z1enouY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvUmVmQmFzZV9mdXp6LmNwcAppbmRleCA4MjkxYmU5Li4wNWY0N2EwIDEwMDY0NAotLS0gYS9saWJ1dGlscy9SZWZCYXNlX2Z1enouY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlX2Z1enouY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorI2luY2x1ZGUgImxvZy9sb2cuaCIKICNpbmNsdWRlICJ1dGlscy9SV0xvY2suaCIKICNpbmNsdWRlICJ1dGlscy9SZWZCYXNlLmgiCiAjaW5jbHVkZSAidXRpbHMvU3Ryb25nUG9pbnRlci5oIgpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvUmVmQmFzZV90ZXN0LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1JlZkJhc2VfdGVzdC5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9SZWZCYXNlX3Rlc3QuY3BwCmluZGV4IGFlZDNiOWIuLmQ2NzU1OTggMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1JlZkJhc2VfdGVzdC5jcHAKKysrIGIvbGlidXRpbHMvYmluZGVyL1JlZkJhc2VfdGVzdC5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0YXRpYyBjb25zdGV4cHIgaW50IE5JVEVSUyA9IDEwMDAwMDA7CitzdGF0aWMgY29uc3RleHByIGludCBOSVRFUlMgPSA1MDAwMDA7CiAKIHN0YXRpYyBjb25zdGV4cHIgaW50IElOSVRJQUxfU1RST05HX1ZBTFVFID0gMSA8PCAyODsgIC8vIE1pcnJvcmluZyBSZWZCYXNlIGRlZmluaXRpb24uCiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1NoYXJlZEJ1ZmZlci5jcHAgYi9saWJ1dGlscy9iaW5kZXIvU2hhcmVkQnVmZmVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvU2hhcmVkQnVmZmVyLmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1NoYXJlZEJ1ZmZlci5jcHAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1NoYXJlZEJ1ZmZlci5oIGIvbGlidXRpbHMvYmluZGVyL1NoYXJlZEJ1ZmZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9TaGFyZWRCdWZmZXIuaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1NoYXJlZEJ1ZmZlci5oCmRpZmYgLS1naXQgYS9saWJ1dGlscy9TaGFyZWRCdWZmZXJfdGVzdC5jcHAgYi9saWJ1dGlscy9iaW5kZXIvU2hhcmVkQnVmZmVyX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9TaGFyZWRCdWZmZXJfdGVzdC5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9TaGFyZWRCdWZmZXJfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1N0cmluZzE2LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9TdHJpbmcxNi5jcHAKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbGlidXRpbHMvU3RyaW5nMTYuY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvU3RyaW5nMTYuY3BwCmluZGV4IDY4NjQyZDguLjA3YTNkMjMgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1N0cmluZzE2LmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvU3RyaW5nMTYuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KIApAQCAtMjYsNyArMjYsNyBAQAogCiBzdGF0aWMgY29uc3QgU3RhdGljU3RyaW5nMTYgZW1wdHlTdHJpbmcodSIiKTsKIHN0YXRpYyBpbmxpbmUgY2hhcjE2X3QqIGdldEVtcHR5U3RyaW5nKCkgewotICAgIHJldHVybiBjb25zdF9jYXN0PGNoYXIxNl90Kj4oZW1wdHlTdHJpbmcuc3RyaW5nKCkpOworICAgIHJldHVybiBjb25zdF9jYXN0PGNoYXIxNl90Kj4oZW1wdHlTdHJpbmcuY19zdHIoKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEyLDEwICsxMTIsNyBAQAogCiBTdHJpbmcxNjo6U3RyaW5nMTYoY29uc3QgY2hhcjE2X3QqIG8sIHNpemVfdCBsZW4pIDogbVN0cmluZyhhbGxvY0Zyb21VVEYxNihvLCBsZW4pKSB7fQogCi1TdHJpbmcxNjo6U3RyaW5nMTYoY29uc3QgU3RyaW5nOCYgbykKLSAgICA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGOChvLnN0cmluZygpLCBvLnNpemUoKSkpCi17Ci19CitTdHJpbmcxNjo6U3RyaW5nMTYoY29uc3QgU3RyaW5nOCYgbykgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjgoby5jX3N0cigpLCBvLnNpemUoKSkpIHt9CiAKIFN0cmluZzE2OjpTdHJpbmcxNihjb25zdCBjaGFyKiBvKQogICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEY4KG8sIHN0cmxlbihvKSkpCkBAIC0xNzMsNyArMTcwLDcgQEAKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiTm90IGltcGxlbWVudGVkIik7CiAgICAgfQogCi0gICAgcmV0dXJuIHNldFRvKG90aGVyLnN0cmluZygpK2JlZ2luLCBsZW4pOworICAgIHJldHVybiBzZXRUbyhvdGhlci5jX3N0cigpICsgYmVnaW4sIGxlbik7CiB9CiAKIHN0YXR1c190IFN0cmluZzE2OjpzZXRUbyhjb25zdCBjaGFyMTZfdCogb3RoZXIpCkBAIC0yMDAsNyArMTk3LDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyaW5nMTY6OmFwcGVuZChjb25zdCBTdHJpbmcxNiYgb3RoZXIpIHsKLSAgICByZXR1cm4gYXBwZW5kKG90aGVyLnN0cmluZygpLCBvdGhlci5zaXplKCkpOworICAgIHJldHVybiBhcHBlbmQob3RoZXIuY19zdHIoKSwgb3RoZXIuc2l6ZSgpKTsKIH0KIAogc3RhdHVzX3QgU3RyaW5nMTY6OmFwcGVuZChjb25zdCBjaGFyMTZfdCogY2hycywgc2l6ZV90IG90aGVyTGVuKSB7CkBAIC0yODYsNyArMjgzLDcgQEAKIHsKICAgICBjb25zdCBzaXplX3QgcHMgPSBwcmVmaXguc2l6ZSgpOwogICAgIGlmIChwcyA+IHNpemUoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBzdHJ6Y21wMTYobVN0cmluZywgcHMsIHByZWZpeC5zdHJpbmcoKSwgcHMpID09IDA7CisgICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBwcywgcHJlZml4LmNfc3RyKCksIHBzKSA9PSAwOwogfQogCiBib29sIFN0cmluZzE2OjpzdGFydHNXaXRoKGNvbnN0IGNoYXIxNl90KiBwcmVmaXgpIGNvbnN0CmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdHJpbmcxNl9mdXp6LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9TdHJpbmcxNl9mdXp6LmNwcApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9TdHJpbmcxNl9mdXp6LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cmluZzE2X2Z1enouY3BwCmluZGV4IGQ3ZTVlYzcuLjhmOTc4MWIgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1N0cmluZzE2X2Z1enouY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9TdHJpbmcxNl9mdXp6LmNwcApAQCAtMTMsNyArMTMsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKICNpbmNsdWRlICJ1dGlscy9TdHJpbmcxNi5oIgpAQCAtMjUsNyArMjcsNyBAQAogCiAgICAgICAgICAgICAgICAgLy8gQnl0ZXMgYW5kIHNpemUKICAgICAgICAgICAgICAgICAoW10oRnV6emVkRGF0YVByb3ZpZGVyJiwgYW5kcm9pZDo6U3RyaW5nMTYgc3RyMSwgYW5kcm9pZDo6U3RyaW5nMTYpIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBzdHIxLmNfc3RyKCk7CiAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgKFtdKEZ1enplZERhdGFQcm92aWRlciYsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjEsIGFuZHJvaWQ6OlN0cmluZzE2KSAtPiB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgc3RyMS5pc1N0YXRpY1N0cmluZygpOwpAQCAtMzksNyArNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdHIxLnN0YXJ0c1dpdGgoc3RyMik7CiAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgKFtdKEZ1enplZERhdGFQcm92aWRlciYsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjEsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjIpIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLmNvbnRhaW5zKHN0cjIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzdHIxLmNvbnRhaW5zKHN0cjIuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgKFtdKEZ1enplZERhdGFQcm92aWRlciYsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjEsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjIpIC0+IHZvaWQgewogICAgICAgICAgICAgICAgICAgICBzdHIxLmNvbXBhcmUoc3RyMik7CkBAIC01Miw3ICs1NCw3IEBACiAgICAgICAgICAgICAgICAgKFtdKEZ1enplZERhdGFQcm92aWRlciYgZGF0YVByb3ZpZGVyLCBhbmRyb2lkOjpTdHJpbmcxNiBzdHIxLAogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmcxNiBzdHIyKSAtPiB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMCwgc3RyMS5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBzdHIxLmluc2VydChwb3MsIHN0cjIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzdHIxLmluc2VydChwb3MsIHN0cjIuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfSksCiAKICAgICAgICAgICAgICAgICAvLyBGaW5kIGFuZCByZXBsYWNlIG9wZXJhdGlvbnMKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1N0cmluZzE2X3Rlc3QuY3BwIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzE2X3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggNzclCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1N0cmluZzE2X3Rlc3QuY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvU3RyaW5nMTZfdGVzdC5jcHAKaW5kZXggYzZlNmY3NC4uNmY0NjQyZSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3RyaW5nMTZfdGVzdC5jcHAKKysrIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzE2X3Rlc3QuY3BwCkBAIC0zMyw1MCArMzMsNTAgQEAKIAogVEVTVChTdHJpbmcxNlRlc3QsIEZyb21DaGFyMTZfdCkgewogICAgIFN0cmluZzE2IHRtcCh1IlZlcmlmeSBtZSIpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcC5jX3N0cigpKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIEZyb21DaGFyMTZfdFNpemVkKSB7CiAgICAgU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIiwgNyk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgIiwgdG1wKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSAiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBGcm9tQ2hhcikgewogICAgIFN0cmluZzE2IHRtcCgiVmVyaWZ5IG1lIik7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wLmNfc3RyKCkpOwogfQogCiBURVNUKFN0cmluZzE2VGVzdCwgRnJvbUNoYXJTaXplZCkgewogICAgIFN0cmluZzE2IHRtcCgiVmVyaWZ5IG1lIiwgNyk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgIiwgdG1wKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSAiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBDb3B5KSB7CiAgICAgU3RyaW5nMTYgdG1wKCJWZXJpZnkgbWUiKTsKICAgICBTdHJpbmcxNiBhbm90aGVyID0gdG1wOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlci5jX3N0cigpKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIENvcHlBc3NpZ24pIHsKICAgICBTdHJpbmcxNiB0bXAoIlZlcmlmeSBtZSIpOwogICAgIFN0cmluZzE2IGFub3RoZXI7CiAgICAgYW5vdGhlciA9IHRtcDsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcCk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBNb3ZlKSB7CiAgICAgU3RyaW5nMTYgdG1wKCJWZXJpZnkgbWUiKTsKICAgICBTdHJpbmcxNiBhbm90aGVyKHN0ZDo6bW92ZSh0bXApKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlci5jX3N0cigpKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIE1vdmVBc3NpZ24pIHsKICAgICBTdHJpbmcxNiB0bXAoIlZlcmlmeSBtZSIpOwogICAgIFN0cmluZzE2IGFub3RoZXI7CiAgICAgYW5vdGhlciA9IHN0ZDo6bW92ZSh0bXApOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlcik7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyLmNfc3RyKCkpOwogfQogCiBURVNUKFN0cmluZzE2VGVzdCwgU2l6ZSkgewpAQCAtODgsMjcgKzg4LDI3IEBACiAgICAgU3RyaW5nMTYgdG1wKCJWZXJpZnkgbWUiKTsKICAgICB0bXAuc2V0VG8odSJOZXcgY29udGVudCIpOwogICAgIEVYUEVDVF9FUSgxMVUsIHRtcC5zaXplKCkpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiTmV3IGNvbnRlbnQiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiTmV3IGNvbnRlbnQiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBBcHBlbmQpIHsKICAgICBTdHJpbmcxNiB0bXAoIlZlcmlmeSBtZSIpOwogICAgIHRtcC5hcHBlbmQoU3RyaW5nMTYoIkhlbGxvIikpOwogICAgIEVYUEVDVF9FUSgxNFUsIHRtcC5zaXplKCkpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lSGVsbG8iLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lSGVsbG8iLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBJbnNlcnQpIHsKICAgICBTdHJpbmcxNiB0bXAoIlZlcmlmeSBtZSIpOwogICAgIHRtcC5pbnNlcnQoNiwgdSJJbnNlcnQiKTsKICAgICBFWFBFQ1RfRVEoMTVVLCB0bXAuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeUluc2VydCBtZSIsIHRtcCk7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnlJbnNlcnQgbWUiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBSZXBsYWNlQWxsKSB7CiAgICAgU3RyaW5nMTYgdG1wKCJWZXJpZnkgdmVyaWZ5IFZlcmlmeSIpOwogICAgIHRtcC5yZXBsYWNlQWxsKHUncicsIHUnIScpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmUhaWZ5IHZlIWlmeSBWZSFpZnkiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmUhaWZ5IHZlIWlmeSBWZSFpZnkiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBDb21wYXJlKSB7CkBAIC0xMjcsOCArMTI3LDggQEAKIFRFU1QoU3RyaW5nMTZUZXN0LCBTdGF0aWNTdHJpbmdDb3B5KSB7CiAgICAgU3RhdGljU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIik7CiAgICAgU3RyaW5nMTYgYW5vdGhlciA9IHRtcDsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcCk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIuY19zdHIoKSk7CiAgICAgRVhQRUNUX1RSVUUodG1wLmlzU3RhdGljU3RyaW5nKCkpOwogICAgIEVYUEVDVF9UUlVFKGFub3RoZXIuaXNTdGF0aWNTdHJpbmcoKSk7CiB9CkBAIC0xMzYsNyArMTM2LDcgQEAKIFRFU1QoU3RyaW5nMTZUZXN0LCBTdGF0aWNTdHJpbmdNb3ZlKSB7CiAgICAgU3RhdGljU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIik7CiAgICAgU3RyaW5nMTYgYW5vdGhlcihzdGQ6Om1vdmUodG1wKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIuY19zdHIoKSk7CiAgICAgRVhQRUNUX1RSVUUoYW5vdGhlci5pc1N0YXRpY1N0cmluZygpKTsKIH0KIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgU3RhdGljU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIik7CiAgICAgdG1wLmFwcGVuZChTdHJpbmcxNigiSGVsbG8iKSk7CiAgICAgRVhQRUNUX0VRKDE0VSwgdG1wLnNpemUoKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWVIZWxsbyIsIHRtcCk7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWVIZWxsbyIsIHRtcC5jX3N0cigpKTsKICAgICBFWFBFQ1RfRkFMU0UodG1wLmlzU3RhdGljU3RyaW5nKCkpOwogfQogCkBAIC0xNjUsMTQgKzE2NSwxNCBAQAogICAgIFN0YXRpY1N0cmluZzE2IHRtcCh1IlZlcmlmeSBtZSIpOwogICAgIHRtcC5pbnNlcnQoNiwgdSJJbnNlcnQiKTsKICAgICBFWFBFQ1RfRVEoMTVVLCB0bXAuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeUluc2VydCBtZSIsIHRtcCk7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnlJbnNlcnQgbWUiLCB0bXAuY19zdHIoKSk7CiAgICAgRVhQRUNUX0ZBTFNFKHRtcC5pc1N0YXRpY1N0cmluZygpKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIFN0YXRpY1N0cmluZ1JlcGxhY2VBbGwpIHsKICAgICBTdGF0aWNTdHJpbmcxNiB0bXAodSJWZXJpZnkgdmVyaWZ5IFZlcmlmeSIpOwogICAgIHRtcC5yZXBsYWNlQWxsKHUncicsIHUnIScpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmUhaWZ5IHZlIWlmeSBWZSFpZnkiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmUhaWZ5IHZlIWlmeSBWZSFpZnkiLCB0bXAuY19zdHIoKSk7CiAgICAgRVhQRUNUX0ZBTFNFKHRtcC5pc1N0YXRpY1N0cmluZygpKTsKIH0KIApAQCAtMTg1LDE3ICsxODUsMTcgQEAKICAgICBTdGF0aWNTdHJpbmcxNiB0bXAodSJWZXJpZnkgbWUiKTsKICAgICBTdHJpbmcxNiBhbm90aGVyKHUibm9uc3RhdGljIik7CiAgICAgYW5vdGhlciA9IHRtcDsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcCk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBTdHJpbmdDb3B5QXNzaWduRnJvbVN0YXRpY1N0cmluZykgewogICAgIFN0YXRpY1N0cmluZzE2IHRtcCh1IlZlcmlmeSBtZSIpOwogICAgIFN0cmluZzE2IGFub3RoZXIodSJub25zdGF0aWMiKTsKICAgICBhbm90aGVyID0gdG1wOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlcik7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyLmNfc3RyKCkpOwogICAgIEVYUEVDVF9UUlVFKGFub3RoZXIuaXNTdGF0aWNTdHJpbmcoKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wLmNfc3RyKCkpOwogICAgIEVYUEVDVF9UUlVFKHRtcC5pc1N0YXRpY1N0cmluZygpKTsKIH0KIApAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgU3RhdGljU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIik7CiAgICAgU3RyaW5nMTYgYW5vdGhlcih1Im5vbnN0YXRpYyIpOwogICAgIGFub3RoZXIgPSBzdGQ6Om1vdmUodG1wKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlci5jX3N0cigpKTsKICAgICBFWFBFQ1RfVFJVRShhbm90aGVyLmlzU3RhdGljU3RyaW5nKCkpOwogfQogCkBAIC0yMjEsMTkgKzIyMSwxOSBAQAogVEVTVChTdHJpbmcxNlRlc3QsIFZhbGlkVXRmOENvbnZlcnNpb24pIHsKICAgICBTdHJpbmcxNiBhbm90aGVyKCJhYmNkZWYiKTsKICAgICBFWFBFQ1RfRVEoNlUsIGFub3RoZXIuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUShhbm90aGVyLCB1ImFiY2RlZiIpOworICAgIEVYUEVDVF9TVFIxNkVRKGFub3RoZXIuY19zdHIoKSwgdSJhYmNkZWYiKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIGFwcGVuZCkgewogICAgIFN0cmluZzE2IHM7CiAgICAgRVhQRUNUX0VRKE9LLCBzLmFwcGVuZChTdHJpbmcxNih1ImZvbyIpKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb28iLCBzKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvbyIsIHMuY19zdHIoKSk7CiAgICAgRVhQRUNUX0VRKE9LLCBzLmFwcGVuZChTdHJpbmcxNih1ImJhciIpKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb29iYXIiLCBzKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvb2JhciIsIHMuY19zdHIoKSk7CiAgICAgRVhQRUNUX0VRKE9LLCBzLmFwcGVuZCh1ImJheiIsIDApKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvb2JhciIsIHMpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vYmFyIiwgcy5jX3N0cigpKTsKICAgICBFWFBFQ1RfRVEoTk9fTUVNT1JZLCBzLmFwcGVuZCh1ImJheiIsIFNJWkVfTUFYKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb29iYXIiLCBzKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvb2JhciIsIHMuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBpbnNlcnQpIHsKQEAgLTI0MSwxOSArMjQxLDE5IEBACiAKICAgICAvLyBJbnNlcnRpbmcgaW50byB0aGUgZW1wdHkgc3RyaW5nIGluc2VydHMgYXQgdGhlIHN0YXJ0LgogICAgIEVYUEVDVF9FUShPSywgcy5pbnNlcnQoMTIzLCB1ImZvbyIpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvbyIsIHMpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vIiwgcy5jX3N0cigpKTsKIAogICAgIC8vIEluc2VydGluZyB6ZXJvIGNoYXJhY3RlcnMgYXQgYW55IHBvc2l0aW9uIGlzIG9rYXksIGJ1dCB3b24ndCBleHBhbmQgdGhlIHN0cmluZy4KICAgICBFWFBFQ1RfRVEoT0ssIHMuaW5zZXJ0KDEyMywgdSJmb28iLCAwKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb28iLCBzKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvbyIsIHMuY19zdHIoKSk7CiAKICAgICAvLyBJbnNlcnRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgbm9uLWVtcHR5IHN0cmluZyBhcHBlbmRzLgogICAgIEVYUEVDVF9FUShPSywgcy5pbnNlcnQoMTIzLCB1ImJhciIpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvb2JhciIsIHMpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vYmFyIiwgcy5jX3N0cigpKTsKIAogICAgIEVYUEVDVF9FUShPSywgcy5pbnNlcnQoMywgdSIhIikpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vIWJhciIsIHMpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vIWJhciIsIHMuY19zdHIoKSk7CiAKICAgICBFWFBFQ1RfRVEoTk9fTUVNT1JZLCBzLmluc2VydCgzLCB1IiIsIFNJWkVfTUFYKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb28hYmFyIiwgcyk7CisgICAgRVhQRUNUX1NUUjE2RVEodSJmb28hYmFyIiwgcy5jX3N0cigpKTsKIH0KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1N0cmluZzguY3BwIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzguY3BwCnNpbWlsYXJpdHkgaW5kZXggNzclCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1N0cmluZzguY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvU3RyaW5nOC5jcHAKaW5kZXggODJmNWNiNi4uNzQ5YmZjYiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3RyaW5nOC5jcHAKKysrIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzguY3BwCkBAIC0xOSw4ICsxOSw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLSNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC0zOSwxMCArMzgsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIFNlcGFyYXRvciB1c2VkIGJ5IHJlc291cmNlIHBhdGhzLiBUaGlzIGlzIG5vdCBwbGF0Zm9ybSBkZXBlbmRlbnQgY29udHJhcnkKLS8vIHRvIE9TX1BBVEhfU0VQQVJBVE9SLgotI2RlZmluZSBSRVNfUEFUSF9TRVBBUkFUT1IgJy8nCi0KIHN0YXRpYyBpbmxpbmUgY2hhciogZ2V0RW1wdHlTdHJpbmcoKSB7CiAgICAgc3RhdGljIFNoYXJlZEJ1ZmZlciogZ0VtcHR5U3RyaW5nQnVmID0gW10gewogICAgICAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MoMSk7CkBAIC0xNTAsMTAgKzE0NSw3IEBACiAgICAgfQogfQogCi1TdHJpbmc4OjpTdHJpbmc4KGNvbnN0IFN0cmluZzE2JiBvKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEYxNihvLnN0cmluZygpLCBvLnNpemUoKSkpCi17Ci19CitTdHJpbmc4OjpTdHJpbmc4KGNvbnN0IFN0cmluZzE2JiBvKSA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGMTYoby5jX3N0cigpLCBvLnNpemUoKSkpIHt9CiAKIFN0cmluZzg6OlN0cmluZzgoY29uc3QgY2hhcjE2X3QqIG8pCiAgICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjE2KG8sIHN0cmxlbjE2KG8pKSkKQEAgLTI2Nyw3ICsyNTksNyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgcmV0dXJuIHJlYWxfYXBwZW5kKG90aGVyLnN0cmluZygpLCBvdGhlckxlbik7CisgICAgcmV0dXJuIHJlYWxfYXBwZW5kKG90aGVyLmNfc3RyKCksIG90aGVyTGVuKTsKIH0KIAogc3RhdHVzX3QgU3RyaW5nODo6YXBwZW5kKGNvbnN0IGNoYXIqIG90aGVyKQpAQCAtMzkzLDYgKzM4NSwxMSBAQAogfQogCiBib29sIFN0cmluZzg6OnJlbW92ZUFsbChjb25zdCBjaGFyKiBvdGhlcikgeworICAgIEFMT0dfQVNTRVJUKG90aGVyLCAiU3RyaW5nODo6cmVtb3ZlQWxsKCkgcmVxdWlyZXMgYSBub24tTlVMTCBzdHJpbmciKTsKKworICAgIGlmICgqb3RoZXIgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKICAgICBzc2l6ZV90IGluZGV4ID0gZmluZChvdGhlcik7CiAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIGZhbHNlOwogCkBAIC00MzIsMzAgKzQyOSwxMiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBQYXRoIGZ1bmN0aW9ucwogCi1zdGF0aWMgdm9pZCBzZXRQYXRoTmFtZShTdHJpbmc4JiBzLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKLSAgICBjaGFyKiBidWYgPSBzLmxvY2tCdWZmZXIobGVuKTsKLQotICAgIG1lbWNweShidWYsIG5hbWUsIGxlbik7Ci0KLSAgICAvLyByZW1vdmUgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IsIGlmIHByZXNlbnQKLSAgICBpZiAobGVuID4gMCAmJiBidWZbbGVuIC0gMV0gPT0gT1NfUEFUSF9TRVBBUkFUT1IpIGxlbi0tOwotICAgIGJ1ZltsZW5dID0gJ1wwJzsKLQotICAgIHMudW5sb2NrQnVmZmVyKGxlbik7Ci19Ci0KLVN0cmluZzggU3RyaW5nODo6Z2V0UGF0aExlYWYodm9pZCkgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyKiBjcDsKLSAgICBjb25zdCBjaGFyKmNvbnN0IGJ1ZiA9IG1TdHJpbmc7Ci0KLSAgICBjcCA9IHN0cnJjaHIoYnVmLCBPU19QQVRIX1NFUEFSQVRPUik7Ci0gICAgaWYgKGNwID09IG51bGxwdHIpCi0gICAgICAgIHJldHVybiBTdHJpbmc4KCp0aGlzKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBTdHJpbmc4KGNwKzEpOwotfQorLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSBhbGwgdGhlIHBhdGggZnVuY3Rpb25zIGZyb20gU3RyaW5nOAorI2lmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBPU19QQVRIX1NFUEFSQVRPUiAnXFwnCisjZWxzZQorI2RlZmluZSBPU19QQVRIX1NFUEFSQVRPUiAnLycKKyNlbmRpZgogCiBTdHJpbmc4IFN0cmluZzg6OmdldFBhdGhEaXIodm9pZCkgY29uc3QKIHsKQEAgLTQ2OSw0MCArNDQ4LDE0IEBACiAgICAgICAgIHJldHVybiBTdHJpbmc4KHN0ciwgY3AgLSBzdHIpOwogfQogCi1TdHJpbmc4IFN0cmluZzg6OndhbGtQYXRoKFN0cmluZzgqIG91dFJlbWFpbnMpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhciogY3A7Ci0gICAgY29uc3QgY2hhcipjb25zdCBzdHIgPSBtU3RyaW5nOwotICAgIGNvbnN0IGNoYXIqIGJ1ZiA9IHN0cjsKLQotICAgIGNwID0gc3RyY2hyKGJ1ZiwgT1NfUEFUSF9TRVBBUkFUT1IpOwotICAgIGlmIChjcCA9PSBidWYpIHsKLSAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSBhIGxlYWRpbmcgJy8nLgotICAgICAgICBidWYgPSBidWYrMTsKLSAgICAgICAgY3AgPSBzdHJjaHIoYnVmLCBPU19QQVRIX1NFUEFSQVRPUik7Ci0gICAgfQotCi0gICAgaWYgKGNwID09IG51bGxwdHIpIHsKLSAgICAgICAgU3RyaW5nOCByZXMgPSBidWYgIT0gc3RyID8gU3RyaW5nOChidWYpIDogKnRoaXM7Ci0gICAgICAgIGlmIChvdXRSZW1haW5zKSAqb3V0UmVtYWlucyA9IFN0cmluZzgoIiIpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIFN0cmluZzggcmVzKGJ1ZiwgY3AtYnVmKTsKLSAgICBpZiAob3V0UmVtYWlucykgKm91dFJlbWFpbnMgPSBTdHJpbmc4KGNwKzEpOwotICAgIHJldHVybiByZXM7Ci19Ci0KIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGZpbmRpbmcgdGhlIHN0YXJ0IG9mIGFuIGV4dGVuc2lvbiBpbiBhIHBhdGhuYW1lLgogICoKICAqIFJldHVybnMgYSBwb2ludGVyIGluc2lkZSBtU3RyaW5nLCBvciBOVUxMIGlmIG5vIGV4dGVuc2lvbiB3YXMgZm91bmQuCiAgKi8KLWNoYXIqIFN0cmluZzg6OmZpbmRfZXh0ZW5zaW9uKHZvaWQpIGNvbnN0Ci17CitzdGF0aWMgY29uc3QgY2hhciogZmluZF9leHRlbnNpb24oY29uc3QgY2hhciogc3RyKSB7CiAgICAgY29uc3QgY2hhciogbGFzdFNsYXNoOwogICAgIGNvbnN0IGNoYXIqIGxhc3REb3Q7Ci0gICAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gbVN0cmluZzsKIAogICAgIC8vIG9ubHkgbG9vayBhdCB0aGUgZmlsZW5hbWUKICAgICBsYXN0U2xhc2ggPSBzdHJyY2hyKHN0ciwgT1NfUEFUSF9TRVBBUkFUT1IpOwpAQCAtNTE3LDgzICs0NzAsMTYgQEAKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgICAvLyBsb29rcyBnb29kLCBzaGlwIGl0Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhcio+KGxhc3REb3QpOworICAgIHJldHVybiBsYXN0RG90OwogfQogCiBTdHJpbmc4IFN0cmluZzg6OmdldFBhdGhFeHRlbnNpb24odm9pZCkgY29uc3QKIHsKLSAgICBjaGFyKiBleHQ7Ci0KLSAgICBleHQgPSBmaW5kX2V4dGVuc2lvbigpOworICAgIGF1dG8gZXh0ID0gZmluZF9leHRlbnNpb24obVN0cmluZyk7CiAgICAgaWYgKGV4dCAhPSBudWxscHRyKQogICAgICAgICByZXR1cm4gU3RyaW5nOChleHQpOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOwogfQogCi1TdHJpbmc4IFN0cmluZzg6OmdldEJhc2VQYXRoKHZvaWQpIGNvbnN0Ci17Ci0gICAgY2hhciogZXh0OwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9IG1TdHJpbmc7Ci0KLSAgICBleHQgPSBmaW5kX2V4dGVuc2lvbigpOwotICAgIGlmIChleHQgPT0gbnVsbHB0cikKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoKnRoaXMpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoc3RyLCBleHQgLSBzdHIpOwotfQotCi1TdHJpbmc4JiBTdHJpbmc4OjphcHBlbmRQYXRoKGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgLy8gVE9ETzogVGhlIHRlc3QgYmVsb3cgd2lsbCBmYWlsIGZvciBXaW4zMiBwYXRocy4gRml4IGxhdGVyIG9yIGlnbm9yZS4KLSAgICBpZiAobmFtZVswXSAhPSBPU19QQVRIX1NFUEFSQVRPUikgewotICAgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGxlbiA9IGxlbmd0aCgpOwotICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgIC8vIG5vIGV4aXN0aW5nIGZpbGVuYW1lLCBqdXN0IHVzZSB0aGUgbmV3IG9uZQotICAgICAgICAgICAgc2V0UGF0aE5hbWUoKnRoaXMsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSByb29tIGZvciBvbGRQYXRoICsgJy8nICsgbmV3UGF0aAotICAgICAgICBpbnQgbmV3bGVuID0gc3RybGVuKG5hbWUpOwotCi0gICAgICAgIGNoYXIqIGJ1ZiA9IGxvY2tCdWZmZXIobGVuKzErbmV3bGVuKTsKLQotICAgICAgICAvLyBpbnNlcnQgYSAnLycgaWYgbmVlZGVkCi0gICAgICAgIGlmIChidWZbbGVuLTFdICE9IE9TX1BBVEhfU0VQQVJBVE9SKQotICAgICAgICAgICAgYnVmW2xlbisrXSA9IE9TX1BBVEhfU0VQQVJBVE9SOwotCi0gICAgICAgIG1lbWNweShidWYrbGVuLCBuYW1lLCBuZXdsZW4rMSk7Ci0gICAgICAgIGxlbiArPSBuZXdsZW47Ci0KLSAgICAgICAgdW5sb2NrQnVmZmVyKGxlbik7Ci0KLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldFBhdGhOYW1lKCp0aGlzLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLX0KLQotU3RyaW5nOCYgU3RyaW5nODo6Y29udmVydFRvUmVzUGF0aCgpCi17Ci0jaWYgT1NfUEFUSF9TRVBBUkFUT1IgIT0gUkVTX1BBVEhfU0VQQVJBVE9SCi0gICAgc2l6ZV90IGxlbiA9IGxlbmd0aCgpOwotICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgIGNoYXIgKiBidWYgPSBsb2NrQnVmZmVyKGxlbik7Ci0gICAgICAgIGZvciAoY2hhciAqIGVuZCA9IGJ1ZiArIGxlbjsgYnVmIDwgZW5kOyArK2J1ZikgewotICAgICAgICAgICAgaWYgKCpidWYgPT0gT1NfUEFUSF9TRVBBUkFUT1IpCi0gICAgICAgICAgICAgICAgKmJ1ZiA9IFJFU19QQVRIX1NFUEFSQVRPUjsKLSAgICAgICAgfQotICAgICAgICB1bmxvY2tCdWZmZXIobGVuKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdHJpbmc4X2Z1enouY3BwIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzhfZnV6ei5jcHAKc2ltaWxhcml0eSBpbmRleCA4NCUKcmVuYW1lIGZyb20gbGlidXRpbHMvU3RyaW5nOF9mdXp6LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cmluZzhfZnV6ei5jcHAKaW5kZXggZmFmNDliNi4uY2JjZTA1MCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3RyaW5nOF9mdXp6LmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvU3RyaW5nOF9mdXp6LmNwcApAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdHIxLT5ieXRlcygpOwogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwgYW5kcm9pZDo6U3RyaW5nOCopIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLT5pc0VtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIHN0cjEtPmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpTdHJpbmc4KiBzdHIxLCBhbmRyb2lkOjpTdHJpbmc4KikgLT4gdm9pZCB7CiAgICAgICAgICAgICAgICAgICAgIHN0cjEtPmxlbmd0aCgpOwpAQCAtNDUsNiArNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBzdHIxLT50b0xvd2VyKCk7CiAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpTdHJpbmc4KiBzdHIxLCBhbmRyb2lkOjpTdHJpbmc4KiBzdHIyKSAtPiB2b2lkIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cjItPnNpemUoKSA9PSAwKSByZXR1cm47CisKICAgICAgICAgICAgICAgICAgICAgc3RyMS0+cmVtb3ZlQWxsKHN0cjItPmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMikgLT4gdm9pZCB7CkBAIC02NiwzMyArNjgsNiBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXggPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50PigwLCBzdHIxLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBzdHIxLT5maW5kKHN0cjItPmNfc3RyKCksIHN0YXJ0X2luZGV4KTsKICAgICAgICAgICAgICAgICB9LAotCi0gICAgICAgICAgICAgICAgLy8gUGF0aCBoYW5kbGluZwotICAgICAgICAgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciosIGFuZHJvaWQ6OlN0cmluZzgqIHN0cjEsIGFuZHJvaWQ6OlN0cmluZzgqKSAtPiB2b2lkIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyMS0+Z2V0QmFzZVBhdGgoKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciosIGFuZHJvaWQ6OlN0cmluZzgqIHN0cjEsIGFuZHJvaWQ6OlN0cmluZzgqKSAtPiB2b2lkIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyMS0+Z2V0UGF0aEV4dGVuc2lvbigpOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwgYW5kcm9pZDo6U3RyaW5nOCopIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLT5nZXRQYXRoTGVhZigpOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwgYW5kcm9pZDo6U3RyaW5nOCopIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLT5nZXRQYXRoRGlyKCk7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpTdHJpbmc4KiBzdHIxLCBhbmRyb2lkOjpTdHJpbmc4KikgLT4gdm9pZCB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cjEtPmNvbnZlcnRUb1Jlc1BhdGgoKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciosIGFuZHJvaWQ6OlN0cmluZzgqIHN0cjEsIGFuZHJvaWQ6OlN0cmluZzgqKSAtPiB2b2lkIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OlN0cmluZzg+IHBhdGhfb3V0X3N0ciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxhbmRyb2lkOjpTdHJpbmc4PigpOwotICAgICAgICAgICAgICAgICAgICBzdHIxLT53YWxrUGF0aChwYXRoX291dF9zdHIuZ2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBwYXRoX291dF9zdHItPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFQcm92aWRlciwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwKLSAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4KikgLT4gdm9pZCB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cjEtPmFwcGVuZFBhdGgoZGF0YVByb3ZpZGVyLT5Db25zdW1lQnl0ZXNXaXRoVGVybWluYXRvcjxjaGFyPig1KS5kYXRhKCkpOwotICAgICAgICAgICAgICAgIH0sCiB9OwogCiB2b2lkIGZ1enpGb3JtYXQoRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhUHJvdmlkZXIsIGFuZHJvaWQ6OlN0cmluZzgqIHN0cjEsIGJvb2wgc2hvdWxkQXBwZW5kKSB7CmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdHJpbmc4X3Rlc3QuY3BwIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzhfdGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCA2OCUKcmVuYW1lIGZyb20gbGlidXRpbHMvU3RyaW5nOF90ZXN0LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cmluZzhfdGVzdC5jcHAKaW5kZXggMTM1NmNkMC4uNmY3ODgyYSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3RyaW5nOF90ZXN0LmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvU3RyaW5nOF90ZXN0LmNwcApAQCAtMTYsNyArMTYsNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIlN0cmluZzhfdGVzdCIKIAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIApAQCAtMzYsNyArMzYsNyBAQAogVEVTVF9GKFN0cmluZzhUZXN0LCBDc3RyKSB7CiAgICAgU3RyaW5nOCB0bXAoIkhlbGxvLCB3b3JsZCEiKTsKIAotICAgIEVYUEVDVF9TVFJFUSh0bXAuc3RyaW5nKCksICJIZWxsbywgd29ybGQhIik7CisgICAgRVhQRUNUX1NUUkVRKHRtcC5jX3N0cigpLCAiSGVsbG8sIHdvcmxkISIpOwogfQogCiBURVNUX0YoU3RyaW5nOFRlc3QsIE9wZXJhdG9yUGx1cykgewpAQCAtNDUsMTYgKzQ1LDE2IEBACiAgICAgLy8gVGVzdCBhZGRpbmcgU3RyaW5nOCArIGNvbnN0IGNoYXIqCiAgICAgY29uc3QgY2hhciogY2NzcmMyID0gIndvcmxkISI7CiAgICAgU3RyaW5nOCBkc3QxID0gc3JjMSArIGNjc3JjMjsKLSAgICBFWFBFQ1RfU1RSRVEoZHN0MS5zdHJpbmcoKSwgIkhlbGxvLCB3b3JsZCEiKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMS5zdHJpbmcoKSwgIkhlbGxvLCAiKTsKKyAgICBFWFBFQ1RfU1RSRVEoZHN0MS5jX3N0cigpLCAiSGVsbG8sIHdvcmxkISIpOworICAgIEVYUEVDVF9TVFJFUShzcmMxLmNfc3RyKCksICJIZWxsbywgIik7CiAgICAgRVhQRUNUX1NUUkVRKGNjc3JjMiwgIndvcmxkISIpOwogCiAgICAgLy8gVGVzdCBhZGRpbmcgU3RyaW5nOCArIFN0cmluZzgKICAgICBTdHJpbmc4IHNzcmMyKCJ3b3JsZCEiKTsKICAgICBTdHJpbmc4IGRzdDIgPSBzcmMxICsgc3NyYzI7Ci0gICAgRVhQRUNUX1NUUkVRKGRzdDIuc3RyaW5nKCksICJIZWxsbywgd29ybGQhIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzEuc3RyaW5nKCksICJIZWxsbywgIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNzcmMyLnN0cmluZygpLCAid29ybGQhIik7CisgICAgRVhQRUNUX1NUUkVRKGRzdDIuY19zdHIoKSwgIkhlbGxvLCB3b3JsZCEiKTsKKyAgICBFWFBFQ1RfU1RSRVEoc3JjMS5jX3N0cigpLCAiSGVsbG8sICIpOworICAgIEVYUEVDVF9TVFJFUShzc3JjMi5jX3N0cigpLCAid29ybGQhIik7CiB9CiAKIFRFU1RfRihTdHJpbmc4VGVzdCwgT3BlcmF0b3JQbHVzRXF1YWxzKSB7CkBAIC02MywxNCArNjMsMTQgQEAKICAgICAvLyBUZXN0aW5nIFN0cmluZzggKz0gU3RyaW5nOAogICAgIFN0cmluZzggc3JjMigiIGlzIG15IHBhc3Nwb3J0LiIpOwogICAgIHNyYzEgKz0gc3JjMjsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMS5zdHJpbmcoKSwgIk15IHZvaWNlIGlzIG15IHBhc3Nwb3J0LiIpOwotICAgIEVYUEVDVF9TVFJFUShzcmMyLnN0cmluZygpLCAiIGlzIG15IHBhc3Nwb3J0LiIpOworICAgIEVYUEVDVF9TVFJFUShzcmMxLmNfc3RyKCksICJNeSB2b2ljZSBpcyBteSBwYXNzcG9ydC4iKTsKKyAgICBFWFBFQ1RfU1RSRVEoc3JjMi5jX3N0cigpLCAiIGlzIG15IHBhc3Nwb3J0LiIpOwogCiAgICAgLy8gQWRkaW5nIGNvbnN0IGNoYXIqIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcuCiAgICAgY29uc3QgY2hhciogc3JjMyA9ICIgVmVyaWZ5IG1lLiI7CiAgICAgc3JjMSArPSBzcmMzOwotICAgIEVYUEVDVF9TVFJFUShzcmMxLnN0cmluZygpLCAiTXkgdm9pY2UgaXMgbXkgcGFzc3BvcnQuIFZlcmlmeSBtZS4iKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMi5zdHJpbmcoKSwgIiBpcyBteSBwYXNzcG9ydC4iKTsKKyAgICBFWFBFQ1RfU1RSRVEoc3JjMS5jX3N0cigpLCAiTXkgdm9pY2UgaXMgbXkgcGFzc3BvcnQuIFZlcmlmeSBtZS4iKTsKKyAgICBFWFBFQ1RfU1RSRVEoc3JjMi5jX3N0cigpLCAiIGlzIG15IHBhc3Nwb3J0LiIpOwogICAgIEVYUEVDVF9TVFJFUShzcmMzLCAiIFZlcmlmeSBtZS4iKTsKIH0KIApAQCAtMTAwLDE3ICsxMDAsMzUgQEAKIFRFU1RfRihTdHJpbmc4VGVzdCwgVmFsaWRVdGYxNkNvbnZlcnNpb24pIHsKICAgICBjaGFyMTZfdCB0bXBbXSA9IHUiYWJjZGVmIjsKICAgICBTdHJpbmc4IHZhbGlkID0gU3RyaW5nOChTdHJpbmcxNih0bXApKTsKLSAgICBFWFBFQ1RfU1RSRVEodmFsaWQsICJhYmNkZWYiKTsKKyAgICBFWFBFQ1RfU1RSRVEodmFsaWQuY19zdHIoKSwgImFiY2RlZiIpOwogfQogCiBURVNUX0YoU3RyaW5nOFRlc3QsIGFwcGVuZCkgewogICAgIFN0cmluZzggczsKICAgICBFWFBFQ1RfRVEoT0ssIHMuYXBwZW5kKCJmb28iKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCJmb28iLCBzKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZvbyIsIHMuY19zdHIoKSk7CiAgICAgRVhQRUNUX0VRKE9LLCBzLmFwcGVuZCgiYmFyIikpOwotICAgIEVYUEVDVF9TVFJFUSgiZm9vYmFyIiwgcyk7CisgICAgRVhQRUNUX1NUUkVRKCJmb29iYXIiLCBzLmNfc3RyKCkpOwogICAgIEVYUEVDVF9FUShPSywgcy5hcHBlbmQoImJheiIsIDApKTsKLSAgICBFWFBFQ1RfU1RSRVEoImZvb2JhciIsIHMpOworICAgIEVYUEVDVF9TVFJFUSgiZm9vYmFyIiwgcy5jX3N0cigpKTsKICAgICBFWFBFQ1RfRVEoTk9fTUVNT1JZLCBzLmFwcGVuZCgiYmF6IiwgU0laRV9NQVgpKTsKLSAgICBFWFBFQ1RfU1RSRVEoImZvb2JhciIsIHMpOworICAgIEVYUEVDVF9TVFJFUSgiZm9vYmFyIiwgcy5jX3N0cigpKTsKK30KKworVEVTVF9GKFN0cmluZzhUZXN0LCByZW1vdmVBbGwpIHsKKyAgICBTdHJpbmc4IHMoIkhlbGxvLCB3b3JsZCEiKTsKKworICAgIC8vIE5VTEwgaW5wdXQgc2hvdWxkIGNhdXNlIGFuIGFzc2VydGlvbiBmYWlsdXJlIGFuZCBlcnJvciBtZXNzYWdlIGluIGxvZ2NhdAorICAgIEVYUEVDVF9ERUFUSChzLnJlbW92ZUFsbChOVUxMKSwgIiIpOworCisgICAgLy8gZXhwZWN0IHRvIHJldHVybiB0cnVlIGFuZCBzdHJpbmcgY29udGVudCBzaG91bGQgcmVtYWluIHVuY2hhbmdlZAorICAgIEVYUEVDVF9UUlVFKHMucmVtb3ZlQWxsKCIiKSk7CisgICAgRVhQRUNUX1NUUkVRKCJIZWxsbywgd29ybGQhIiwgcy5jX3N0cigpKTsKKworICAgIC8vIGV4cGVjdCB0byByZXR1cm4gZmFsc2UKKyAgICBFWFBFQ1RfRkFMU0Uocy5yZW1vdmVBbGwoIngiKSk7CisgICAgRVhQRUNUX1NUUkVRKCJIZWxsbywgd29ybGQhIiwgcy5jX3N0cigpKTsKKworICAgIEVYUEVDVF9UUlVFKHMucmVtb3ZlQWxsKCJvIikpOworICAgIEVYUEVDVF9TVFJFUSgiSGVsbCwgd3JsZCEiLCBzLmNfc3RyKCkpOwogfQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvU3Ryb25nUG9pbnRlci5jcHAgYi9saWJ1dGlscy9iaW5kZXIvU3Ryb25nUG9pbnRlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1N0cm9uZ1BvaW50ZXIuY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvU3Ryb25nUG9pbnRlci5jcHAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1N0cm9uZ1BvaW50ZXJfdGVzdC5jcHAgYi9saWJ1dGlscy9iaW5kZXIvU3Ryb25nUG9pbnRlcl90ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9TdHJvbmdQb2ludGVyX3Rlc3QuY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvU3Ryb25nUG9pbnRlcl90ZXN0LmNwcAppbmRleCBmMjdjMWYxLi5hYTk5M2MzIDEwMDY0NAotLS0gYS9saWJ1dGlscy9TdHJvbmdQb2ludGVyX3Rlc3QuY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9TdHJvbmdQb2ludGVyX3Rlc3QuY3BwCkBAIC0xMDYsMyArMTA2LDE3IEBACiAgICAgRVhQRUNUX0RFQVRIKHNwPFR5cGVQYXJhbT46OmZyb21FeGlzdGluZyhmb28pLCAiIik7CiAgICAgZGVsZXRlIGZvbzsKIH0KKworVFlQRURfVEVTVChTdHJvbmdQb2ludGVyLCByZWxlYXNlKSB7CisgICAgYm9vbCBpc0RlbGV0ZWQgPSBmYWxzZTsKKyAgICBUeXBlUGFyYW0qIGZvbyA9IG51bGxwdHI7CisgICAgeworICAgICAgICBzcDxUeXBlUGFyYW0+IHNwMSA9IHNwPFR5cGVQYXJhbT46Om1ha2UoJmlzRGVsZXRlZCk7CisgICAgICAgIEFTU0VSVF9FUSgxLCBzcDEtPmdldFN0cm9uZ0NvdW50KCkpOworICAgICAgICBmb28gPSBzcDEucmVsZWFzZSgpOworICAgIH0KKyAgICBBU1NFUlRfRkFMU0UoaXNEZWxldGVkKSA8PCAicmVsZWFzZSBmYWlsZWQsIGRlbGV0ZWQgYW55d2F5IHdoZW4gc3AgbGVmdCBzY29wZSI7CisgICAgQVNTRVJUX0VRKDEsIGZvby0+Z2V0U3Ryb25nQ291bnQoKSkgPDwgInJlbGVhc2UgbWlzbWFuYWdlZCByZWZjb3VudCI7CisgICAgZm9vLT5kZWNTdHJvbmcobnVsbHB0cik7CisgICAgQVNTRVJUX1RSVUUoaXNEZWxldGVkKSA8PCAiZm9vIHdhcyBsZWFrZWQhIjsKK30KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2JpbmRlci9Vbmljb2RlLmNwcCBiL2xpYnV0aWxzL2JpbmRlci9Vbmljb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQyZDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidXRpbHMvYmluZGVyL1VuaWNvZGUuY3BwCkBAIC0wLDAgKzEsNTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJ1bmljb2RlIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVW5pY29kZS5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCitleHRlcm4gIkMiIHsKKworc3RhdGljIGNvbnN0IGNoYXIzMl90IGtCeXRlTWFzayA9IDB4MDAwMDAwQkY7CitzdGF0aWMgY29uc3QgY2hhcjMyX3Qga0J5dGVNYXJrID0gMHgwMDAwMDA4MDsKKworLy8gU3Vycm9nYXRlcyBhcmVuJ3QgdmFsaWQgZm9yIFVURi0zMiBjaGFyYWN0ZXJzLCBzbyBkZWZpbmUgc29tZQorLy8gY29uc3RhbnRzIHRoYXQgd2lsbCBsZXQgdXMgc2NyZWVuIHRoZW0gb3V0Lgorc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlSGlnaFN0YXJ0ICA9IDB4MDAwMEQ4MDA7CisvLyBVbnVzZWQsIGhlcmUgZm9yIGNvbXBsZXRlbmVzczoKKy8vIHN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUhpZ2hFbmQgPSAweDAwMDBEQkZGOworLy8gc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlTG93U3RhcnQgPSAweDAwMDBEQzAwOworc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlTG93RW5kICAgICA9IDB4MDAwMERGRkY7CitzdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVTdGFydCAgICAgID0ga1VuaWNvZGVTdXJyb2dhdGVIaWdoU3RhcnQ7CitzdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVFbmQgICAgICAgID0ga1VuaWNvZGVTdXJyb2dhdGVMb3dFbmQ7CitzdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVNYXhDb2RlcG9pbnQgICAgICAgID0gMHgwMDEwRkZGRjsKKworLy8gTWFzayB1c2VkIHRvIHNldCBhcHByb3ByaWF0ZSBiaXRzIGluIGZpcnN0IGJ5dGUgb2YgVVRGLTggc2VxdWVuY2UsCisvLyBpbmRleGVkIGJ5IG51bWJlciBvZiBieXRlcyBpbiB0aGUgc2VxdWVuY2UuCisvLyAweHh4eHh4eAorLy8gLT4gKDAwLTdmKSA3Yml0LiBCaXQgbWFzayBmb3IgdGhlIGZpcnN0IGJ5dGUgaXMgMHgwMDAwMDAwMAorLy8gMTEweXl5eXggMTB4eHh4eHgKKy8vIC0+IChjMC1kZikoODAtYmYpIDExYml0LiBCaXQgbWFzayBpcyAweDAwMDAwMEMwCisvLyAxMTEweXl5eSAxMHl4eHh4eCAxMHh4eHh4eAorLy8gLT4gKGUwLWVmKSg4MC1iZikoODAtYmYpIDE2Yml0LiBCaXQgbWFzayBpcyAweDAwMDAwMEUwCisvLyAxMTExMHl5eSAxMHl5eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAorLy8gLT4gKGYwLWY3KSg4MC1iZikoODAtYmYpKDgwLWJmKSAyMWJpdC4gQml0IG1hc2sgaXMgMHgwMDAwMDBGMAorc3RhdGljIGNvbnN0IGNoYXIzMl90IGtGaXJzdEJ5dGVNYXJrW10gPSB7CisgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDBDMCwgMHgwMDAwMDBFMCwgMHgwMDAwMDBGMAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVURi0zMgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisgKiBSZXR1cm4gbnVtYmVyIG9mIFVURi04IGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgY2hhcmFjdGVyLiBJZiB0aGUgY2hhcmFjdGVyCisgKiBpcyBpbnZhbGlkLCByZXR1cm4gc2l6ZSBvZiAwLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCB1dGYzMl9jb2RlcG9pbnRfdXRmOF9sZW5ndGgoY2hhcjMyX3Qgc3JjQ2hhcikKK3sKKyAgICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHRoZSByZXN1bHQgd2lsbCByZXF1aXJlLgorICAgIGlmIChzcmNDaGFyIDwgMHgwMDAwMDA4MCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKHNyY0NoYXIgPCAweDAwMDAwODAwKSB7CisgICAgICAgIHJldHVybiAyOworICAgIH0gZWxzZSBpZiAoc3JjQ2hhciA8IDB4MDAwMTAwMDApIHsKKyAgICAgICAgaWYgKChzcmNDaGFyIDwga1VuaWNvZGVTdXJyb2dhdGVTdGFydCkgfHwgKHNyY0NoYXIgPiBrVW5pY29kZVN1cnJvZ2F0ZUVuZCkpIHsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU3Vycm9nYXRlcyBhcmUgaW52YWxpZCBVVEYtMzIgY2hhcmFjdGVycy4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIC8vIE1heCBjb2RlIHBvaW50IGZvciBVbmljb2RlIGlzIDB4MDAxMEZGRkYuCisgICAgZWxzZSBpZiAoc3JjQ2hhciA8PSBrVW5pY29kZU1heENvZGVwb2ludCkgeworICAgICAgICByZXR1cm4gNDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJbnZhbGlkIFVURi0zMiBjaGFyYWN0ZXIuCisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLy8gV3JpdGUgb3V0IHRoZSBzb3VyY2UgY2hhcmFjdGVyIHRvIDxkc3RQPi4KKworc3RhdGljIGlubGluZSB2b2lkIHV0ZjMyX2NvZGVwb2ludF90b191dGY4KHVpbnQ4X3QqIGRzdFAsIGNoYXIzMl90IHNyY0NoYXIsIHNpemVfdCBieXRlcykKK3sKKyAgICBkc3RQICs9IGJ5dGVzOworICAgIHN3aXRjaCAoYnl0ZXMpCisgICAgeyAgIC8qIG5vdGU6IGV2ZXJ5dGhpbmcgZmFsbHMgdGhyb3VnaC4gKi8KKyAgICAgICAgY2FzZSA0OiAqLS1kc3RQID0gKHVpbnQ4X3QpKChzcmNDaGFyIHwga0J5dGVNYXJrKSAmIGtCeXRlTWFzayk7IHNyY0NoYXIgPj49IDY7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgMzogKi0tZHN0UCA9ICh1aW50OF90KSgoc3JjQ2hhciB8IGtCeXRlTWFyaykgJiBrQnl0ZU1hc2spOyBzcmNDaGFyID4+PSA2OworICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIDI6ICotLWRzdFAgPSAodWludDhfdCkoKHNyY0NoYXIgfCBrQnl0ZU1hcmspICYga0J5dGVNYXNrKTsgc3JjQ2hhciA+Pj0gNjsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSAxOiAqLS1kc3RQID0gKHVpbnQ4X3QpKHNyY0NoYXIgfCBrRmlyc3RCeXRlTWFya1tieXRlc10pOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IHV0ZjMyX2F0X2ludGVybmFsKGNvbnN0IGNoYXIqIGN1ciwgc2l6ZV90ICpudW1fcmVhZCkKK3sKKyAgICBjb25zdCBjaGFyIGZpcnN0X2NoYXIgPSAqY3VyOworICAgIGlmICgoZmlyc3RfY2hhciAmIDB4ODApID09IDApIHsgLy8gQVNDSUkKKyAgICAgICAgKm51bV9yZWFkID0gMTsKKyAgICAgICAgcmV0dXJuICpjdXI7CisgICAgfQorICAgIGN1cisrOworICAgIGNoYXIzMl90IG1hc2ssIHRvX2lnbm9yZV9tYXNrOworICAgIHNpemVfdCBudW1fdG9fcmVhZCA9IDA7CisgICAgY2hhcjMyX3QgdXRmMzIgPSBmaXJzdF9jaGFyOworICAgIGZvciAobnVtX3RvX3JlYWQgPSAxLCBtYXNrID0gMHg0MCwgdG9faWdub3JlX21hc2sgPSAweEZGRkZGRjgwOworICAgICAgICAgKGZpcnN0X2NoYXIgJiBtYXNrKTsKKyAgICAgICAgIG51bV90b19yZWFkKyssIHRvX2lnbm9yZV9tYXNrIHw9IG1hc2ssIG1hc2sgPj49IDEpIHsKKyAgICAgICAgLy8gMHgzRiA9PSAwMDExMTExMQorICAgICAgICB1dGYzMiA9ICh1dGYzMiA8PCA2KSArICgqY3VyKysgJiAweDNGKTsKKyAgICB9CisgICAgdG9faWdub3JlX21hc2sgfD0gbWFzazsKKyAgICB1dGYzMiAmPSB+KHRvX2lnbm9yZV9tYXNrIDw8ICg2ICogKG51bV90b19yZWFkIC0gMSkpKTsKKworICAgICpudW1fcmVhZCA9IG51bV90b19yZWFkOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pih1dGYzMik7Cit9CisKK2ludDMyX3QgdXRmMzJfZnJvbV91dGY4X2F0KGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY19sZW4sIHNpemVfdCBpbmRleCwgc2l6ZV90ICpuZXh0X2luZGV4KQoreworICAgIGlmIChpbmRleCA+PSBzcmNfbGVuKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc2l6ZV90IHVudXNlZF9pbmRleDsKKyAgICBpZiAobmV4dF9pbmRleCA9PSBudWxscHRyKSB7CisgICAgICAgIG5leHRfaW5kZXggPSAmdW51c2VkX2luZGV4OworICAgIH0KKyAgICBzaXplX3QgbnVtX3JlYWQ7CisgICAgaW50MzJfdCByZXQgPSB1dGYzMl9hdF9pbnRlcm5hbChzcmMgKyBpbmRleCwgJm51bV9yZWFkKTsKKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgKm5leHRfaW5kZXggPSBpbmRleCArIG51bV9yZWFkOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgdXRmMzJfdG9fdXRmOF9sZW5ndGgoY29uc3QgY2hhcjMyX3QgKnNyYywgc2l6ZV90IHNyY19sZW4pCit7CisgICAgaWYgKHNyYyA9PSBudWxscHRyIHx8IHNyY19sZW4gPT0gMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc2l6ZV90IHJldCA9IDA7CisgICAgY29uc3QgY2hhcjMyX3QgKmVuZCA9IHNyYyArIHNyY19sZW47CisgICAgd2hpbGUgKHNyYyA8IGVuZCkgeworICAgICAgICBzaXplX3QgY2hhcl9sZW4gPSB1dGYzMl9jb2RlcG9pbnRfdXRmOF9sZW5ndGgoKnNyYysrKTsKKyAgICAgICAgaWYgKFNTSVpFX01BWCAtIGNoYXJfbGVuIDwgcmV0KSB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIHdlIHdvdWxkIG92ZXJmbG93IHRoZSBzc2l6ZV90IHR5cGUgd2hlbgorICAgICAgICAgICAgLy8gcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5jdGlvbiwgc28gd2UgY2Fubm90IGV4cHJlc3MgaG93CisgICAgICAgICAgICAvLyBsb25nIHRoaXMgc3RyaW5nIGlzIGluIGFuIHNzaXplX3QuCisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM3NzIzMDI2Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0ICs9IGNoYXJfbGVuOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHV0ZjMyX3RvX3V0ZjgoY29uc3QgY2hhcjMyX3QqIHNyYywgc2l6ZV90IHNyY19sZW4sIGNoYXIqIGRzdCwgc2l6ZV90IGRzdF9sZW4pCit7CisgICAgaWYgKHNyYyA9PSBudWxscHRyIHx8IHNyY19sZW4gPT0gMCB8fCBkc3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhcjMyX3QgKmN1cl91dGYzMiA9IHNyYzsKKyAgICBjb25zdCBjaGFyMzJfdCAqZW5kX3V0ZjMyID0gc3JjICsgc3JjX2xlbjsKKyAgICBjaGFyICpjdXIgPSBkc3Q7CisgICAgd2hpbGUgKGN1cl91dGYzMiA8IGVuZF91dGYzMikgeworICAgICAgICBzaXplX3QgbGVuID0gdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKCpjdXJfdXRmMzIpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRzdF9sZW4gPCBsZW4sICIlenUgPCAlenUiLCBkc3RfbGVuLCBsZW4pOworICAgICAgICB1dGYzMl9jb2RlcG9pbnRfdG9fdXRmOCgodWludDhfdCAqKWN1ciwgKmN1cl91dGYzMisrLCBsZW4pOworICAgICAgICBjdXIgKz0gbGVuOworICAgICAgICBkc3RfbGVuIC09IGxlbjsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkc3RfbGVuIDwgMSwgImRzdF9sZW4gPCAxOiAlenUgPCAxIiwgZHN0X2xlbik7CisgICAgKmN1ciA9ICdcMCc7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVVEYtMTYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBzdHJjbXAxNihjb25zdCBjaGFyMTZfdCAqczEsIGNvbnN0IGNoYXIxNl90ICpzMikKK3sKKyAgY2hhcjE2X3QgY2g7CisgIGludCBkID0gMDsKKworICB3aGlsZSAoIDEgKSB7CisgICAgZCA9IChpbnQpKGNoID0gKnMxKyspIC0gKGludCkqczIrKzsKKyAgICBpZiAoIGQgfHwgIWNoICkKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGQ7Cit9CisKK2ludCBzdHJuY21wMTYoY29uc3QgY2hhcjE2X3QgKnMxLCBjb25zdCBjaGFyMTZfdCAqczIsIHNpemVfdCBuKQoreworICBjaGFyMTZfdCBjaDsKKyAgaW50IGQgPSAwOworCisgIGlmIChuID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRvIHsKKyAgICBkID0gKGludCkoY2ggPSAqczErKykgLSAoaW50KSpzMisrOworICAgIGlmICggZCB8fCAhY2ggKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKC0tbik7CisKKyAgcmV0dXJuIGQ7Cit9CisKK3NpemVfdCBzdHJsZW4xNihjb25zdCBjaGFyMTZfdCAqcykKK3sKKyAgY29uc3QgY2hhcjE2X3QgKnNzID0gczsKKyAgd2hpbGUgKCAqc3MgKQorICAgIHNzKys7CisgIHJldHVybiBzcy1zOworfQorCitzaXplX3Qgc3RybmxlbjE2KGNvbnN0IGNoYXIxNl90ICpzLCBzaXplX3QgbWF4bGVuKQoreworICBjb25zdCBjaGFyMTZfdCAqc3MgPSBzOworCisgIC8qIEltcG9ydGFudDogdGhlIG1heGxlbiB0ZXN0IG11c3QgcHJlY2VkZSB0aGUgcmVmZXJlbmNlIHRocm91Z2ggc3M7CisgICAgIHNpbmNlIHRoZSBieXRlIGJleW9uZCB0aGUgbWF4aW11bSBtYXkgc2VnZmF1bHQgKi8KKyAgd2hpbGUgKChtYXhsZW4gPiAwKSAmJiAqc3MpIHsKKyAgICBzcysrOworICAgIG1heGxlbi0tOworICB9CisgIHJldHVybiBzcy1zOworfQorCitjaGFyMTZfdCogc3Ryc3RyMTYoY29uc3QgY2hhcjE2X3QqIHNyYywgY29uc3QgY2hhcjE2X3QqIHRhcmdldCkKK3sKKyAgICBjb25zdCBjaGFyMTZfdCBuZWVkbGUgPSAqdGFyZ2V0OworICAgIGlmIChuZWVkbGUgPT0gJ1wwJykgcmV0dXJuIChjaGFyMTZfdCopc3JjOworCisgICAgY29uc3Qgc2l6ZV90IHRhcmdldF9sZW4gPSBzdHJsZW4xNigrK3RhcmdldCk7CisgICAgZG8geworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoKnNyYyA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCpzcmMrKyAhPSBuZWVkbGUpOworICAgIH0gd2hpbGUgKHN0cm5jbXAxNihzcmMsIHRhcmdldCwgdGFyZ2V0X2xlbikgIT0gMCk7CisgICAgc3JjLS07CisKKyAgICByZXR1cm4gKGNoYXIxNl90KilzcmM7Cit9CisKK2ludCBzdHJ6Y21wMTYoY29uc3QgY2hhcjE2X3QgKnMxLCBzaXplX3QgbjEsIGNvbnN0IGNoYXIxNl90ICpzMiwgc2l6ZV90IG4yKQoreworICAgIGNvbnN0IGNoYXIxNl90KiBlMSA9IHMxK24xOworICAgIGNvbnN0IGNoYXIxNl90KiBlMiA9IHMyK24yOworCisgICAgd2hpbGUgKHMxIDwgZTEgJiYgczIgPCBlMikgeworICAgICAgICBjb25zdCBpbnQgZCA9IChpbnQpKnMxKysgLSAoaW50KSpzMisrOworICAgICAgICBpZiAoZCkgeworICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbjEgPCBuMgorICAgICAgICA/ICgwIC0gKGludCkqczIpCisgICAgICAgIDogKG4xID4gbjIKKyAgICAgICAgICAgPyAoKGludCkqczEgLSAwKQorICAgICAgICAgICA6IDApOworfQorCisvLyBpc19hbnlfc3Vycm9nYXRlKCkgcmV0dXJucyB0cnVlIGlmIHcgaXMgZWl0aGVyIGEgaGlnaCBvciBsb3cgc3Vycm9nYXRlCitzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfYW55X3N1cnJvZ2F0ZShjaGFyMTZfdCB3KSB7CisgICAgcmV0dXJuICh3ICYgMHhmODAwKSA9PSAweGQ4MDA7Cit9CisKKy8vIGlzX3N1cnJvZ2F0ZV9wYWlyKCkgcmV0dXJucyB0cnVlIGlmIHcxIGFuZCB3MiBmb3JtIGEgdmFsaWQgc3Vycm9nYXRlIHBhaXIKK3N0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19zdXJyb2dhdGVfcGFpcihjaGFyMTZfdCB3MSwgY2hhcjE2X3QgdzIpIHsKKyAgICByZXR1cm4gKCh3MSAmIDB4ZmMwMCkgPT0gMHhkODAwKSAmJiAoKHcyICYgMHhmYzAwKSA9PSAweGRjMDApOworfQorCisvLyBUT0RPOiBjdXJyZW50bHkgdXRmMTZfdG9fdXRmOF9sZW5ndGgoKSByZXR1cm5zIC0xIGlmIHNyY19sZW4gPT0gMCwKKy8vIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIHV0ZjhfdG9fdXRmMTZfbGVuZ3RoKCksIGhlcmUgd2Uga2VlcCB0aGUKKy8vIGN1cnJlbnQgYmVoYXZpb3IgYXMgaW50ZW5kZWQgbm90IHRvIGJyZWFrIGNvbXBhdGliaWxpdHkKK3NzaXplX3QgdXRmMTZfdG9fdXRmOF9sZW5ndGgoY29uc3QgY2hhcjE2X3QgKnNyYywgc2l6ZV90IHNyY19sZW4pCit7CisgICAgaWYgKHNyYyA9PSBudWxscHRyIHx8IHNyY19sZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgY29uc3QgY2hhcjE2X3QqIGNvbnN0IGVuZCA9IHNyYyArIHNyY19sZW47CisgICAgY29uc3QgY2hhcjE2X3QqIGluID0gc3JjOworICAgIHNpemVfdCB1dGY4X2xlbiA9IDA7CisKKyAgICB3aGlsZSAoaW4gPCBlbmQpIHsKKyAgICAgICAgY2hhcjE2X3QgdyA9ICppbisrOworICAgICAgICBpZiAodyA8IDB4MDA4MCkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICB1dGY4X2xlbiArPSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHcgPCAweDA4MDApIFtbbGlrZWx5XV0geworICAgICAgICAgICAgdXRmOF9sZW4gKz0gMjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghaXNfYW55X3N1cnJvZ2F0ZSh3KSkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICB1dGY4X2xlbiArPSAzOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluIDwgZW5kICYmIGlzX3N1cnJvZ2F0ZV9wYWlyKHcsICppbikpIHsKKyAgICAgICAgICAgIHV0ZjhfbGVuICs9IDQ7CisgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLyogc2tpcCBpZiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgaW52YWxpZCBzdXJyb2dhdGUgcGFpciAqLworICAgIH0KKyAgICByZXR1cm4gKGluID09IGVuZCAmJiB1dGY4X2xlbiA8IFNTSVpFX01BWCkgPyB1dGY4X2xlbiA6IC0xOworfQorCit2b2lkIHV0ZjE2X3RvX3V0ZjgoY29uc3QgY2hhcjE2X3QqIHNyYywgc2l6ZV90IHNyY19sZW4sIGNoYXIqIGRzdCwgc2l6ZV90IGRzdF9sZW4pCit7CisgICAgaWYgKHNyYyA9PSBudWxscHRyIHx8IHNyY19sZW4gPT0gMCB8fCBkc3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhcjE2X3QqIGluID0gc3JjOworICAgIGNvbnN0IGNoYXIxNl90KiBjb25zdCBpbl9lbmQgPSBzcmMgKyBzcmNfbGVuOworICAgIGNoYXIqIG91dCA9IGRzdDsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBvdXRfZW5kID0gZHN0ICsgZHN0X2xlbjsKKyAgICBjaGFyMTZfdCB3MjsKKworICAgIGF1dG8gZXJyX291dCA9IFsmb3V0LCAmb3V0X2VuZCwgJmRzdF9sZW5dKCkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG91dCA+PSBvdXRfZW5kLAorICAgICAgICAgICAgICAgICJ0YXJnZXQgdXRmOCBzdHJpbmcgc2l6ZSAlenUgdG9vIHNob3J0IiwgZHN0X2xlbik7CisgICAgfTsKKworICAgIHdoaWxlIChpbiA8IGluX2VuZCkgeworICAgICAgICBjaGFyMTZfdCB3ID0gKmluKys7CisgICAgICAgIGlmICh3IDwgMHgwMDgwKSBbW2xpa2VseV1dIHsKKyAgICAgICAgICAgIGlmIChvdXQgKyAxID4gb3V0X2VuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyX291dCgpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIpKHcgJiAweGZmKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh3IDwgMHgwODAwKSBbW2xpa2VseV1dIHsKKyAgICAgICAgICAgIGlmIChvdXQgKyAyID4gb3V0X2VuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyX291dCgpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIpKDB4YzAgfCAoKHcgPj4gNikgJiAweDFmKSk7CisgICAgICAgICAgICAqb3V0KysgPSAoY2hhcikoMHg4MCB8ICgodyA+PiAwKSAmIDB4M2YpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghaXNfYW55X3N1cnJvZ2F0ZSh3KSkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICBpZiAob3V0ICsgMyA+IG91dF9lbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9vdXQoKTsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyKSgweGUwIHwgKCh3ID4+IDEyKSAmIDB4ZikpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIpKDB4ODAgfCAoKHcgPj4gNikgJiAweDNmKSk7CisgICAgICAgICAgICAqb3V0KysgPSAoY2hhcikoMHg4MCB8ICgodyA+PiAwKSAmIDB4M2YpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8qIHN1cnJvZ2F0ZSBwYWlyICovCisgICAgICAgIGlmIChpbiA8IGluX2VuZCAmJiAodzIgPSAqaW4sIGlzX3N1cnJvZ2F0ZV9wYWlyKHcsIHcyKSkpIHsKKyAgICAgICAgICAgIGlmIChvdXQgKyA0ID4gb3V0X2VuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyX291dCgpOworICAgICAgICAgICAgY2hhcjMyX3QgZHcgPSAoY2hhcjMyX3QpKDB4MTAwMDAgKyAoKHcgLSAweGQ4MDApIDw8IDEwKSArICh3MiAtIDB4ZGMwMCkpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIpKDB4ZjAgfCAoKGR3ID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyKSgweDgwIHwgKChkdyA+PiAxMikgJiAweDNmKSk7CisgICAgICAgICAgICAqb3V0KysgPSAoY2hhcikoMHg4MCB8ICgoZHcgPj4gNikgICYgMHgzZikpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIpKDB4ODAgfCAoKGR3ID4+IDApICAmIDB4M2YpKTsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgIH0KKyAgICAgICAgLyogV2UgcmVhY2ggaGVyZSBpbiB0d28gY2FzZXM6CisgICAgICAgICAqICAxKSAoaW4gPT0gaW5fZW5kKSwgd2hpY2ggbWVhbnMgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcKKyAgICAgICAgICogIDIpICh3MiAmIDB4ZmMwMCkgIT0gMHhkYzAwLCB3aGljaCBtZWFucyBpbnZhbGlkIHN1cnJvZ2F0ZSBwYWlyCisgICAgICAgICAqIEluIGVpdGhlciBjYXNlLCB3ZSBpbnRlbnRpb25hbGx5IGRvIG5vdGhpbmcgYW5kIHNraXAKKyAgICAgICAgICovCisgICAgfQorICAgICpvdXQgPSAnXDAnOworICAgIHJldHVybjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVURi04CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY2hhcjMyX3QgdXRmOF80Yl90b191dGYzMih1aW50OF90IGMxLCB1aW50OF90IGMyLCB1aW50OF90IGMzLCB1aW50OF90IGM0KSB7CisgICAgcmV0dXJuICgoYzEgJiAweDA3KSA8PCAxOCkgfCAoKGMyICYgMHgzZikgPDwgMTIpIHwgKChjMyAmIDB4M2YpIDw8IDYpIHwgKGM0ICYgMHgzZik7Cit9CisKKy8vIFRPRE86IGN1cnJlbnQgYmVoYXZpb3Igb2YgY29udmVydGluZyBVVEY4IHRvIFVURi0xNiBoYXMgYSBmZXcgaXNzdWVzIGJlbG93CisvLworLy8gMS4gaW52YWxpZCB0cmFpbGluZyBieXRlcyAoaS5lLiBub3QgYicxMHh4eHh4eCkgYXJlIHRyZWF0ZWQgYXMgdmFsaWQgdHJhaWxpbmcKKy8vICAgIGJ5dGVzIGFuZCBmb2xsb3dzIG5vcm1hbCBjb252ZXJzaW9uIHJ1bGVzCisvLyAyLiBpbnZhbGlkIGxlYWRpbmcgYnl0ZSAoYicxMHh4eHh4eCkgaXMgdHJlYXRlZCBhcyBhIHZhbGlkIHNpbmdsZSBVVEYtOCBieXRlCisvLyAzLiBpbnZhbGlkIGxlYWRpbmcgYnl0ZSAoYicxMTExMXh4eCkgaXMgdHJlYXRlZCBhcyBhIHZhbGlkIGxlYWRpbmcgYnl0ZQorLy8gICAgKHNhbWUgYXMgYicxMTExMHh4eCkgZm9yIGEgNC1ieXRlIFVURi04IHNlcXVlbmNlCisvLyA0LiBhbiBpbnZhbGlkIDQtYnl0ZSBVVEYtOCBzZXF1ZW5jZSB0aGF0IHRyYW5zbGF0ZXMgdG8gYSBjb2RlcG9pbnQgPCBVKzEwMDAwCisvLyAgICB3aWxsIGJlIGNvbnZlcnRlZCBhcyBhIHZhbGlkIFVURi0xNiBjaGFyYWN0ZXIKKy8vCisvLyBXZSBrZWVwIHRoZSBjdXJyZW50IGJlaGF2aW9yIGFzIGlzIGJ1dCB3aXRoIHdhcm5pbmdzIGxvZ2dlZCwgc28gYXMgbm90IHRvCisvLyBicmVhayBjb21wYXRpYmlsaXR5LiAgSG93ZXZlciwgdGhpcyBuZWVkcyB0byBiZSBhZGRyZXNzZWQgbGF0ZXIuCisKK3NzaXplX3QgdXRmOF90b191dGYxNl9sZW5ndGgoY29uc3QgdWludDhfdCogdThzdHIsIHNpemVfdCB1OGxlbiwgYm9vbCBvdmVycmVhZElzRmF0YWwpCit7CisgICAgaWYgKHU4c3RyID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluX2VuZCA9IHU4c3RyICsgdThsZW47CisgICAgY29uc3QgdWludDhfdCogaW4gPSB1OHN0cjsKKyAgICBzaXplX3QgdXRmMTZfbGVuID0gMDsKKworICAgIHdoaWxlIChpbiA8IGluX2VuZCkgeworICAgICAgICB1aW50OF90IGMgPSAqaW47CisgICAgICAgIHV0ZjE2X2xlbisrOworICAgICAgICBpZiAoKGMgJiAweDgwKSA9PSAwKSBbW2xpa2VseV1dIHsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA8IDB4YzApIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICBBTE9HVygiSW52YWxpZCBVVEYtOCBsZWFkaW5nIGJ5dGU6IDB4JTAyeCIsIGMpOworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjIDwgMHhlMCkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPCAweGYwKSBbW2xpa2VseV1dIHsKKyAgICAgICAgICAgIGluICs9IDM7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYzIsIGMzLCBjNDsKKyAgICAgICAgICAgIGlmIChjID49IDB4ZjgpIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkludmFsaWQgVVRGLTggbGVhZGluZyBieXRlOiAweCUwMngiLCBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyID0gaW5bMV07IGMzID0gaW5bMl07IGM0ID0gaW5bM107CisgICAgICAgICAgICBpZiAodXRmOF80Yl90b191dGYzMihjLCBjMiwgYzMsIGM0KSA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICAgICAgdXRmMTZfbGVuKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbiArPSA0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluID09IGluX2VuZCkgeworICAgICAgICByZXR1cm4gdXRmMTZfbGVuIDwgU1NJWkVfTUFYID8gdXRmMTZfbGVuIDogLTE7CisgICAgfQorICAgIGlmIChvdmVycmVhZElzRmF0YWwpCisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkF0dGVtcHQgdG8gb3ZlcnJlYWQgY29tcHV0aW5nIGxlbmd0aCBvZiB1dGY4IHN0cmluZyIpOworICAgIHJldHVybiAtMTsKK30KKworY2hhcjE2X3QqIHV0ZjhfdG9fdXRmMTYoY29uc3QgdWludDhfdCogdThzdHIsIHNpemVfdCB1OGxlbiwgY2hhcjE2X3QqIHUxNnN0ciwgc2l6ZV90IHUxNmxlbikgeworICAgIC8vIEEgdmFsdWUgPiBTU0laRV9NQVggaXMgcHJvYmFibHkgYSBuZWdhdGl2ZSB2YWx1ZSByZXR1cm5lZCBhcyBhbiBlcnJvciBhbmQgY2FzdGVkLgorICAgIExPR19BTFdBWVNfRkFUQUxfSUYodTE2bGVuID09IDAgfHwgdTE2bGVuID4gU1NJWkVfTUFYLCAidTE2bGVuIGlzICV6dSIsIHUxNmxlbik7CisgICAgY2hhcjE2X3QqIGVuZCA9IHV0ZjhfdG9fdXRmMTZfbm9fbnVsbF90ZXJtaW5hdG9yKHU4c3RyLCB1OGxlbiwgdTE2c3RyLCB1MTZsZW4gLSAxKTsKKyAgICAqZW5kID0gMDsKKyAgICByZXR1cm4gZW5kOworfQorCitjaGFyMTZfdCogdXRmOF90b191dGYxNl9ub19udWxsX3Rlcm1pbmF0b3IoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNyY0xlbiwgY2hhcjE2X3QqIGRzdCwgc2l6ZV90IGRzdExlbikgeworICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNMZW4gPT0gMCB8fCBkc3RMZW4gPT0gMCkgeworICAgICAgICByZXR1cm4gZHN0OworICAgIH0KKyAgICAvLyBBIHZhbHVlID4gU1NJWkVfTUFYIGlzIHByb2JhYmx5IGEgbmVnYXRpdmUgdmFsdWUgcmV0dXJuZWQgYXMgYW4gZXJyb3IgYW5kIGNhc3RlZC4KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRzdExlbiA+IFNTSVpFX01BWCwgImRzdExlbiBpcyAlenUiLCBkc3RMZW4pOworCisgICAgY29uc3QgdWludDhfdCogY29uc3QgaW5fZW5kID0gc3JjICsgc3JjTGVuOworICAgIGNvbnN0IHVpbnQ4X3QqIGluID0gc3JjOworICAgIGNvbnN0IGNoYXIxNl90KiBjb25zdCBvdXRfZW5kID0gZHN0ICsgZHN0TGVuOworICAgIGNoYXIxNl90KiBvdXQgPSBkc3Q7CisgICAgdWludDhfdCBjLCBjMiwgYzMsIGM0OworICAgIGNoYXIzMl90IHc7CisKKyAgICBhdXRvIGVycl9pbiA9IFsmYywgJm91dF0oKSB7CisgICAgICAgIEFMT0dXKCJVbmVuZGVkIFVURi04IGJ5dGU6IDB4JTAyeCIsIGMpOworICAgICAgICByZXR1cm4gb3V0OworICAgIH07CisKKyAgICB3aGlsZSAoaW4gPCBpbl9lbmQgJiYgb3V0IDwgb3V0X2VuZCkgeworICAgICAgICBjID0gKmluKys7CisgICAgICAgIGlmICgoYyAmIDB4ODApID09IDApIFtbbGlrZWx5XV0geworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIxNl90KShjKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjIDwgMHhjMCkgW1t1bmxpa2VseV1dIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZTogMHglMDJ4IiwgYyk7CisgICAgICAgICAgICAqb3V0KysgPSAoY2hhcjE2X3QpKGMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPCAweGUwKSBbW2xpa2VseV1dIHsKKyAgICAgICAgICAgIGlmIChpbiArIDEgPiBpbl9lbmQpIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9pbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYzIgPSAqaW4rKzsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyMTZfdCkoKChjICYgMHgxZikgPDwgNikgfCAoYzIgJiAweDNmKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA8IDB4ZjApIFtbbGlrZWx5XV0geworICAgICAgICAgICAgaWYgKGluICsgMiA+IGluX2VuZCkgW1t1bmxpa2VseV1dIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyX2luKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMiA9ICppbisrOyBjMyA9ICppbisrOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIxNl90KSgoKGMgJiAweDBmKSA8PCAxMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMyICYgMHgzZikgPDwgNikgfCAoYzMgJiAweDNmKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbiArIDMgPiBpbl9lbmQpIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9pbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPj0gMHhmOCkgW1t1bmxpa2VseV1dIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW52YWxpZCBVVEYtOCBsZWFkaW5nIGJ5dGU6IDB4JTAyeCIsIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTXVsdGlwbGUgVVRGMTYgY2hhcmFjdGVycyB3aXRoIHN1cnJvZ2F0ZXMKKyAgICAgICAgICAgIGMyID0gKmluKys7IGMzID0gKmluKys7IGM0ID0gKmluKys7CisgICAgICAgICAgICB3ID0gdXRmOF80Yl90b191dGYzMihjLCBjMiwgYzMsIGM0KTsKKyAgICAgICAgICAgIGlmICh3IDwgMHgxMDAwMCkgW1t1bmxpa2VseV1dIHsKKyAgICAgICAgICAgICAgICAqb3V0KysgPSAoY2hhcjE2X3QpKHcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0ICsgMiA+IG91dF9lbmQpIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9vb3BzLi4uLiBub3QgZW5vdWdoIHJvb20gZm9yIHRoaXMgc3Vycm9nYXRlIHBhaXIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpvdXQrKyA9IChjaGFyMTZfdCkoKCh3IC0gMHgxMDAwMCkgPj4gMTApICsgMHhkODAwKTsKKyAgICAgICAgICAgICAgICAqb3V0KysgPSAoY2hhcjE2X3QpKCgodyAtIDB4MTAwMDApICYgMHgzZmYpICsgMHhkYzAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXQ7Cit9CisKK30KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1VuaWNvZGVfdGVzdC5jcHAgYi9saWJ1dGlscy9iaW5kZXIvVW5pY29kZV90ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvVW5pY29kZV90ZXN0LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1VuaWNvZGVfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1ZlY3RvckltcGwuY3BwIGIvbGlidXRpbHMvYmluZGVyL1ZlY3RvckltcGwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9WZWN0b3JJbXBsLmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1ZlY3RvckltcGwuY3BwCmRpZmYgLS1naXQgYS9saWJ1dGlscy9WZWN0b3JfYmVuY2htYXJrLmNwcCBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JfYmVuY2htYXJrLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvVmVjdG9yX2JlbmNobWFyay5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9WZWN0b3JfYmVuY2htYXJrLmNwcApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvYmluZGVyL1ZlY3Rvcl9mdXp6LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JfZnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlZjQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JfZnV6ei5jcHAKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBNQVhfVkVDX1NJWkUgPSAxMDA7CitzdGF0aWMgY29uc3RleHByIGJvb2wga0xvZyA9IGZhbHNlOworCitzdHJ1Y3QgTm9uVHJpdmlhbERlc3RydWN0b3IgeworICAgIE5vblRyaXZpYWxEZXN0cnVjdG9yKCkgOiBtSW5pdCgxKSB7fQorICAgIH5Ob25Ucml2aWFsRGVzdHJ1Y3RvcigpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtSW5pdCAhPSAxLCAibUluaXQgc2hvdWxkIGJlIDEsIGJ1dCBpdCdzOiAlZCIsIG1Jbml0KTsKKyAgICAgICAgbUluaXQtLTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtSW5pdCAhPSAwLCAibUluaXQgc2hvdWxkIGJlIDAsIGJ1dCBpdCdzOiAlZCIsIG1Jbml0KTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1aW50OF90IG1Jbml0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVmVjdG9yRnV6emVyRGF0YSB7CisgICAgVmVjdG9yPFQ+IHZlY3RvcjsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoRnV6emVkRGF0YVByb3ZpZGVyJiwgVmVjdG9yPFQ+Jik+PiBmdW5jcyA9IHsKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yPSBWZWN0b3I8VFlQRT4sIHN0aWxsIG5lZWRzIGZvciBTb3J0ZWRWZWN0b3IKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koIm9wZXJhdG9yPSIpOworICAgICAgICAgICAgICAgIHZlY3RvciA9IHRlc3RWZWN0b3IocHJvdmlkZXIpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiY2xlYXIiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuY2xlYXIoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koInNpemUiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3Iuc2l6ZSgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiaXNFbXB0eSIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5pc0VtcHR5KCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJjYXBhY2l0eSIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5jYXBhY2l0eSgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIHNpemVfdCB2ZWN0b3JTaXplID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9WRUNfU0laRSk7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJzZXRDYXBhY2l0eSIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5zZXRDYXBhY2l0eSh2ZWN0b3JTaXplKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgdmVjdG9yU2l6ZSA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfVkVDX1NJWkUpOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgicmVzaXplIik7CisgICAgICAgICAgICAgICAgdmVjdG9yLnJlc2l6ZSh2ZWN0b3JTaXplKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImFycmF5Iik7CisgICAgICAgICAgICAgICAgdmVjdG9yLmFycmF5KCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJlZGl0QXJyYXkiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuZWRpdEFycmF5KCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgaWYgKHZlY3Rvci5zaXplKCkgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgICAgIHNpemVfdCBpZHggPSBwcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgdmVjdG9yLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgib3BlcmF0b3JbXSIpOworICAgICAgICAgICAgICAgIHZlY3RvcltpZHhdOyAgLy8gcmV0dXJucyBhIGNvbnN0IHZhbHVlIGZvciBWZWN0b3IKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBpZiAodmVjdG9yLnNpemUoKSA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAgICAgc2l6ZV90IGlkeCA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCB2ZWN0b3Iuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJpdGVtQXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuaXRlbUF0KGlkeCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKHZlY3Rvci5zaXplKCkgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgidG9wIik7CisgICAgICAgICAgICAgICAgdmVjdG9yLnRvcCgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIGlmICh2ZWN0b3Iuc2l6ZSgpID09IDApIHJldHVybjsKKyAgICAgICAgICAgICAgICBzaXplX3QgaWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHZlY3Rvci5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImVkaXRJdGVtQXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuZWRpdEl0ZW1BdChpZHgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIGlmICh2ZWN0b3Iuc2l6ZSgpID09IDApIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImVkaXRUb3AiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuZWRpdFRvcCgpID0gVHt9OworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBWZWN0b3IgdmVjMiA9IHRlc3RWZWN0b3IocHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGlmICh2ZWMyLnNpemUoKSA9PSAwKSByZXR1cm47ICAvLyBUT0RPOiBtYXliZSB3ZSBzaG91bGQgc3VwcG9ydCB0aGlzPworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiaW5zZXJ0VmVjdG9yQXQgJWQgb2Ygc2l6ZSAlenUiLCBpZHgsIHZlYzIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuaW5zZXJ0VmVjdG9yQXQodmVjMiwgaWR4KTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImFwcGVuZFZlY3RvciIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5hcHBlbmRWZWN0b3IodGVzdFZlY3Rvcihwcm92aWRlcikpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8vIFRPRE86IGluc2VydEFycmF5QXQKKyAgICAgICAgICAgIC8vIFRPRE86IGFwcGVuZEFycmF5CisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGlkeCA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdmVjdG9yLnNpemUoKSk7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1JdGVtcyA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMSwgMTAwKTsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImluc2VydEF0Iik7CisgICAgICAgICAgICAgICAgdmVjdG9yLmluc2VydEF0KGlkeCwgbnVtSXRlbXMpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bUl0ZW1zID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigxLCAxMDApOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiaW5zZXJ0QXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuaW5zZXJ0QXQoVHt9LCBpZHgsIG51bUl0ZW1zKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAodmVjdG9yLnNpemUoKSA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJwb3AiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IucG9wKCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJwdXNoIik7CisgICAgICAgICAgICAgICAgdmVjdG9yLnB1c2goKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImFkZCIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5hZGQoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImFkZCIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5hZGQoVHt9KTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGlkeCA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdmVjdG9yLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgicmVwbGFjZUF0Iik7CisgICAgICAgICAgICAgICAgdmVjdG9yLnJlcGxhY2VBdChpZHgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB2ZWN0b3Iuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJyZXBsYWNlQXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IucmVwbGFjZUF0KFR7fSwgaWR4KTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBpZiAodmVjdG9yLnNpemUoKSA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAgICAgdWludDhfdCBpZHggPSBwcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIHZlY3Rvci5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koInJlbW90ZUl0ZW1zQXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IucmVtb3ZlSXRlbXNBdChpZHgpOyAgLy8gVE9ETzogZGlmZmVyZW50IGNvdW50CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgLy8gcmVtb3ZlQXQgaXMgYWxpYXMgZm9yIHJlbW92ZUl0ZW1zQXQKKyAgICAgICAgICAgIC8vIFRPRE86IHNvcnQKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiZ2V0SXRlbVNpemUiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuZ2V0SXRlbVNpemUoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAvLyBUT0RPOiBpdGVyYXRvcnMKKyAgICB9OworCisgICAgVmVjdG9yPFQ+IHRlc3RWZWN0b3IoRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlcikgeworICAgICAgICBWZWN0b3I8VD4gdmVjOworICAgICAgICBzaXplX3QgdmVjdG9yU2l6ZSA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfVkVDX1NJWkUpOworICAgICAgICByZXR1cm4gdmVjOworICAgIH0KKworICAgIHZvaWQgZnV6eihGdXp6ZWREYXRhUHJvdmlkZXImJiBwcm92aWRlcikgeworICAgICAgICB3aGlsZSAocHJvdmlkZXIucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBmdW5jSWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGZ1bmNzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgZnVuY3NbZnVuY0lkeF0ocHJvdmlkZXIsIHZlY3Rvcik7CisgICAgICAgIH0KKyAgICB9Cit9OworCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIHByb3ZpZGVyKGRhdGEsIHNpemUpOworCisgICAgcHJvdmlkZXIuUGlja1ZhbHVlSW5BcnJheTxzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+KHsKKyAgICAgICAgICAgIFsmXSgpIHsgVmVjdG9yRnV6emVyRGF0YTx1aW50OF90PigpLmZ1enooc3RkOjptb3ZlKHByb3ZpZGVyKSk7IH0sCisgICAgICAgICAgICBbJl0oKSB7IFZlY3RvckZ1enplckRhdGE8aW50MzJfdD4oKS5mdXp6KHN0ZDo6bW92ZShwcm92aWRlcikpOyB9LAorICAgICAgICAgICAgWyZdKCkgeyBWZWN0b3JGdXp6ZXJEYXRhPE5vblRyaXZpYWxEZXN0cnVjdG9yPigpLmZ1enooc3RkOjptb3ZlKHByb3ZpZGVyKSk7IH0sCisgICAgfSkoKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvVmVjdG9yX3Rlc3QuY3BwIGIvbGlidXRpbHMvYmluZGVyL1ZlY3Rvcl90ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvVmVjdG9yX3Rlc3QuY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvVmVjdG9yX3Rlc3QuY3BwCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCBiL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaApzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKaW5kZXggM2VmNTZhMy4uYzcxMzU3NiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oCisrKyBiL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKQEAgLTI0LDYgKzI0LDExIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+CiAKKyNpZiBfX2hhc19pbmNsdWRlKDxzdHJpbmdfdmlldz4pCisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisjZGVmaW5lIEhBU19TVFJJTkdfVklFVworI2VuZGlmCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01MywxMiArNTgsMTMgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+U3RyaW5nMTYoKTsKIAotICAgIGlubGluZSAgY29uc3QgY2hhcjE2X3QqICAgICBzdHJpbmcoKSBjb25zdDsKKyAgICBpbmxpbmUgIGNvbnN0IGNoYXIxNl90KiAgICAgY19zdHIoKSBjb25zdDsKIAotcHJpdmF0ZToKLSAgICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nICAgc3RkX3N0cmluZyhjb25zdCBTdHJpbmcxNiYgc3RyKTsKLXB1YmxpYzoKICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZSgpIGNvbnN0OworICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0OworCisgICAgaW5saW5lICBzaXplX3QgICAgICAgICAgICAgIGxlbmd0aCgpIGNvbnN0OworCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRvKGNvbnN0IFN0cmluZzE2JiBvdGhlcik7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlcik7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlciwgc2l6ZV90IGxlbik7CkBAIC04Niw2ICs5Miw3IEBACiAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGgoY29uc3QgY2hhcjE2X3QqIHByZWZpeCkgY29uc3Q7CiAKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgY29udGFpbnMoY29uc3QgY2hhcjE2X3QqIGNocnMpIGNvbnN0OworICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBjb250YWlucyhjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0OwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlcGxhY2VBbGwoY2hhcjE2X3QgcmVwbGFjZVRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcjE2X3Qgd2l0aFRoaXMpOwpAQCAtMTA4LDYgKzExNSwxMiBAQAogCiAgICAgaW5saW5lICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGNvbnN0IGNoYXIxNl90KigpIGNvbnN0OwogCisjaWZkZWYgSEFTX1NUUklOR19WSUVXCisgICAgLy8gSW1wbGljaXQgY2FzdCB0byBzdGQ6OnUxNnN0cmluZyBpcyBub3QgaW1wbGVtZW50ZWQgb24gcHVycG9zZSAtIHUxNnN0cmluZ192aWV3IGlzIG11Y2gKKyAgICAvLyBsaWdodGVyIGFuZCBpZiBvbmUgbmVlZHMsIHRoZXkgY2FuIHN0aWxsIGNyZWF0ZSB1MTZzdHJpbmcgZnJvbSB1MTZzdHJpbmdfdmlldy4KKyAgICBpbmxpbmUgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3Igc3RkOjp1MTZzdHJpbmdfdmlldygpIGNvbnN0OworI2VuZGlmCisKICAgICAvLyBTdGF0aWMgYW5kIG5vbi1zdGF0aWMgU3RyaW5nMTYgYmVoYXZlIHRoZSBzYW1lIGZvciB0aGUgdXNlcnMsIHNvCiAgICAgLy8gdGhpcyBtZXRob2QgaXNuJ3Qgb2YgbXVjaCB1c2UgZm9yIHRoZSB1c2Vycy4gSXQgaXMgcHVibGljIGZvciB0ZXN0aW5nLgogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBpc1N0YXRpY1N0cmluZygpIGNvbnN0OwpAQCAtMTc0LDYgKzE4NywxNCBAQAogCiAgICAgdGVtcGxhdGUgPHNpemVfdCBOPgogICAgIGV4cGxpY2l0IGNvbnN0ZXhwciBTdHJpbmcxNihjb25zdCBTdGF0aWNEYXRhPE4+JiBzKSA6IG1TdHJpbmcocy5kYXRhKSB7fQorCisvLyBUaGVzZSBzeW1ib2xzIGFyZSBmb3IgcG90ZW50aWFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBwcmVidWlsdHMuIFRvIGJlIHJlbW92ZWQuCisjaWZkZWYgRU5BQkxFX1NUUklORzE2X09CU09MRVRFX01FVEhPRFMKK3B1YmxpYzoKKyNlbHNlCitwcml2YXRlOgorI2VuZGlmCisgICAgaW5saW5lICBjb25zdCBjaGFyMTZfdCogICAgIHN0cmluZygpIGNvbnN0OwogfTsKIAogLy8gU3RyaW5nMTYgY2FuIGJlIHRyaXZpYWxseSBtb3ZlZCB1c2luZyBtZW1jcHkoKSBiZWNhdXNlIG1vdmluZyBkb2VzIG5vdApAQCAtMjM0LDE0ICsyNTUsMjkgQEAKICAgICByZXR1cm4gY29tcGFyZV90eXBlKGxocywgcmhzKSA8IDA7CiB9CiAKK2lubGluZSBjb25zdCBjaGFyMTZfdCogU3RyaW5nMTY6OmNfc3RyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0cmluZzsKK30KKwogaW5saW5lIGNvbnN0IGNoYXIxNl90KiBTdHJpbmcxNjo6c3RyaW5nKCkgY29uc3QKIHsKICAgICByZXR1cm4gbVN0cmluZzsKIH0KIAotaW5saW5lIHN0ZDo6c3RyaW5nIFN0cmluZzE2OjpzdGRfc3RyaW5nKGNvbnN0IFN0cmluZzE2JiBzdHIpCitpbmxpbmUgYm9vbCBTdHJpbmcxNjo6ZW1wdHkoKSBjb25zdAogewotICAgIHJldHVybiBzdGQ6OnN0cmluZyhTdHJpbmc4KHN0cikuc3RyaW5nKCkpOworICAgIHJldHVybiBsZW5ndGgoKSA9PSAwOworfQorCitpbmxpbmUgc2l6ZV90IFN0cmluZzE2OjpsZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBzaXplKCk7Cit9CisKK2lubGluZSBib29sIFN0cmluZzE2Ojpjb250YWlucyhjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyLmNfc3RyKCkpOwogfQogCiBpbmxpbmUgU3RyaW5nMTYmIFN0cmluZzE2OjpvcGVyYXRvcj0oY29uc3QgU3RyaW5nMTYmIG90aGVyKQpAQCAtMzMzLDggKzM2OSwxNSBAQAogICAgIHJldHVybiBtU3RyaW5nOwogfQogCitpbmxpbmUgU3RyaW5nMTY6Om9wZXJhdG9yIHN0ZDo6dTE2c3RyaW5nX3ZpZXcoKSBjb25zdAoreworICAgIHJldHVybiB7bVN0cmluZywgbGVuZ3RoKCl9OworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorI3VuZGVmIEhBU19TVFJJTkdfVklFVworCiAjZW5kaWYgLy8gQU5EUk9JRF9TVFJJTkcxNl9ICmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCBiL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaApzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCmluZGV4IDhiMmRjZjkuLjZkMjUwNzIgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCisrKyBiL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBBTkRST0lEX1NUUklORzhfSAogCiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVW5pY29kZS5oPgpAQCAtMjcsNiArMjYsMTYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gZm9yIHN0cmNtcAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogCisjaWYgX19oYXNfaW5jbHVkZSg8c3RyaW5nPikKKyNpbmNsdWRlIDxzdHJpbmc+CisjZGVmaW5lIEhBU19TVFJJTkcKKyNlbmRpZgorCisjaWYgX19oYXNfaW5jbHVkZSg8c3RyaW5nX3ZpZXc+KQorI2luY2x1ZGUgPHN0cmluZ192aWV3PgorI2RlZmluZSBIQVNfU1RSSU5HX1ZJRVcKKyNlbmRpZgorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTIsMjEgKzYxLDE0IEBACiAgICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY29uc3QgY2hhcjMyX3QqIG8sIHNpemVfdCBudW1DaGFycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5TdHJpbmc4KCk7CiAKLSAgICBzdGF0aWMgaW5saW5lIGNvbnN0IFN0cmluZzggZW1wdHkoKTsKLQogICAgIHN0YXRpYyBTdHJpbmc4ICAgICAgICAgICAgICBmb3JtYXQoY29uc3QgY2hhciogZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwogICAgIHN0YXRpYyBTdHJpbmc4ICAgICAgICAgICAgICBmb3JtYXRWKGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKTsKIAogICAgIGlubGluZSAgY29uc3QgY2hhciogICAgICAgICBjX3N0cigpIGNvbnN0OwotICAgIGlubGluZSAgY29uc3QgY2hhciogICAgICAgICBzdHJpbmcoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nICAgc3RkX3N0cmluZyhjb25zdCBTdHJpbmc4JiBzdHIpOwotcHVibGljOgogCiAgICAgaW5saW5lICBzaXplX3QgICAgICAgICAgICAgIHNpemUoKSBjb25zdDsKICAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICAgICAgYnl0ZXMoKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0OworICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0OwogCiAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIGxlbmd0aCgpIGNvbnN0OwogCkBAIC0xMTQsNiArMTE2LDEwIEBACiAKICAgICBpbmxpbmUgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhciooKSBjb25zdDsKIAorI2lmZGVmIEhBU19TVFJJTkdfVklFVworICAgIGlubGluZSBleHBsaWNpdCAgICAgICAgICAgICBvcGVyYXRvciBzdGQ6OnN0cmluZ192aWV3KCkgY29uc3Q7CisjZW5kaWYKKwogICAgICAgICAgICAgY2hhciogICAgICAgICAgICAgICBsb2NrQnVmZmVyKHNpemVfdCBzaXplKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgdW5sb2NrQnVmZmVyKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHVubG9ja0J1ZmZlcihzaXplX3Qgc2l6ZSk7CkBAIC0xMjEsMTAxICsxMjcsMzUgQEAKICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgb2Ygb3RoZXIgaW4gdGhpcyBhdCBvciBhZnRlcgogICAgICAgICAgICAgLy8gc3RhcnQsIG9yIC0xIGlmIG5vdCBmb3VuZAogICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICBmaW5kKGNvbnN0IGNoYXIqIG90aGVyLCBzaXplX3Qgc3RhcnQgPSAwKSBjb25zdDsKKyAgICBpbmxpbmUgIHNzaXplX3QgICAgICAgICAgICAgZmluZChjb25zdCBTdHJpbmc4JiBvdGhlciwgc2l6ZV90IHN0YXJ0ID0gMCkgY29uc3Q7CiAKICAgICAgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHRoaXMgc3RyaW5nIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nCiAgICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIGNvbnRhaW5zKGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKKyAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgY29udGFpbnMoY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0OwogCiAgICAgICAgICAgICAvLyByZW1vdmVzIGFsbCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nCiAgICAgICAgICAgICAvLyByZXR1cm5zIHRydWUgaWYgYW55IHdlcmUgZm91bmQgYW5kIHJlbW92ZWQKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgcmVtb3ZlQWxsKGNvbnN0IGNoYXIqIG90aGVyKTsKKyAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgcmVtb3ZlQWxsKGNvbnN0IFN0cmluZzgmIG90aGVyKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICB0b0xvd2VyKCk7CiAKLQotICAgIC8qCi0gICAgICogVGhlc2UgbWV0aG9kcyBvcGVyYXRlIG9uIHRoZSBzdHJpbmcgYXMgaWYgaXQgd2VyZSBhIHBhdGggbmFtZS4KLSAgICAgKi8KLQotICAgIC8qCi0gICAgICogR2V0IGp1c3QgdGhlIGZpbGVuYW1lIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqICIvdG1wL2Zvby9iYXIuYyIgLS0+ICJiYXIuYyIKLSAgICAgKi8KLSAgICBTdHJpbmc4IGdldFBhdGhMZWFmKHZvaWQpIGNvbnN0OwotCi0gICAgLyoKLSAgICAgKiBSZW1vdmUgdGhlIGxhc3QgKGZpbGUgbmFtZSkgY29tcG9uZW50LCBsZWF2aW5nIGp1c3QgdGhlIGRpcmVjdG9yeQotICAgICAqIG5hbWUuCi0gICAgICoKLSAgICAgKiAiL3RtcC9mb28vYmFyLmMiIC0tPiAiL3RtcC9mb28iCi0gICAgICogIi90bXAiIC0tPiAiIiAvLyA/Pz8/PyBzaG91bGRuJ3QgdGhpcyBiZSAiLyIgPz8/PyBYWFgKLSAgICAgKiAiYmFyLmMiIC0tPiAiIgotICAgICAqLwotICAgIFN0cmluZzggZ2V0UGF0aERpcih2b2lkKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogUmV0cmlldmUgdGhlIGZyb250IChyb290IGRpcikgY29tcG9uZW50LiAgT3B0aW9uYWxseSBhbHNvIHJldHVybiB0aGUKLSAgICAgKiByZW1haW5pbmcgY29tcG9uZW50cy4KLSAgICAgKgotICAgICAqICIvdG1wL2Zvby9iYXIuYyIgLS0+ICJ0bXAiIChyZW1haW4gPSAiZm9vL2Jhci5jIikKLSAgICAgKiAiL3RtcCIgLS0+ICJ0bXAiIChyZW1haW4gPSAiIikKLSAgICAgKiAiYmFyLmMiIC0tPiAiYmFyLmMiIChyZW1haW4gPSAiIikKLSAgICAgKi8KLSAgICBTdHJpbmc4IHdhbGtQYXRoKFN0cmluZzgqIG91dFJlbWFpbnMgPSBudWxscHRyKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICBUaGlzIGlzIHRoZSBsYXN0ICcuJyBhbmQgYW55IG51bWJlcgotICAgICAqIG9mIGNoYXJhY3RlcnMgdGhhdCBmb2xsb3cgaXQuICBUaGUgJy4nIGlzIGluY2x1ZGVkIGluIGNhc2Ugd2UKLSAgICAgKiBkZWNpZGUgdG8gZXhwYW5kIG91ciBkZWZpbml0aW9uIG9mIHdoYXQgY29uc3RpdHV0ZXMgYW4gZXh0ZW5zaW9uLgotICAgICAqCi0gICAgICogIi90bXAvZm9vL2Jhci5jIiAtLT4gIi5jIgotICAgICAqICIvdG1wIiAtLT4gIiIKLSAgICAgKiAiL3RtcC9mb28uYmFyL2JheiIgLS0+ICIiCi0gICAgICogImZvby5qcGVnIiAtLT4gIi5qcGVnIgotICAgICAqICJmb28uIiAtLT4gIiIKLSAgICAgKi8KLSAgICBTdHJpbmc4IGdldFBhdGhFeHRlbnNpb24odm9pZCkgY29uc3Q7Ci0KLSAgICAvKgotICAgICAqIFJldHVybiB0aGUgcGF0aCB3aXRob3V0IHRoZSBleHRlbnNpb24uICBSdWxlcyBmb3Igd2hhdCBjb25zdGl0dXRlcwotICAgICAqIGFuIGV4dGVuc2lvbiBhcmUgZGVzY3JpYmVkIGluIHRoZSBjb21tZW50IGZvciBnZXRQYXRoRXh0ZW5zaW9uKCkuCi0gICAgICoKLSAgICAgKiAiL3RtcC9mb28vYmFyLmMiIC0tPiAiL3RtcC9mb28vYmFyIgotICAgICAqLwotICAgIFN0cmluZzggZ2V0QmFzZVBhdGgodm9pZCkgY29uc3Q7Ci0KLSAgICAvKgotICAgICAqIEFkZCBhIGNvbXBvbmVudCB0byB0aGUgcGF0aG5hbWUuICBXZSBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcwotICAgICAqIGV4YWN0bHkgb25lIHBhdGggc2VwYXJhdG9yIGJldHdlZW4gdGhlIG9sZCBwYXRoIGFuZCB0aGUgbmV3LgotICAgICAqIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIG5hbWUsIHdlIGp1c3QgY29weSB0aGUgbmV3IG5hbWUgaW4uCi0gICAgICoKLSAgICAgKiBJZiBsZWFmIGlzIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGggKGkuZS4gc3RhcnRzIHdpdGggJy8nLCBpdAotICAgICAqIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZSBiZWZvcmUuCi0gICAgICovCi0gICAgU3RyaW5nOCYgYXBwZW5kUGF0aChjb25zdCBjaGFyKiBsZWFmKTsKLSAgICBTdHJpbmc4JiBhcHBlbmRQYXRoKGNvbnN0IFN0cmluZzgmIGxlYWYpICB7IHJldHVybiBhcHBlbmRQYXRoKGxlYWYuc3RyaW5nKCkpOyB9Ci0KLSAgICAvKgotICAgICAqIExpa2UgYXBwZW5kUGF0aCgpLCBidXQgZG9lcyBub3QgYWZmZWN0IHRoaXMgc3RyaW5nLiAgUmV0dXJucyBhIG5ldyBvbmUgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBTdHJpbmc4IGFwcGVuZFBhdGhDb3B5KGNvbnN0IGNoYXIqIGxlYWYpIGNvbnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFN0cmluZzggcCgqdGhpcyk7IHAuYXBwZW5kUGF0aChsZWFmKTsgcmV0dXJuIHA7IH0KLSAgICBTdHJpbmc4IGFwcGVuZFBhdGhDb3B5KGNvbnN0IFN0cmluZzgmIGxlYWYpIGNvbnN0IHsgcmV0dXJuIGFwcGVuZFBhdGhDb3B5KGxlYWYuc3RyaW5nKCkpOyB9Ci0KLSAgICAvKgotICAgICAqIENvbnZlcnRzIGFsbCBzZXBhcmF0b3JzIGluIHRoaXMgc3RyaW5nIHRvIC8sIHRoZSBkZWZhdWx0IHBhdGggc2VwYXJhdG9yLgotICAgICAqCi0gICAgICogSWYgdGhlIGRlZmF1bHQgT1Mgc2VwYXJhdG9yIGlzIGJhY2tzbGFzaCwgdGhpcyBjb252ZXJ0cyBhbGwKLSAgICAgKiBiYWNrc2xhc2hlcyB0byBzbGFzaGVzLCBpbi1wbGFjZS4gT3RoZXJ3aXNlIGl0IGRvZXMgbm90aGluZy4KLSAgICAgKiBSZXR1cm5zIHNlbGYuCi0gICAgICovCi0gICAgU3RyaW5nOCYgY29udmVydFRvUmVzUGF0aCgpOwotCiBwcml2YXRlOgorICAgICAgICAgICAgU3RyaW5nOCBnZXRQYXRoRGlyKHZvaWQpIGNvbnN0OworICAgICAgICAgICAgU3RyaW5nOCBnZXRQYXRoRXh0ZW5zaW9uKHZvaWQpIGNvbnN0OworCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWxfYXBwZW5kKGNvbnN0IGNoYXIqIG90aGVyLCBzaXplX3QgbnVtQ2hhcnMpOwotICAgICAgICAgICAgY2hhciogICAgICAgICAgICAgICBmaW5kX2V4dGVuc2lvbih2b2lkKSBjb25zdDsKIAogICAgICAgICAgICAgY29uc3QgY2hhciogbVN0cmluZzsKKworLy8gVGhlc2Ugc3ltYm9scyBhcmUgZm9yIHBvdGVudGlhbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcHJlYnVpbHRzLiBUbyBiZSByZW1vdmVkLgorI2lmZGVmIEVOQUJMRV9TVFJJTkc4X09CU09MRVRFX01FVEhPRFMKK3B1YmxpYzoKKyNlbHNlCitwcml2YXRlOgorI2VuZGlmCisgICAgaW5saW5lICBjb25zdCBjaGFyKiAgICAgICAgIHN0cmluZygpIGNvbnN0OworICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3Q7CiB9OwogCiAvLyBTdHJpbmc4IGNhbiBiZSB0cml2aWFsbHkgbW92ZWQgdXNpbmcgbWVtY3B5KCkgYmVjYXVzZSBtb3ZpbmcgZG9lcyBub3QKQEAgLTI0MCwxMCArMTgwLDYgQEAKICAgICByZXR1cm4gY29tcGFyZV90eXBlKGxocywgcmhzKSA8IDA7CiB9CiAKLWlubGluZSBjb25zdCBTdHJpbmc4IFN0cmluZzg6OmVtcHR5KCkgewotICAgIHJldHVybiBTdHJpbmc4KCk7Ci19Ci0KIGlubGluZSBjb25zdCBjaGFyKiBTdHJpbmc4OjpjX3N0cigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1TdHJpbmc7CkBAIC0yNTMsMTYgKzE4OSwxNiBAQAogICAgIHJldHVybiBtU3RyaW5nOwogfQogCi1pbmxpbmUgc3RkOjpzdHJpbmcgU3RyaW5nODo6c3RkX3N0cmluZyhjb25zdCBTdHJpbmc4JiBzdHIpCi17Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHN0ci5zdHJpbmcoKSk7Ci19Ci0KIGlubGluZSBzaXplX3QgU3RyaW5nODo6c2l6ZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIGxlbmd0aCgpOwogfQogCitpbmxpbmUgYm9vbCBTdHJpbmc4OjplbXB0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxlbmd0aCgpID09IDA7Cit9CisKIGlubGluZSBib29sIFN0cmluZzg6OmlzRW1wdHkoKSBjb25zdAogewogICAgIHJldHVybiBsZW5ndGgoKSA9PSAwOwpAQCAtMjczLDExICsyMDksMjYgQEAKICAgICByZXR1cm4gbGVuZ3RoKCk7CiB9CiAKK2lubGluZSBzc2l6ZV90IFN0cmluZzg6OmZpbmQoY29uc3QgU3RyaW5nOCYgb3RoZXIsIHNpemVfdCBzdGFydCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmluZChvdGhlci5jX3N0cigpLCBzdGFydCk7Cit9CisKIGlubGluZSBib29sIFN0cmluZzg6OmNvbnRhaW5zKGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdAogewogICAgIHJldHVybiBmaW5kKG90aGVyKSA+PSAwOwogfQogCitpbmxpbmUgYm9vbCBTdHJpbmc4Ojpjb250YWlucyhjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gY29udGFpbnMob3RoZXIuY19zdHIoKSk7Cit9CisKK2lubGluZSBib29sIFN0cmluZzg6OnJlbW92ZUFsbChjb25zdCBTdHJpbmc4JiBvdGhlcikKK3sKKyAgICByZXR1cm4gcmVtb3ZlQWxsKG90aGVyLmNfc3RyKCkpOworfQorCiBpbmxpbmUgU3RyaW5nOCYgU3RyaW5nODo6b3BlcmF0b3I9KGNvbnN0IFN0cmluZzgmIG90aGVyKQogewogICAgIHNldFRvKG90aGVyKTsKQEAgLTM4Niw4ICszMzcsMTggQEAKICAgICByZXR1cm4gbVN0cmluZzsKIH0KIAorI2lmZGVmIEhBU19TVFJJTkdfVklFVworaW5saW5lIFN0cmluZzg6Om9wZXJhdG9yIHN0ZDo6c3RyaW5nX3ZpZXcoKSBjb25zdAoreworICAgIHJldHVybiB7bVN0cmluZywgbGVuZ3RoKCl9OworfQorI2VuZGlmCisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisjdW5kZWYgSEFTX1NUUklORworI3VuZGVmIEhBU19TVFJJTkdfVklFVworCiAjZW5kaWYgLy8gQU5EUk9JRF9TVFJJTkc4X0gKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgKaW5kZXggNTRhYTY5MS4uNDNjMDBjOSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgKKysrIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oCkBAIC05OCw2ICs5OCwxNSBAQAogCiAgICAgdm9pZCBjbGVhcigpOwogCisgICAgLy8gUmVsZWFzZXMgdGhlIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0IG1hbmFnZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiBzcCwgaWYgYW55LgorICAgIC8vIFRoZSBjYWxsZXIgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBpdC4gVGhhdCBpcywgdGhlIGNhbGxlciBtdXN0IGVuc3VyZQorICAgIC8vIGRlY1N0cm9uZygpIGlzIGNhbGxlZCB3aGVuIHRoZSBwb2ludGVyIGlzIG5vIGxvbmdlciB1c2VkLgorICAgIFtbbm9kaXNjYXJkXV0gaW5saW5lIFQqIHJlbGVhc2UoKSBub2V4Y2VwdCB7CisgICAgICAgIGF1dG8gcmV0ID0gbV9wdHI7CisgICAgICAgIG1fcHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKICAgICAvLyBBY2Nlc3NvcnMKIAogICAgIGlubGluZSBUJiAgICAgICBvcGVyYXRvciogKCkgY29uc3QgICAgIHsgcmV0dXJuICptX3B0cjsgfQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCBiL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCBiL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oCmluZGV4IGJlMzVlYTIuLmQ1ZGIzY2IgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKKysrIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKQEAgLTY3LDEzICs2NywxMCBAQAogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5WZWN0b3IoKTsKIAogICAgIC8qISBjb3B5IG9wZXJhdG9yICovCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8VFlQRT4mICAgICBvcGVyYXRvciA9IChjb25zdCBWZWN0b3I8VFlQRT4mIHJocykgY29uc3Q7Ci0gICAgICAgICAgICBWZWN0b3I8VFlQRT4mICAgICAgICAgICBvcGVyYXRvciA9IChjb25zdCBWZWN0b3I8VFlQRT4mIHJocyk7CisgICAgVmVjdG9yPFRZUEU+JiBvcGVyYXRvcj0oY29uc3QgVmVjdG9yPFRZUEU+JiByaHMpOyAgICAgICAgLy8gTk9MSU5UKGNlcnQtb29wNTQtY3BwKQorICAgIFZlY3RvcjxUWVBFPiYgb3BlcmF0b3I9KGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKTsgIC8vIE5PTElOVChjZXJ0LW9vcDU0LWNwcCkKIAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPFRZUEU+JiAgICAgb3BlcmF0b3IgPSAoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpIGNvbnN0OwotICAgICAgICAgICAgVmVjdG9yPFRZUEU+JiAgICAgICAgICAgb3BlcmF0b3IgPSAoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpOwotCi0gICAgICAgICAgICAvKgorICAgIC8qCiAgICAgICogZW1wdHkgdGhlIHZlY3RvcgogICAgICAqLwogCkBAIC0yNDgsMjcgKzI0NSwxOCBAQAogICAgIGZpbmlzaF92ZWN0b3IoKTsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1WZWN0b3I8VFlQRT4mIFZlY3RvcjxUWVBFPjo6b3BlcmF0b3IgPSAoY29uc3QgVmVjdG9yPFRZUEU+JiByaHMpIHsKLSAgICBWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChyaHMpOwordGVtcGxhdGUgPGNsYXNzIFRZUEU+CitpbmxpbmUgVmVjdG9yPFRZUEU+JiBWZWN0b3I8VFlQRT46Om9wZXJhdG9yPShjb25zdCBWZWN0b3I8VFlQRT4mIHJocykgIC8vIE5PTElOVChjZXJ0LW9vcDU0LWNwcCkKK3sKKyAgICBWZWN0b3JJbXBsOjpvcGVyYXRvcj0ocmhzKTsKICAgICByZXR1cm4gKnRoaXM7CiB9CiAKLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVmVjdG9yPFRZUEU+JiBWZWN0b3I8VFlQRT46Om9wZXJhdG9yID0gKGNvbnN0IFZlY3RvcjxUWVBFPiYgcmhzKSBjb25zdCB7Ci0gICAgVmVjdG9ySW1wbDo6b3BlcmF0b3IgPSAoc3RhdGljX2Nhc3Q8Y29uc3QgVmVjdG9ySW1wbCY+KHJocykpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1WZWN0b3I8VFlQRT4mIFZlY3RvcjxUWVBFPjo6b3BlcmF0b3IgPSAoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpIHsKLSAgICBWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4ocmhzKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFZlY3RvcjxUWVBFPiYgVmVjdG9yPFRZUEU+OjpvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgY29uc3QgewotICAgIFZlY3RvckltcGw6Om9wZXJhdG9yID0gKHJocyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KK2lubGluZSBWZWN0b3I8VFlQRT4mIFZlY3RvcjxUWVBFPjo6b3BlcmF0b3I9KAorICAgICAgICBjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgIC8vIE5PTElOVChjZXJ0LW9vcDU0LWNwcCkKK3sKKyAgICBWZWN0b3JJbXBsOjpvcGVyYXRvcj0oc3RhdGljX2Nhc3Q8Y29uc3QgVmVjdG9ySW1wbCY+KHJocykpOwogICAgIHJldHVybiAqdGhpczsKIH0KIApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmggYi9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjJlYmExMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2JpbmRlci9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOWRhMmNmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vYmluZGVyL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaAppbmRleCBiMzg3ZDY4Li40MWM1NTM2IDEwMDY0NAotLS0gYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgKQEAgLTM0NSw2ICszNDUsMTggQEAKICAgICBpbnQgcmVtb3ZlRmQoaW50IGZkKTsKIAogICAgIC8qKgorICAgICAqIFRlbGwgdGhlIGtlcm5lbCB0byBjaGVjayBmb3IgdGhlIHNhbWUgZXZlbnRzIHdlJ3JlIGFscmVhZHkgY2hlY2tpbmcgZm9yCisgICAgICogd2l0aCB0aGlzIEZELiBUaGlzIGlzIHRvIGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIGtlcm5lbCBkcml2ZXIgYnVnIHdoZXJlCisgICAgICogdGhlIGtlcm5lbCBkb2VzIG5vdCBwcm9wZXJseSBtYXJrIGl0c2VsZiBhcyBoYXZpbmcgbmV3IGRhdGEgYXZhaWxhYmxlLCBpbgorICAgICAqIG9yZGVyIHRvIGZvcmNlICJmZF9vcC0+cG9sbCgpIiB0byBiZSBjYWxsZWQuIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvCisgICAgICogdXNlIHRoaXMgaW4gZ2VuZXJhbCwgYW5kIHlvdSBzaG91bGRuJ3QgdXNlIGl0IHVubGVzcyB0aGVyZSBpcyBhIHBsYW4gdG8KKyAgICAgKiBmaXggdGhlIGtlcm5lbC4gU2VlIGFsc28gYi8yOTY4MTcyNTYuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bGx5IHJlcG9sbGVkLCAwIGlmIG5vdC4KKyAgICAgKi8KKyAgICBpbnQgcmVwb2xsKGludCBmZCk7CisKKyAgICAvKioKICAgICAgKiBFbnF1ZXVlcyBhIG1lc3NhZ2UgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBzcGVjaWZpZWQgaGFuZGxlci4KICAgICAgKgogICAgICAqIFRoZSBoYW5kbGVyIG11c3Qgbm90IGJlIG51bGwuCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xydUNhY2hlLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xydUNhY2hlLmgKaW5kZXggYjQyNDNhMy4uNzA5MDFiNiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9McnVDYWNoZS5oCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTHJ1Q2FjaGUuaApAQCAtMTYxLDEyICsxNjEsMTIgQEAKIC8vIEltcGxlbWVudGF0aW9uIGlzIGhlcmUsIGJlY2F1c2UgaXQncyBmdWxseSB0ZW1wbGF0ZWQKIHRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBUVmFsdWU+CiBMcnVDYWNoZTxUS2V5LCBUVmFsdWU+OjpMcnVDYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSkKLSAgICA6IG1TZXQobmV3IExydUNhY2hlU2V0KCkpCi0gICAgLCBtTGlzdGVuZXIobnVsbHB0cikKLSAgICAsIG1PbGRlc3QobnVsbHB0cikKLSAgICAsIG1Zb3VuZ2VzdChudWxscHRyKQotICAgICwgbU1heENhcGFjaXR5KG1heENhcGFjaXR5KQotICAgICwgbU51bGxWYWx1ZSgwKSB7CisgICAgOiBtU2V0KG5ldyBMcnVDYWNoZVNldCgpKSwKKyAgICAgIG1MaXN0ZW5lcihudWxscHRyKSwKKyAgICAgIG1PbGRlc3QobnVsbHB0ciksCisgICAgICBtWW91bmdlc3QobnVsbHB0ciksCisgICAgICBtTWF4Q2FwYWNpdHkobWF4Q2FwYWNpdHkpLAorICAgICAgbU51bGxWYWx1ZXt9IHsKICAgICBtU2V0LT5tYXhfbG9hZF9mYWN0b3IoMS4wKTsKIH07CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODZkNzJiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iODg3OTJmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZhNWEwODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaApAQCAtMCwwICsxIEBACisuLi8uLi9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZkOGJjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODQ4ZjZkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaApAQCAtMCwwICsxIEBACisuLi8uLi9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44YTQ4MGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTE1NzFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQ3MjY0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaApAQCAtMCwwICsxIEBACisuLi8uLi9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9taXNjLmNwcCBiL2xpYnV0aWxzL21pc2MuY3BwCmluZGV4IGY3N2UxODkuLmUxYjVmMDEgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL21pc2MuY3BwCisrKyBiL2xpYnV0aWxzL21pc2MuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfUkVDT1ZFUllfXykKZGlmZiAtLWdpdCBhL2xpYnZlbmRvcnN1cHBvcnQvQW5kcm9pZC5icCBiL2xpYnZlbmRvcnN1cHBvcnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQ1N2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmVuZG9yc3VwcG9ydC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJ2ZW5kb3JzdXBwb3J0IiwKKyAgICBuYXRpdmVfYnJpZGdlX3N1cHBvcnRlZDogdHJ1ZSwKKyAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCisgICAgbGxuZGs6IHsKKyAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJ2ZW5kb3JzdXBwb3J0Lm1hcC50eHQiLAorICAgIH0sCisgICAgc3JjczogWyJ2ZXJzaW9uX3Byb3BzLmMiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUvdmVuZG9yc3VwcG9ydCJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9saWJ2ZW5kb3JzdXBwb3J0L09XTkVSUyBiL2xpYnZlbmRvcnN1cHBvcnQvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjE4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2ZW5kb3JzdXBwb3J0L09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2ppeW9uZ0Bnb29nbGUuY29tCitqdXN0aW55dW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbGlidmVuZG9yc3VwcG9ydC9URVNUX01BUFBJTkcgYi9saWJ2ZW5kb3JzdXBwb3J0L1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQwOWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmVuZG9yc3VwcG9ydC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw3IEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogImxpYnZlbmRvcnN1cHBvcnQtdGVzdHMiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9saWJ2ZW5kb3JzdXBwb3J0L2luY2x1ZGUvdmVuZG9yc3VwcG9ydC9hcGlfbGV2ZWwuaCBiL2xpYnZlbmRvcnN1cHBvcnQvaW5jbHVkZS92ZW5kb3JzdXBwb3J0L2FwaV9sZXZlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMWE2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2ZW5kb3JzdXBwb3J0L2luY2x1ZGUvdmVuZG9yc3VwcG9ydC9hcGlfbGV2ZWwuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorCisjZGVmaW5lIF9fQU5EUk9JRF9WRU5ET1JfQVBJX01BWF9fIDEwMDAwMDAKKyNkZWZpbmUgX19JTlZBTElEX0FQSV9MRVZFTCAtMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogQGJyaWVmIEZpbmQgY29ycmVzcG9uZGluZyB2ZW5kb3IgQVBJIGxldmVsIGZyb20gYW4gU0RLIEFQSSB2ZXJzaW9uLgorICoKKyAqIEBkZXRhaWxzCisgKiBTREsgQVBJIHZlcnNpb25zIGFuZCB2ZW5kb3IgQVBJIGxldmVscyBhcmUgbm90IGNvbXBhdGlibGUgYW5kIG5vdAorICogY29udmVydGlibGUuIEhvd2V2ZXIsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29tcGFyZSB0aGUgdHdvIHZlcnNpb25zCisgKiB0byBrbm93IHdoaWNoIG9uZSBpcyBuZXdlciB0aGFuIHRoZSBvdGhlci4KKyAqCisgKiBAcGFyYW0gc2RrX2FwaV9sZXZlbCBUaGUgU0RLIHZlcnNpb24gaW50LiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIDEwMDAwLgorICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyB2ZW5kb3IgQVBJIGxldmVsIG9mIHRoZSBTREsgdmVyc2lvbi4gLTEgaWYgdGhlIFNESworICogdmVyc2lvbiBpcyBpbnZhbGlkIG9yIDEwMDAwLgorICovCitpbnQgdmVuZG9yX2FwaV9sZXZlbF9vZihpbnQgc2RrX2FwaV9sZXZlbCk7CisKKy8qKgorICogQGJyaWVmIEZpbmQgY29ycmVzcG9uZGluZyBTREsgQVBJIHZlcnNpb24gZnJvbSBhIHZlbmRvciBBUEkgbGV2ZWwuCisgKgorICogQHBhcmFtIHZlbmRvcl9hcGlfbGV2ZWwgVGhlIHZlbmRvciBBUEkgbGV2ZWwgaW50LgorICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBTREsgQVBJIHZlcnNpb24gb2YgdGhlIHZlbmRvciBBUEkgbGV2ZWwuIC0xIGlmIHRoZQorICogdmVuZG9yIEFQSSBsZXZlbCBpcyBpbnZhbGlkLgorICovCitpbnQgc2RrX2FwaV9sZXZlbF9vZihpbnQgdmVuZG9yX2FwaV9sZXZlbCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2ZW5kb3JzdXBwb3J0L2xpYnZlbmRvcnN1cHBvcnQubWFwLnR4dCBiL2xpYnZlbmRvcnN1cHBvcnQvbGlidmVuZG9yc3VwcG9ydC5tYXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjNiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2ZW5kb3JzdXBwb3J0L2xpYnZlbmRvcnN1cHBvcnQubWFwLnR4dApAQCAtMCwwICsxLDcgQEAKK0xJQlZFTkRPUlNVUFBPUlQgeworICBnbG9iYWw6CisgICAgdmVuZG9yX2FwaV9sZXZlbF9vZjsgIyBsbG5kayBzeXN0ZW1hcGkKKyAgICBzZGtfYXBpX2xldmVsX29mOyAjIGxsbmRrIHN5c3RlbWFwaQorICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL2xpYnZlbmRvcnN1cHBvcnQvdGVzdHMvQW5kcm9pZC5icCBiL2xpYnZlbmRvcnN1cHBvcnQvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmUzMzcxCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmVuZG9yc3VwcG9ydC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJ2ZW5kb3JzdXBwb3J0LXRlc3RzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ2ZXJzaW9uX3Byb3BzX3Rlc3QuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidmVuZG9yc3VwcG9ydCIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKZGlmZiAtLWdpdCBhL2xpYnZlbmRvcnN1cHBvcnQvdGVzdHMvdmVyc2lvbl9wcm9wc190ZXN0LmNwcCBiL2xpYnZlbmRvcnN1cHBvcnQvdGVzdHMvdmVyc2lvbl9wcm9wc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzhhMmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmVuZG9yc3VwcG9ydC90ZXN0cy92ZXJzaW9uX3Byb3BzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDx2ZW5kb3JzdXBwb3J0L2FwaV9sZXZlbC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgeworCitURVNUKHZlbmRvcnN1cHBvcnQsIGdldF9jb3JyZXNwb25kaW5nX3ZlbmRvcl9hcGlfbGV2ZWwpIHsKKyAgICBBU1NFUlRfRVEoX19BTkRST0lEX0FQSV9VX18sIHZlbmRvcl9hcGlfbGV2ZWxfb2YoX19BTkRST0lEX0FQSV9VX18pKTsKKyAgICBBU1NFUlRfRVEoMjAyNDA0LCB2ZW5kb3JfYXBpX2xldmVsX29mKF9fQU5EUk9JRF9BUElfVl9fKSk7CisgICAgQVNTRVJUX0VRKF9fSU5WQUxJRF9BUElfTEVWRUwsIHZlbmRvcl9hcGlfbGV2ZWxfb2YoX19BTkRST0lEX0FQSV9GVVRVUkVfXykpOworfQorCitURVNUKHZlbmRvcnN1cHBvcnQsIGdldF9jb3JyZXNwb25kaW5nX3Nka19hcGlfbGV2ZWwpIHsKKyAgICBBU1NFUlRfRVEoX19BTkRST0lEX0FQSV9VX18sIHNka19hcGlfbGV2ZWxfb2YoX19BTkRST0lEX0FQSV9VX18pKTsKKyAgICBBU1NFUlRfRVEoX19BTkRST0lEX0FQSV9WX18sIHNka19hcGlfbGV2ZWxfb2YoMjAyNDA0KSk7CisgICAgQVNTRVJUX0VRKF9fSU5WQUxJRF9BUElfTEVWRUwsIHNka19hcGlfbGV2ZWxfb2YoX19BTkRST0lEX1ZFTkRPUl9BUElfTUFYX18pKTsKKyAgICBBU1NFUlRfRVEoX19JTlZBTElEX0FQSV9MRVZFTCwgc2RrX2FwaV9sZXZlbF9vZigzNSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ2ZW5kb3JzdXBwb3J0L3ZlcnNpb25fcHJvcHMuYyBiL2xpYnZlbmRvcnN1cHBvcnQvdmVyc2lvbl9wcm9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMGU0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2ZW5kb3JzdXBwb3J0L3ZlcnNpb25fcHJvcHMuYwpAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFwaV9sZXZlbC5oIgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCitpbnQgdmVuZG9yX2FwaV9sZXZlbF9vZihpbnQgc2RrX2FwaV9sZXZlbCkgeworICAgIGlmIChzZGtfYXBpX2xldmVsIDwgX19BTkRST0lEX0FQSV9WX18pIHsKKyAgICAgICAgcmV0dXJuIHNka19hcGlfbGV2ZWw7CisgICAgfQorICAgIC8vIEluIEFuZHJvaWQgViwgdmVuZG9yIEFQSSBsZXZlbCBzdGFydGVkIHdpdGggdmVyc2lvbiAyMDI0MDQuCisgICAgLy8gVGhlIGNhbGN1bGF0aW9uIGFzc3VtZXMgdGhhdCB0aGUgU0RLIGFwaSBsZXZlbCBidW1wcyBvbmNlIGEgeWVhci4KKyAgICBpZiAoc2RrX2FwaV9sZXZlbCA8IF9fQU5EUk9JRF9BUElfRlVUVVJFX18pIHsKKyAgICAgICAgcmV0dXJuIDIwMjQwNCArICgoc2RrX2FwaV9sZXZlbCAtIF9fQU5EUk9JRF9BUElfVl9fKSAqIDEwMCk7CisgICAgfQorICAgIEFMT0dFKCJUaGUgU0RLIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gMTAwMDA6ICVkIiwgc2RrX2FwaV9sZXZlbCk7CisgICAgcmV0dXJuIF9fSU5WQUxJRF9BUElfTEVWRUw7Cit9CisKK2ludCBzZGtfYXBpX2xldmVsX29mKGludCB2ZW5kb3JfYXBpX2xldmVsKSB7CisgICAgaWYgKHZlbmRvcl9hcGlfbGV2ZWwgPCBfX0FORFJPSURfQVBJX1ZfXykgeworICAgICAgICByZXR1cm4gdmVuZG9yX2FwaV9sZXZlbDsKKyAgICB9CisgICAgaWYgKHZlbmRvcl9hcGlfbGV2ZWwgPj0gMjAyNDA0ICYmIHZlbmRvcl9hcGlfbGV2ZWwgPCBfX0FORFJPSURfVkVORE9SX0FQSV9NQVhfXykgeworICAgICAgICByZXR1cm4gKHZlbmRvcl9hcGlfbGV2ZWwgLSAyMDI0MDQpIC8gMTAwICsgX19BTkRST0lEX0FQSV9WX187CisgICAgfQorICAgIEFMT0dFKCJVbmV4cGVjdGVkIHZlbmRvciBhcGkgbGV2ZWw6ICVkIiwgdmVuZG9yX2FwaV9sZXZlbCk7CisgICAgcmV0dXJuIF9fSU5WQUxJRF9BUElfTEVWRUw7Cit9CmRpZmYgLS1naXQgYS9saWJ2bmRrc3VwcG9ydC9pbmNsdWRlL3ZuZGtzdXBwb3J0L2xpbmtlci5oIGIvbGlidm5ka3N1cHBvcnQvaW5jbHVkZS92bmRrc3VwcG9ydC9saW5rZXIuaAppbmRleCA1ZjQ4YzM5Li42ODQ1MTM1IDEwMDY0NAotLS0gYS9saWJ2bmRrc3VwcG9ydC9pbmNsdWRlL3ZuZGtzdXBwb3J0L2xpbmtlci5oCisrKyBiL2xpYnZuZGtzdXBwb3J0L2luY2x1ZGUvdm5ka3N1cHBvcnQvbGlua2VyLmgKQEAgLTIwLDE1ICsyMCw4IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0vKgotICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYSB2ZW5kb3IgcHJvY2Vzcy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGNoZWNraW5nIHdoYXQgcHJvY2VzcyBpcyBydW5uaW5nIGFuZCBoYXMgbm90aGluZyB0bwotICogZG8gd2l0aCB3aGF0IG5hbWVzcGFjZSB0aGUgY2FsbGVyIGlzIGxvYWRlZCBhdC4gIEZvciBleGFtcGxlLCBhIFZOREstU1AKLSAqIGxpYnJhcnkgbG9hZGVkIGJ5IFNQLUhBTCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gbWF5IHN0aWxsIGdldCBhICdmYWxzZScsCi0gKiBiZWNhdXNlIGl0IGlzIHJ1bm5pbmcgaW4gYSBzeXN0ZW0gcHJvY2Vzcy4KLSAqLwotaW50IGFuZHJvaWRfaXNfaW5fdmVuZG9yX3Byb2Nlc3MoKTsKK2ludCBhbmRyb2lkX2lzX2luX3ZlbmRvcl9wcm9jZXNzKCkgX19hdHRyaWJ1dGVfXygoCisgICAgICAgIGRlcHJlY2F0ZWQoIlRoaXMgZnVuY3Rpb24gd291bGQgbm90IGdpdmUgZXhhY3QgcmVzdWx0IGlmIFZOREsgaXMgZGVwcmVjYXRlZC4iKSkpOwogCiB2b2lkKiBhbmRyb2lkX2xvYWRfc3BoYWxfbGlicmFyeShjb25zdCBjaGFyKiBuYW1lLCBpbnQgZmxhZyk7CiAKZGlmZiAtLWdpdCBhL2xpYnZuZGtzdXBwb3J0L2xpYnZuZGtzdXBwb3J0Lm1hcC50eHQgYi9saWJ2bmRrc3VwcG9ydC9saWJ2bmRrc3VwcG9ydC5tYXAudHh0CmluZGV4IDFkOTRiOWQuLjMyNTUwNWQgMTAwNjQ0Ci0tLSBhL2xpYnZuZGtzdXBwb3J0L2xpYnZuZGtzdXBwb3J0Lm1hcC50eHQKKysrIGIvbGlidm5ka3N1cHBvcnQvbGlidm5ka3N1cHBvcnQubWFwLnR4dApAQCAtMSw2ICsxLDYgQEAKIExJQlZOREtTVVBQT1JUIHsKICAgZ2xvYmFsOgotICAgIGFuZHJvaWRfaXNfaW5fdmVuZG9yX3Byb2Nlc3M7ICMgbGxuZGsgc3lzdGVtYXBpCisgICAgYW5kcm9pZF9pc19pbl92ZW5kb3JfcHJvY2VzczsgIyBsbG5kay1kZXByZWNhdGVkPTM1IHN5c3RlbWFwaQogICAgIGFuZHJvaWRfbG9hZF9zcGhhbF9saWJyYXJ5OyAjIGxsbmRrIHN5c3RlbWFwaQogICAgIGFuZHJvaWRfdW5sb2FkX3NwaGFsX2xpYnJhcnk7ICMgbGxuZGsgc3lzdGVtYXBpCiAgIGxvY2FsOgpkaWZmIC0tZ2l0IGEvbGlidm5ka3N1cHBvcnQvbGlua2VyLmNwcCBiL2xpYnZuZGtzdXBwb3J0L2xpbmtlci5jcHAKaW5kZXggYWQ0ZmIzMS4uYjJiMjU3ZSAxMDA2NDQKLS0tIGEvbGlidm5ka3N1cHBvcnQvbGlua2VyLmNwcAorKysgYi9saWJ2bmRrc3VwcG9ydC9saW5rZXIuY3BwCkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGhhbmRsZTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiTG9hZGluZyAlcyBmcm9tIGN1cnJlbnQgbmFtZXNwYWNlIGluc3RlYWQgb2Ygc3BoYWwgbmFtZXNwYWNlLiIsIG5hbWUpOworICAgICAgICBBTE9HVygiTG9hZGluZyAlcyBmcm9tIGN1cnJlbnQgbmFtZXNwYWNlIGluc3RlYWQgb2Ygc3BoYWwgbmFtZXNwYWNlLiIsIG5hbWUpOwogICAgICAgICByZXR1cm4gZGxvcGVuKG5hbWUsIGZsYWcpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL0FuZHJvaWQuYnAgYi9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9BbmRyb2lkLmJwCmluZGV4IDg3NjQ2ZjkuLmI0YTE2ZDMgMTAwNjQ0Ci0tLSBhL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvcHJvcGVydHlfc2VydmljZS9saWJwcm9wZXJ0eWluZm9wYXJzZXIvQW5kcm9pZC5icApAQCAtMjUsNCArMjUsOCBAQAogICAgICAgICB9LAogICAgIH0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQucnVudGltZSIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL2luY2x1ZGUvcHJvcGVydHlfaW5mb19wYXJzZXIvcHJvcGVydHlfaW5mb19wYXJzZXIuaCBiL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL2luY2x1ZGUvcHJvcGVydHlfaW5mb19wYXJzZXIvcHJvcGVydHlfaW5mb19wYXJzZXIuaAppbmRleCAwNTQ4MDIxLi42NTcwNWFjIDEwMDY0NAotLS0gYS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9pbmNsdWRlL3Byb3BlcnR5X2luZm9fcGFyc2VyL3Byb3BlcnR5X2luZm9fcGFyc2VyLmgKKysrIGIvcHJvcGVydHlfc2VydmljZS9saWJwcm9wZXJ0eWluZm9wYXJzZXIvaW5jbHVkZS9wcm9wZXJ0eV9pbmZvX3BhcnNlci9wcm9wZXJ0eV9pbmZvX3BhcnNlci5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBQUk9QX1RSRUVfRklMRVtdID0gIi9kZXYvX19wcm9wZXJ0aWVzX18vcHJvcGVydHlfaW5mbyI7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBwcm9wZXJ0aWVzIHsKIApkaWZmIC0tZ2l0IGEvcm9vdGRpci9BbmRyb2lkLmJwIGIvcm9vdGRpci9BbmRyb2lkLmJwCmluZGV4IGU5ODczM2EuLmM4YTNjZDYgMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvQW5kcm9pZC5icAorKysgYi9yb290ZGlyL0FuZHJvaWQuYnAKQEAgLTE3LDEyICsxNywzMCBAQAogfQogCiBwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJpbml0LmJvcmluZ3NzbC56eWdvdGU2NF8zMi5yYyIsCisgICAgc3JjOiAiaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjRfMzIucmMiLAorICAgIHN1Yl9kaXI6ICJpbml0L2h3IiwKKyAgICBzeW1saW5rczogWworICAgICAgICAiaW5pdC5ib3Jpbmdzc2wuenlnb3RlMzIucmMiLAorICAgICAgICAiaW5pdC5ib3Jpbmdzc2wubm9fenlnb3RlLnJjIiwKKyAgICBdLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJpbml0LmJvcmluZ3NzbC56eWdvdGU2NC5yYyIsCisgICAgc3JjOiAiaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjQucmMiLAorICAgIHN1Yl9kaXI6ICJpbml0L2h3IiwKK30KKworcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiaW5pdC5yYyIsCiAgICAgc3JjOiAiaW5pdC5yYyIsCiAgICAgc3ViX2RpcjogImluaXQvaHciLAogICAgIHJlcXVpcmVkOiBbCiAgICAgICAgICJmc3Zlcml0eV9pbml0IiwKICAgICAgICAgInBsYXRmb3JtLWJvb3RjbGFzc3BhdGgiLAorICAgICAgICAiaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjQucmMiLAorICAgICAgICAiaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjRfMzIucmMiLAogICAgIF0sCiB9CiAKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvQW5kcm9pZC5tayBiL3Jvb3RkaXIvQW5kcm9pZC5tawppbmRleCAzMzYyODcyLi43NDQ0Zjk2IDEwMDY0NAotLS0gYS9yb290ZGlyL0FuZHJvaWQubWsKKysrIGIvcm9vdGRpci9BbmRyb2lkLm1rCkBAIC03Miw2ICs3MiwxMSBAQAogICBlbmRpZgogZW5kaWYKIAorRVhQT1JUX0dMT0JBTF9TQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUgOj0KK2lmbmVxICgkKFBST0RVQ1RfU0NVRE9fQUxMT0NBVElPTl9SSU5HX0JVRkZFUl9TSVpFKSwpCisgIEVYUE9SVF9HTE9CQUxfU0NVRE9fQUxMT0NBVElPTl9SSU5HX0JVRkZFUl9TSVpFIDo9IGV4cG9ydCBTQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUgJChQUk9EVUNUX1NDVURPX0FMTE9DQVRJT05fUklOR19CVUZGRVJfU0laRSkKK2VuZGlmCisKIEVYUE9SVF9HTE9CQUxfR0NPVl9PUFRJT05TIDo9CiBpZmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKICAgRVhQT1JUX0dMT0JBTF9HQ09WX09QVElPTlMgOj0gZXhwb3J0IEdDT1ZfUFJFRklYIC9kYXRhL21pc2MvdHJhY2UKQEAgLTkxLDI3ICs5NiwzOCBAQAogIwogIyBjcmVhdGUgc29tZSBkaXJlY3RvcmllcyAoc29tZSBhcmUgbW91bnQgcG9pbnRzKSBhbmQgc3ltbGlua3MKIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gbWtkaXIgLXAgJChhZGRwcmVmaXggJChUQVJHRVRfUk9PVF9PVVQpLywgXAotICAgIGRldiBwcm9jIHN5cyBzeXN0ZW0gZGF0YSBkYXRhX21pcnJvciBvZG0gb2VtIGFjY3QgY29uZmlnIHN0b3JhZ2UgbW50IGFwZXggZGVidWdfcmFtZGlzayBcCi0gICAgbGlua2VyY29uZmlnIHNlY29uZF9zdGFnZV9yZXNvdXJjZXMgcG9zdGluc3RhbGwgJChCT0FSRF9ST09UX0VYVFJBX0ZPTERFUlMpKTsgXAorICAgIGRldiBwcm9jIHN5cyBzeXN0ZW0gZGF0YSBkYXRhX21pcnJvciBvZG0gb2VtIGFjY3QgY29uZmlnIHN0b3JhZ2UgbW50IGFwZXggYm9vdHN0cmFwLWFwZXggZGVidWdfcmFtZGlzayBcCisgICAgbGlua2VyY29uZmlnIHNlY29uZF9zdGFnZV9yZXNvdXJjZXMgcG9zdGluc3RhbGwgdG1wICQoQk9BUkRfUk9PVF9FWFRSQV9GT0xERVJTKSk7IFwKICAgICBsbiAtc2YgL3N5c3RlbS9iaW4gJChUQVJHRVRfUk9PVF9PVVQpL2JpbjsgXAogICAgIGxuIC1zZiAvc3lzdGVtL2V0YyAkKFRBUkdFVF9ST09UX09VVCkvZXRjOyBcCiAgICAgbG4gLXNmIC9kYXRhL3VzZXJfZGUvMC9jb20uYW5kcm9pZC5zaGVsbC9maWxlcy9idWdyZXBvcnRzICQoVEFSR0VUX1JPT1RfT1VUKS9idWdyZXBvcnRzOyBcCiAgICAgbG4gLXNmbiAvc3lzL2tlcm5lbC9kZWJ1ZyAkKFRBUkdFVF9ST09UX09VVCkvZDsgXAogICAgIGxuIC1zZiAvc3RvcmFnZS9zZWxmL3ByaW1hcnkgJChUQVJHRVRfUk9PVF9PVVQpL3NkY2FyZAorCitBTExfUk9PVERJUl9TWU1MSU5LUyA6PSBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9iaW4gXAorICAkKFRBUkdFVF9ST09UX09VVCkvZXRjIFwKKyAgJChUQVJHRVRfUk9PVF9PVVQpL2J1Z3JlcG9ydHMgXAorICAkKFRBUkdFVF9ST09UX09VVCkvZCBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9zZGNhcmQKKwogaWZkZWYgQk9BUkRfVVNFU19WRU5ET1JJTUFHRQogICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL3ZlbmRvcgogZWxzZQogICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC9zeXN0ZW0vdmVuZG9yICQoVEFSR0VUX1JPT1RfT1VUKS92ZW5kb3IKKyAgQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gJChUQVJHRVRfUk9PVF9PVVQpL3ZlbmRvcgogZW5kaWYKIGlmZGVmIEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFCiAgIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvcHJvZHVjdAogZWxzZQogICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC9zeXN0ZW0vcHJvZHVjdCAkKFRBUkdFVF9ST09UX09VVCkvcHJvZHVjdAorICBBTExfUk9PVERJUl9TWU1MSU5LUyArPSAkKFRBUkdFVF9ST09UX09VVCkvcHJvZHVjdAogZW5kaWYKIGlmZGVmIEJPQVJEX1VTRVNfU1lTVEVNX0VYVElNQUdFCiAgIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvc3lzdGVtX2V4dAogZWxzZQogICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC9zeXN0ZW0vc3lzdGVtX2V4dCAkKFRBUkdFVF9ST09UX09VVCkvc3lzdGVtX2V4dAorICBBTExfUk9PVERJUl9TWU1MSU5LUyArPSAkKFRBUkdFVF9ST09UX09VVCkvc3lzdGVtX2V4dAogZW5kaWYKIGlmZGVmIEJPQVJEX1VTRVNfTUVUQURBVEFfUEFSVElUSU9OCiAgIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvbWV0YWRhdGEKQEAgLTEzNCw2ICsxNTAsMTggQEAKIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci9vZG0vcHJpdi1hcHAgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9wcml2LWFwcAogTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS91c3IgJChUQVJHRVRfUk9PVF9PVVQpL29kbS91c3IKIAorQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gXAorICAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2FwcCBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vYmluIFwKKyAgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9ldGMgXAorICAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2Zpcm13YXJlIFwKKyAgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9mcmFtZXdvcmsgXAorICAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2xpYiBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vbGliNjQgXAorICAkKFRBUkdFVF9ST09UX09VVCkvb2RtL292ZXJsYXkgXAorICAkKFRBUkdFVF9ST09UX09VVCkvb2RtL3ByaXYtYXBwIFwKKyAgJChUQVJHRVRfUk9PVF9PVVQpL29kbS91c3IKKwogCiAjIEZvciAvdmVuZG9yX2Rsa20gcGFydGl0aW9uLgogTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IG1rZGlyIC1wICQoVEFSR0VUX1JPT1RfT1VUKS92ZW5kb3JfZGxrbQpAQCAtMTQ0LDYgKzE3Miw3IEBACiAjIE5vdGUgdGhhdCAvdmVuZG9yX2Rsa20vbGliIGlzIG9taXR0ZWQgYmVjYXVzZSB2ZW5kb3IgRExLTXMgc2hvdWxkIGJlIGFjY2Vzc2VkCiAjIHZpYSAvdmVuZG9yL2xpYi9tb2R1bGVzIGRpcmVjdGx5LgogTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL3ZlbmRvcl9kbGttL2V0YyAkKFRBUkdFVF9ST09UX09VVCkvdmVuZG9yX2Rsa20vZXRjCitBTExfUk9PVERJUl9TWU1MSU5LUyArPSAkKFRBUkdFVF9ST09UX09VVCkvdmVuZG9yX2Rsa20vZXRjCiAKICMgRm9yIC9vZG1fZGxrbSBwYXJ0aXRpb24uCiBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL29kbV9kbGttCkBAIC0xNTQsNiArMTgzLDcgQEAKICMgTm90ZSB0aGF0IC9vZG1fZGxrbS9saWIgaXMgb21pdHRlZCBiZWNhdXNlIG9kbSBETEtNcyBzaG91bGQgYmUgYWNjZXNzZWQKICMgdmlhIC9vZG0vbGliL21vZHVsZXMgZGlyZWN0bHkuCiBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC9vZG0vb2RtX2Rsa20vZXRjICQoVEFSR0VUX1JPT1RfT1VUKS9vZG1fZGxrbS9ldGMKK0FMTF9ST09URElSX1NZTUxJTktTICs9ICQoVEFSR0VUX1JPT1RfT1VUKS9vZG1fZGxrbS9ldGMKIAogIyBGb3IgL3N5c3RlbV9kbGttIHBhcnRpdGlvbgogTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IG1rZGlyIC1wICQoVEFSR0VUX1JPT1RfT1VUKS9zeXN0ZW1fZGxrbQpAQCAtMTYyLDYgKzE5Miw3IEBACiAgIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvY2FjaGUKIGVsc2UKICAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvZGF0YS9jYWNoZSAkKFRBUkdFVF9ST09UX09VVCkvY2FjaGUKKyAgQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gJChUQVJHRVRfUk9PVF9PVVQpL2NhY2hlCiBlbmRpZgogaWZkZWYgQk9BUkRfUk9PVF9FWFRSQV9TWU1MSU5LUwogIyBCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTIGlzIGEgbGlzdCBvZiA8dGFyZ2V0Pjo8bGlua19uYW1lPi4KQEAgLTE2OSwxNCArMjAwLDE5IEBACiAgICAgJChldmFsIHAgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQocykpKVwKICAgICA7IG1rZGlyIC1wICQoZGlyICQoVEFSR0VUX1JPT1RfT1VUKS8kKHdvcmQgMiwkKHApKSkgXAogICAgIDsgbG4gLXNmICQod29yZCAxLCQocCkpICQoVEFSR0VUX1JPT1RfT1VUKS8kKHdvcmQgMiwkKHApKSkKKyAgQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gJChmb3JlYWNoIHMsJChCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTKSwkKFRBUkdFVF9ST09UX09VVCkvJChjYWxsIHdvcmQtY29sb24sMiwkcykpCiBlbmRpZgogCiAjIFRoZSBpbml0IHN5bWxpbmsgbXVzdCBiZSBhIHBvc3QgaW5zdGFsbCBjb21tYW5kIG9mIGEgZmlsZSB0aGF0IGlzIHRvIFRBUkdFVF9ST09UX09VVC4KICMgU2luY2UgaW5pdC5lbnZpcm9uLnJjIGlzIHJlcXVpcmVkIGZvciBpbml0IGFuZCBzYXRpc2ZpZXMgdGhhdCByZXF1aXJlbWVudCwgd2UgaGlqYWNrIGl0IHRvIGNyZWF0ZSB0aGUgc3ltbGluay4KIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3N5c3RlbS9iaW4vaW5pdCAkKFRBUkdFVF9ST09UX09VVCkvaW5pdAorQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gJChUQVJHRVRfUk9PVF9PVVQpL2luaXQKKworQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChBTExfUk9PVERJUl9TWU1MSU5LUykKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawogCiskKEFMTF9ST09URElSX1NZTUxJTktTKTogJChMT0NBTF9CVUlMVF9NT0RVTEUpCiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvaW5pdC5lbnZpcm9uLnJjLmluCiAJQGVjaG8gIkdlbmVyYXRlOiAkPCAtPiAkQCIKIAlAbWtkaXIgLXAgJChkaXIgJEApCkBAIC0xODUsNiArMjIxLDcgQEAKIAkkKGhpZGUpIHNlZCAtaSAtZSAncz8lRVhQT1JUX0dMT0JBTF9HQ09WX09QVElPTlMlPyQoRVhQT1JUX0dMT0JBTF9HQ09WX09QVElPTlMpP2cnICRACiAJJChoaWRlKSBzZWQgLWkgLWUgJ3M/JUVYUE9SVF9HTE9CQUxfQ0xBTkdfQ09WRVJBR0VfT1BUSU9OUyU/JChFWFBPUlRfR0xPQkFMX0NMQU5HX0NPVkVSQUdFX09QVElPTlMpP2cnICRACiAJJChoaWRlKSBzZWQgLWkgLWUgJ3M/JUVYUE9SVF9HTE9CQUxfSFdBU0FOX09QVElPTlMlPyQoRVhQT1JUX0dMT0JBTF9IV0FTQU5fT1BUSU9OUyk/ZycgJEAKKwkkKGhpZGUpIHNlZCAtaSAtZSAncz8lRVhQT1JUX0dMT0JBTF9TQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUlPyQoRVhQT1JUX0dMT0JBTF9TQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUpP2cnICRACiAKICMgQXBwZW5kIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiB0byBiYXNlIG5hbWUuCiBkZWZpbmUgYXBwZW5kX3ZuZGtfdmVyc2lvbgpkaWZmIC0tZ2l0IGEvcm9vdGRpci9ldGMvbGlua2VyLmNvbmZpZy5qc29uIGIvcm9vdGRpci9ldGMvbGlua2VyLmNvbmZpZy5qc29uCmluZGV4IDQ3Zjc3YjEuLmQ3MmFjNjYgMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvZXRjL2xpbmtlci5jb25maWcuanNvbgorKysgYi9yb290ZGlyL2V0Yy9saW5rZXIuY29uZmlnLmpzb24KQEAgLTExLDkgKzExLDYgQEAKICAgICAibGlic2lnY2hhaW4uc28iLAogICAgIC8vIFRPRE8oYi8xMjI4NzYzMzYpOiBSZW1vdmUgbGlicGFjLnNvIG9uY2UgaXQncyBtaWdyYXRlZCB0byBXZWJ2aWV3CiAgICAgImxpYnBhYy5zbyIsCi0gICAgLy8gVE9ETyhiLzE4NDg3Mjk3OSk6IFJlbW92ZSBsaWJiaW5kZXJfcnBjX3Vuc3RhYmxlLnNvIG9uY2Ugc3RhYmxpemVkIGFuZAotICAgIC8vIGFkZGVkIHRvIGxpYmJpbmRlcl9uZGsuCi0gICAgImxpYmJpbmRlcl9ycGNfdW5zdGFibGUuc28iLAogICAgIC8vIFRPRE8oYi8xMjA3ODY0MTcgb3IgYi8xMzQ2NTkyOTQpOiBsaWJpY3V1Yy5zbwogICAgIC8vIGFuZCBsaWJpY3VpMThuLnNvIGFyZSBrZXB0IGZvciBhcHAgY29tcGF0LgogICAgICJsaWJpY3VpMThuLnNvIiwKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMuYW5kcm9pZC50eHQgYi9yb290ZGlyL2V0Yy9wdWJsaWMubGlicmFyaWVzLmFuZHJvaWQudHh0CmluZGV4IGNhY2M0N2MuLjliZTJlZjYgMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMuYW5kcm9pZC50eHQKKysrIGIvcm9vdGRpci9ldGMvcHVibGljLmxpYnJhcmllcy5hbmRyb2lkLnR4dApAQCAtMSw0ICsxLDQgQEAKLSMgU2VlIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL25kay8rL21hc3Rlci9kb2NzL1BsYXRmb3JtQXBpcy5tZAorIyBTZWUgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vbmRrLysvbWFpbi9kb2NzL1BsYXRmb3JtQXBpcy5tZAogbGliYW5kcm9pZC5zbwogbGliYWF1ZGlvLnNvCiBsaWJhbWlkaS5zbwpkaWZmIC0tZ2l0IGEvcm9vdGRpci9ldGMvcHVibGljLmxpYnJhcmllcy5pb3QudHh0IGIvcm9vdGRpci9ldGMvcHVibGljLmxpYnJhcmllcy5pb3QudHh0CmluZGV4IDc3ZjhiYjguLjA1MTM5NjggMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMuaW90LnR4dAorKysgYi9yb290ZGlyL2V0Yy9wdWJsaWMubGlicmFyaWVzLmlvdC50eHQKQEAgLTEsNCArMSw0IEBACi0jIFNlZSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9uZGsvKy9tYXN0ZXIvZG9jcy9QbGF0Zm9ybUFwaXMubWQKKyMgU2VlIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL25kay8rL21haW4vZG9jcy9QbGF0Zm9ybUFwaXMubWQKIGxpYmFuZHJvaWQuc28KIGxpYmFuZHJvaWR0aGluZ3Muc28KIGxpYmFhdWRpby5zbwpkaWZmIC0tZ2l0IGEvcm9vdGRpci9ldGMvcHVibGljLmxpYnJhcmllcy53ZWFyLnR4dCBiL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMud2Vhci50eHQKaW5kZXggZWExZTIzNC4uNTkxNWRjYiAxMDA2NDQKLS0tIGEvcm9vdGRpci9ldGMvcHVibGljLmxpYnJhcmllcy53ZWFyLnR4dAorKysgYi9yb290ZGlyL2V0Yy9wdWJsaWMubGlicmFyaWVzLndlYXIudHh0CkBAIC0xLDQgKzEsNCBAQAotIyBTZWUgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vbmRrLysvbWFzdGVyL2RvY3MvUGxhdGZvcm1BcGlzLm1kCisjIFNlZSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9uZGsvKy9tYWluL2RvY3MvUGxhdGZvcm1BcGlzLm1kCiBsaWJhbmRyb2lkLnNvCiBsaWJhYXVkaW8uc28KIGxpYmFtaWRpLnNvCmRpZmYgLS1naXQgYS9yb290ZGlyL2luaXQuYm9yaW5nc3NsLnp5Z290ZTY0LnJjIGIvcm9vdGRpci9pbml0LmJvcmluZ3NzbC56eWdvdGU2NC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQ5ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvcm9vdGRpci9pbml0LmJvcmluZ3NzbC56eWdvdGU2NC5yYwpAQCAtMCwwICsxLDQgQEAKK29uIGluaXQgJiYgcHJvcGVydHk6cm8ucHJvZHVjdC5jcHUuYWJpbGlzdDY0PSoKKyAgICBleGVjX3N0YXJ0IGJvcmluZ3NzbF9zZWxmX3Rlc3Q2NAorb24gcHJvcGVydHk6YXBleGQuc3RhdHVzPXJlYWR5ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3Q2ND0qCisgICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0X2FwZXg2NApkaWZmIC0tZ2l0IGEvcm9vdGRpci9pbml0LmJvcmluZ3NzbC56eWdvdGU2NF8zMi5yYyBiL3Jvb3RkaXIvaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjRfMzIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiZTQyZAotLS0gL2Rldi9udWxsCisrKyBiL3Jvb3RkaXIvaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjRfMzIucmMKQEAgLTAsMCArMSw4IEBACitvbiBpbml0ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3QzMj0qCisgICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0MzIKK29uIGluaXQgJiYgcHJvcGVydHk6cm8ucHJvZHVjdC5jcHUuYWJpbGlzdDY0PSoKKyAgICBleGVjX3N0YXJ0IGJvcmluZ3NzbF9zZWxmX3Rlc3Q2NAorb24gcHJvcGVydHk6YXBleGQuc3RhdHVzPXJlYWR5ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3QzMj0qCisgICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0X2FwZXgzMgorb24gcHJvcGVydHk6YXBleGQuc3RhdHVzPXJlYWR5ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3Q2ND0qCisgICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0X2FwZXg2NApkaWZmIC0tZ2l0IGEvcm9vdGRpci9pbml0LmVudmlyb24ucmMuaW4gYi9yb290ZGlyL2luaXQuZW52aXJvbi5yYy5pbgppbmRleCBiZjZlOTg2Li43YmExZjQ2IDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQuZW52aXJvbi5yYy5pbgorKysgYi9yb290ZGlyL2luaXQuZW52aXJvbi5yYy5pbgpAQCAtMTQsMyArMTQsNCBAQAogICAgICVFWFBPUlRfR0xPQkFMX0dDT1ZfT1BUSU9OUyUKICAgICAlRVhQT1JUX0dMT0JBTF9DTEFOR19DT1ZFUkFHRV9PUFRJT05TJQogICAgICVFWFBPUlRfR0xPQkFMX0hXQVNBTl9PUFRJT05TJQorICAgICVFWFBPUlRfR0xPQkFMX1NDVURPX0FMTE9DQVRJT05fUklOR19CVUZGRVJfU0laRSUKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC5yYyBiL3Jvb3RkaXIvaW5pdC5yYwppbmRleCAxZTY5MThkLi43NjhlMGZmIDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQucmMKKysrIGIvcm9vdGRpci9pbml0LnJjCkBAIC03NCw5ICs3NCw3IEBACiAgICAgIyBiZWNvbWUgYXZhaWxhYmxlLiBOb3RlIHRoYXQgdGhpcyBpcyBleGVjdXRlZCBhcyBleGVjX3N0YXJ0IHRvIGVuc3VyZSB0aGF0CiAgICAgIyB0aGUgbGlicmFyaWVzIGFyZSBhdmFpbGFibGUgdG8gdGhlIHByb2Nlc3NlcyBzdGFydGVkIGFmdGVyIHRoaXMgc3RhdGVtZW50LgogICAgIGV4ZWNfc3RhcnQgYXBleGQtYm9vdHN0cmFwCi0KLSAgICAjIEdlbmVyYXRlIGxpbmtlciBjb25maWcgYmFzZWQgb24gYXBleCBtb3VudGVkIGluIGJvb3RzdHJhcCBuYW1lc3BhY2UKLSAgICB1cGRhdGVfbGlua2VyX2NvbmZpZworICAgIHBlcmZvcm1fYXBleF9jb25maWcgLS1ib290c3RyYXAKIAogICAgICMgVGhlc2UgbXVzdCBhbHJlYWR5IGV4aXN0IGJ5IHRoZSB0aW1lIGJvcmluZ3NzbF9zZWxmX3Rlc3QzMiAvIGJvcmluZ3NzbF9zZWxmX3Rlc3Q2NCBydW4uCiAgICAgbWtkaXIgL2Rldi9ib3Jpbmdzc2wgMDc1NSByb290IHJvb3QKQEAgLTk0LDYgKzkyLDEyIEBACiAgICAgIyBjaGVja2VyIHByb2dyYW1zLgogICAgIG1rZGlyIC9kZXYvZnNja2xvZ3MgMDc3MCByb290IHN5c3RlbQogCisgICAgIyBDcmVhdGUgdG1wZnMgZm9yIHVzZSBieSB0aGUgc2hlbGwgdXNlci4KKyAgICBtb3VudCB0bXBmcyB0bXBmcyAvdG1wCisgICAgcmVzdG9yZWNvbiAvdG1wCisgICAgY2hvd24gc2hlbGwgc2hlbGwgL3RtcAorICAgIGNobW9kIDA3NzEgL3RtcAorCiBvbiBpbml0CiAgICAgc3lzY2xrdHogMAogCkBAIC0xMDUsNiArMTA5LDkgQEAKICAgICBzeW1saW5rIC9wcm9jL3NlbGYvZmQvMSAvZGV2L3N0ZG91dAogICAgIHN5bWxpbmsgL3Byb2Mvc2VsZi9mZC8yIC9kZXYvc3RkZXJyCiAKKyAgICAjIENyZWF0ZSBzb2NrZXQgZGlyIGZvciBvdC1kYWVtb24KKyAgICBta2RpciAvZGV2L3NvY2tldC9vdC1kYWVtb24gMDc3MCB0aHJlYWRfbmV0d29yayB0aHJlYWRfbmV0d29yaworCiAgICAgIyBDcmVhdGUgZW5lcmd5LWF3YXJlIHNjaGVkdWxlciB0dW5pbmcgbm9kZXMKICAgICBta2RpciAvZGV2L3N0dW5lL2ZvcmVncm91bmQKICAgICBta2RpciAvZGV2L3N0dW5lL2JhY2tncm91bmQKQEAgLTIyMSwyNiArMjI4LDYgQEAKICAgICB3cml0ZSAvZGV2L3N0dW5lL25uYXBpLWhhbC9zY2hlZHR1bmUuYm9vc3QgMQogICAgIHdyaXRlIC9kZXYvc3R1bmUvbm5hcGktaGFsL3NjaGVkdHVuZS5wcmVmZXJfaWRsZSAxCiAKLSAgICAjIENyZWF0ZSBibGtpbyBncm91cCBhbmQgYXBwbHkgaW5pdGlhbCBzZXR0aW5ncy4KLSAgICAjIFRoaXMgZmVhdHVyZSBuZWVkcyBrZXJuZWwgdG8gc3VwcG9ydCBpdCwgYW5kIHRoZQotICAgICMgZGV2aWNlJ3MgaW5pdC5yYyBtdXN0IGFjdHVhbGx5IHNldCB0aGUgY29ycmVjdCB2YWx1ZXMuCi0gICAgbWtkaXIgL2Rldi9ibGtpby9iYWNrZ3JvdW5kCi0gICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2Jsa2lvCi0gICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2Jsa2lvL2JhY2tncm91bmQKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvYmxraW8vdGFza3MKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvYmxraW8vYmFja2dyb3VuZC90YXNrcwotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9ibGtpby9jZ3JvdXAucHJvY3MKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvYmxraW8vYmFja2dyb3VuZC9jZ3JvdXAucHJvY3MKLSAgICBjaG1vZCAwNjY0IC9kZXYvYmxraW8vdGFza3MKLSAgICBjaG1vZCAwNjY0IC9kZXYvYmxraW8vYmFja2dyb3VuZC90YXNrcwotICAgIGNobW9kIDA2NjQgL2Rldi9ibGtpby9jZ3JvdXAucHJvY3MKLSAgICBjaG1vZCAwNjY0IC9kZXYvYmxraW8vYmFja2dyb3VuZC9jZ3JvdXAucHJvY3MKLSAgICB3cml0ZSAvZGV2L2Jsa2lvL2Jsa2lvLndlaWdodCAxMDAwCi0gICAgd3JpdGUgL2Rldi9ibGtpby9iYWNrZ3JvdW5kL2Jsa2lvLndlaWdodCAyMDAKLSAgICB3cml0ZSAvZGV2L2Jsa2lvL2JhY2tncm91bmQvYmxraW8uYmZxLndlaWdodCAxMAotICAgIHdyaXRlIC9kZXYvYmxraW8vYmxraW8uZ3JvdXBfaWRsZSAwCi0gICAgd3JpdGUgL2Rldi9ibGtpby9iYWNrZ3JvdW5kL2Jsa2lvLmdyb3VwX2lkbGUgMAotCiAgICAgcmVzdG9yZWNvbl9yZWN1cnNpdmUgL21udAogCiAgICAgbW91bnQgY29uZmlnZnMgbm9uZSAvY29uZmlnIG5vZGV2IG5vZXhlYyBub3N1aWQKQEAgLTQ4MSwxNCArNDY4LDcgQEAKICAgICBzdGFydCB2bmRzZXJ2aWNlbWFuYWdlcgogCiAjIFJ1biBib3Jpbmdzc2wgc2VsZiB0ZXN0IGZvciBlYWNoIEFCSS4gIEFueSBmYWlsdXJlcyB0cmlnZ2VyIHJlYm9vdCB0byBmaXJtd2FyZS4KLW9uIGluaXQgJiYgcHJvcGVydHk6cm8ucHJvZHVjdC5jcHUuYWJpbGlzdDMyPSoKLSAgICBleGVjX3N0YXJ0IGJvcmluZ3NzbF9zZWxmX3Rlc3QzMgotb24gaW5pdCAmJiBwcm9wZXJ0eTpyby5wcm9kdWN0LmNwdS5hYmlsaXN0NjQ9KgotICAgIGV4ZWNfc3RhcnQgYm9yaW5nc3NsX3NlbGZfdGVzdDY0Ci1vbiBwcm9wZXJ0eTphcGV4ZC5zdGF0dXM9cmVhZHkgJiYgcHJvcGVydHk6cm8ucHJvZHVjdC5jcHUuYWJpbGlzdDMyPSoKLSAgICBleGVjX3N0YXJ0IGJvcmluZ3NzbF9zZWxmX3Rlc3RfYXBleDMyCi1vbiBwcm9wZXJ0eTphcGV4ZC5zdGF0dXM9cmVhZHkgJiYgcHJvcGVydHk6cm8ucHJvZHVjdC5jcHUuYWJpbGlzdDY0PSoKLSAgICBleGVjX3N0YXJ0IGJvcmluZ3NzbF9zZWxmX3Rlc3RfYXBleDY0CitpbXBvcnQgL3N5c3RlbS9ldGMvaW5pdC9ody9pbml0LmJvcmluZ3NzbC4ke3JvLnp5Z290ZX0ucmMKIAogc2VydmljZSBib3Jpbmdzc2xfc2VsZl90ZXN0MzIgL3N5c3RlbS9iaW4vYm9yaW5nc3NsX3NlbGZfdGVzdDMyCiAgICAgcmVib290X29uX2ZhaWx1cmUgcmVib290LGJvcmluZ3NzbC1zZWxmLWNoZWNrLWZhaWxlZApAQCAtNTUzLDcgKzUzMyw3IEBACiAgICAgIyBTaG91bGQgYmUgYmVmb3JlIG5ldGQsIGJ1dCBhZnRlciBhcGV4LCBwcm9wZXJ0aWVzIGFuZCBsb2dnaW5nIGlzIGF2YWlsYWJsZS4KICAgICB0cmlnZ2VyIGxvYWRfYnBmX3Byb2dyYW1zCiAKLSAgICAjIE5vdyB3ZSBjYW4gc3RhcnQgenlnb3RlIGZvciBkZXZpY2VzIHdpdGggZmlsZSBiYXNlZCBlbmNyeXB0aW9uCisgICAgIyBOb3cgd2UgY2FuIHN0YXJ0IHp5Z290ZS4KICAgICB0cmlnZ2VyIHp5Z290ZS1zdGFydAogCiAgICAgIyBSZW1vdmUgYSBmaWxlIHRvIHdha2UgdXAgYW55dGhpbmcgd2FpdGluZyBmb3IgZmlybXdhcmUuCkBAIC02MjQsOCArNjA0LDggQEAKICAgICBjaG1vZCAwNzAwIC9tZXRhZGF0YS92b2xkCiAgICAgbWtkaXIgL21ldGFkYXRhL3Bhc3N3b3JkX3Nsb3RzIDA3NzEgcm9vdCBzeXN0ZW0KICAgICBta2RpciAvbWV0YWRhdGEvYm9vdHN0YXQgMDc1MCBzeXN0ZW0gbG9nCi0gICAgbWtkaXIgL21ldGFkYXRhL290YSAwNzAwIHJvb3Qgc3lzdGVtCi0gICAgbWtkaXIgL21ldGFkYXRhL290YS9zbmFwc2hvdHMgMDcwMCByb290IHN5c3RlbQorICAgIG1rZGlyIC9tZXRhZGF0YS9vdGEgMDc1MCByb290IHN5c3RlbQorICAgIG1rZGlyIC9tZXRhZGF0YS9vdGEvc25hcHNob3RzIDA3NTAgcm9vdCBzeXN0ZW0KICAgICBta2RpciAvbWV0YWRhdGEvdXNlcnNwYWNlcmVib290IDA3NzAgcm9vdCBzeXN0ZW0KICAgICBta2RpciAvbWV0YWRhdGEvd2F0Y2hkb2cgMDc3MCByb290IHN5c3RlbQogCkBAIC02MzksNyArNjE5LDYgQEAKICAgICByZXN0b3JlY29uX3JlY3Vyc2l2ZSAvbWV0YWRhdGEvYXBleAogCiAgICAgbWtkaXIgL21ldGFkYXRhL3N0YWdlZC1pbnN0YWxsIDA3NzAgcm9vdCBzeXN0ZW0KLSAgICBta2RpciAvbWV0YWRhdGEvc2Vwb2xpY3kgMDcwMCByb290IHJvb3QKIG9uIGxhdGUtZnMKICAgICAjIEVuc3VyZSB0aGF0IHRyYWNlZnMgaGFzIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zLgogICAgICMgVGhpcyBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBpZiBpdCBpcyBjYWxsZWQgaW4gcG9zdC1mcy4KQEAgLTgwNiw3ICs3ODUsNiBAQAogICAgIG1rZGlyIC9kYXRhL21pc2MvdnBuIDA3NzAgc3lzdGVtIHZwbgogICAgIG1rZGlyIC9kYXRhL21pc2Mvc2hhcmVkX3JlbHJvIDA3NzEgc2hhcmVkX3JlbHJvIHNoYXJlZF9yZWxybwogICAgIG1rZGlyIC9kYXRhL21pc2Mvc3lzdGVta2V5cyAwNzAwIHN5c3RlbSBzeXN0ZW0KLSAgICBta2RpciAvZGF0YS9taXNjL3RocmVhZG5ldHdvcmsgMDc3MCB0aHJlYWRfbmV0d29yayB0aHJlYWRfbmV0d29yawogICAgIG1rZGlyIC9kYXRhL21pc2Mvd2lmaSAwNzcwIHdpZmkgd2lmaQogICAgIG1rZGlyIC9kYXRhL21pc2Mvd2lmaS9zb2NrZXRzIDA3NzAgd2lmaSB3aWZpCiAgICAgbWtkaXIgL2RhdGEvbWlzYy93aWZpL3dwYV9zdXBwbGljYW50IDA3NzAgd2lmaSB3aWZpCkBAIC04MzgsNiArODE2LDcgQEAKICAgICBta2RpciAvZGF0YS9taXNjL2FwZXhkYXRhIDA3MTEgcm9vdCByb290CiAgICAgbWtkaXIgL2RhdGEvbWlzYy9hcGV4cm9sbGJhY2sgMDcwMCByb290IHJvb3QKICAgICBta2RpciAvZGF0YS9taXNjL2FwcGNvbXBhdC8gMDcwMCBzeXN0ZW0gc3lzdGVtCisgICAgbWtkaXIgL2RhdGEvbWlzYy91cHJvYmVzdGF0cy1jb25maWdzLyAwNzc3IHVwcm9iZXN0YXRzIHVwcm9iZXN0YXRzCiAgICAgbWtkaXIgL2RhdGEvbWlzYy9zbmFwc2hvdGN0bF9sb2cgMDc1NSByb290IHJvb3QKICAgICAjIGNyZWF0ZSBsb2NhdGlvbiB0byBzdG9yZSBwcmUtcmVib290IGluZm9ybWF0aW9uCiAgICAgbWtkaXIgL2RhdGEvbWlzYy9wcmVyZWJvb3QgMDcwMCBzeXN0ZW0gc3lzdGVtCkBAIC05MzksMTUgKzkxOCwyMiBAQAogICAgICMgZW5jcnlwdGlvbiBwb2xpY2llcyBhcHBseSByZWN1cnNpdmVseS4gIFRoZXNlIGRpcmVjdG9yaWVzIHNob3VsZCBuZXZlcgogICAgICMgY29udGFpbiBhbnkgc3ViZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgcGVyLXVzZXIgb25lcy4gIC9kYXRhL21lZGlhL29iYgogICAgICMgaXMgYW4gZXhjZXB0aW9uIHRoYXQgZXhpc3RzIGZvciBsZWdhY3kgcmVhc29ucy4KLSAgICBta2RpciAvZGF0YS9tZWRpYSAwNzcwIG1lZGlhX3J3IG1lZGlhX3J3IGVuY3J5cHRpb249Tm9uZQotICAgIG1rZGlyIC9kYXRhL21pc2NfY2UgMDE3NzEgc3lzdGVtIG1pc2MgZW5jcnlwdGlvbj1Ob25lCi0gICAgbWtkaXIgL2RhdGEvbWlzY19kZSAwMTc3MSBzeXN0ZW0gbWlzYyBlbmNyeXB0aW9uPU5vbmUKLSAgICBta2RpciAvZGF0YS9zeXN0ZW1fY2UgMDc3MCBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249Tm9uZQotICAgIG1rZGlyIC9kYXRhL3N5c3RlbV9kZSAwNzcwIHN5c3RlbSBzeXN0ZW0gZW5jcnlwdGlvbj1Ob25lCi0gICAgbWtkaXIgL2RhdGEvdXNlciAwNzExIHN5c3RlbSBzeXN0ZW0gZW5jcnlwdGlvbj1Ob25lCi0gICAgbWtkaXIgL2RhdGEvdXNlcl9kZSAwNzExIHN5c3RlbSBzeXN0ZW0gZW5jcnlwdGlvbj1Ob25lCi0gICAgbWtkaXIgL2RhdGEvdmVuZG9yX2NlIDA3NzEgcm9vdCByb290IGVuY3J5cHRpb249Tm9uZQotICAgIG1rZGlyIC9kYXRhL3ZlbmRvcl9kZSAwNzcxIHJvb3Qgcm9vdCBlbmNyeXB0aW9uPU5vbmUKKyAgICAjCisgICAgIyBEb24ndCB1c2UgYW55IHdyaXRlIG1vZGUgYml0cyAoMDIyMikgZm9yIGFueSBvZiB0aGVzZSBkaXJlY3Rvcmllcywgc2luY2UKKyAgICAjIHRoZSBvbmx5IHByb2Nlc3MgdGhhdCBzaG91bGQgd3JpdGUgdG8gdGhlbSBkaXJlY3RseSBpcyB2b2xkIChzaW5jZSBpdAorICAgICMgbmVlZHMgdG8gc2V0IHVwIGZpbGUtYmFzZWQgZW5jcnlwdGlvbiBvbiB0aGUgc3ViZGlyZWN0b3JpZXMpLCB3aGljaCBydW5zCisgICAgIyBhcyByb290IHdpdGggQ0FQX0RBQ19PVkVSUklERS4gIFRoaXMgaXMgYWxzbyBmdWxseSBlbmZvcmNlZCB2aWEgdGhlCisgICAgIyBTRUxpbnV4IHBvbGljeS4gIEJ1dCB3ZSBhbHNvIHNldCB0aGUgREFDIGZpbGUgbW9kZXMgYWNjb3JkaW5nbHksIHRvIHRyeSB0bworICAgICMgbWluaW1pemUgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3IgaWYgU0VMaW51eCBpcyBzZXQgdG8gcGVybWlzc2l2ZSBtb2RlLgorICAgIG1rZGlyIC9kYXRhL21lZGlhIDA1NTAgbWVkaWFfcncgbWVkaWFfcncgZW5jcnlwdGlvbj1Ob25lCisgICAgbWtkaXIgL2RhdGEvbWlzY19jZSAwNTUxIHN5c3RlbSBtaXNjIGVuY3J5cHRpb249Tm9uZQorICAgIG1rZGlyIC9kYXRhL21pc2NfZGUgMDU1MSBzeXN0ZW0gbWlzYyBlbmNyeXB0aW9uPU5vbmUKKyAgICBta2RpciAvZGF0YS9zeXN0ZW1fY2UgMDU1MCBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249Tm9uZQorICAgIG1rZGlyIC9kYXRhL3N5c3RlbV9kZSAwNTUwIHN5c3RlbSBzeXN0ZW0gZW5jcnlwdGlvbj1Ob25lCisgICAgbWtkaXIgL2RhdGEvdXNlciAwNTExIHN5c3RlbSBzeXN0ZW0gZW5jcnlwdGlvbj1Ob25lCisgICAgbWtkaXIgL2RhdGEvdXNlcl9kZSAwNTExIHN5c3RlbSBzeXN0ZW0gZW5jcnlwdGlvbj1Ob25lCisgICAgbWtkaXIgL2RhdGEvdmVuZG9yX2NlIDA1NTEgcm9vdCByb290IGVuY3J5cHRpb249Tm9uZQorICAgIG1rZGlyIC9kYXRhL3ZlbmRvcl9kZSAwNTUxIHJvb3Qgcm9vdCBlbmNyeXB0aW9uPU5vbmUKIAogICAgICMgU2V0IHRoZSBjYXNlZm9sZCBmbGFnIG9uIC9kYXRhL21lZGlhLiAgRm9yIHVwZ3JhZGVzLCBhIHJlc3RvcmVjb24gY2FuIGJlCiAgICAgIyBuZWVkZWQgZmlyc3QgdG8gcmVsYWJlbCB0aGUgZGlyZWN0b3J5IGZyb20gbWVkaWFfcndfZGF0YV9maWxlLgpAQCAtMTAxMCw3ICs5OTYsNyBAQAogICAgIHBlcmZvcm1fYXBleF9jb25maWcKIAogICAgICMgQ3JlYXRlIGRpcmVjdG9yaWVzIGZvciBib290IGFuaW1hdGlvbi4KLSAgICBta2RpciAvZGF0YS9ib290YW5pbSAwNzU1IHN5c3RlbSBzeXN0ZW0gZW5jcnlwdGlvbj1EZWxldGVJZk5lY2Vzc2FyeQorICAgIG1rZGlyIC9kYXRhL21pc2MvYm9vdGFuaW0gMDc1NSBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249RGVsZXRlSWZOZWNlc3NhcnkKIAogICAgIGV4ZWNfc3RhcnQgZGVyaXZlX3NkawogCkBAIC0xMDM0LDEzICsxMDIwLDkgQEAKICAgICAjIE11c3Qgc3RhcnQgYWZ0ZXIgJ2Rlcml2ZV9jbGFzc3BhdGgnIHRvIGhhdmUgKkNMQVNTUEFUSCB2YXJpYWJsZXMgc2V0LgogICAgIHN0YXJ0IG9kc2lnbgogCi0gICAgIyBCZWZvcmUgd2UgY2FuIGxvY2sga2V5cyBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBib290IHN0YWdlLCB3YWl0IGZvcgotICAgICMgb2RzaWduIHRvIGJlIGRvbmUgd2l0aCB0aGUga2V5CisgICAgIyBXYWl0IGZvciBvZHNpZ24gdG8gYmUgZG9uZSB3aXRoIHRoZSBrZXkuCiAgICAgd2FpdF9mb3JfcHJvcCBvZHNpZ24ua2V5LmRvbmUgMQogCi0gICAgIyBMb2NrIHRoZSBmcy12ZXJpdHkga2V5cmluZywgc28gbm8gbW9yZSBrZXlzIGNhbiBiZSBhZGRlZAotICAgIGV4ZWMgLS0gL3N5c3RlbS9iaW4vZnN2ZXJpdHlfaW5pdCAtLWxvY2sKLQogICAgICMgQnVtcCB0aGUgYm9vdCBsZXZlbCB0byAxMDAwMDAwMDAwOyB0aGlzIHByZXZlbnRzIGZ1cnRoZXIgb24tZGV2aWNlIHNpZ25pbmcuCiAgICAgIyBUaGlzIGlzIGEgc3BlY2lhbCB2YWx1ZSB0aGF0IHNodXRzIGRvd24gdGhlIHRocmVhZCB3aGljaCBsaXN0ZW5zIGZvcgogICAgICMgZnVydGhlciB1cGRhdGVzLgpAQCAtMTA2OSwyOCArMTA1MSwxMCBAQAogCiAjIEl0IGlzIHJlY29tbWVuZGVkIHRvIHB1dCB1bm5lY2Vzc2FyeSBkYXRhLyBpbml0aWFsaXphdGlvbiBmcm9tIHBvc3QtZnMtZGF0YQogIyB0byBzdGFydC16eWdvdGUgaW4gZGV2aWNlJ3MgaW5pdC5yYyB0byB1bmJsb2NrIHp5Z290ZSBzdGFydC4KLW9uIHp5Z290ZS1zdGFydCAmJiBwcm9wZXJ0eTpyby5jcnlwdG8uc3RhdGU9dW5lbmNyeXB0ZWQKK29uIHp5Z290ZS1zdGFydAogICAgIHdhaXRfZm9yX3Byb3Agb2RzaWduLnZlcmlmaWNhdGlvbi5kb25lIDEKICAgICAjIEEvQiB1cGRhdGUgdmVyaWZpZXIgdGhhdCBtYXJrcyBhIHN1Y2Nlc3NmdWwgYm9vdC4KLSAgICBleGVjX3N0YXJ0IHVwZGF0ZV92ZXJpZmllcl9ub25lbmNyeXB0ZWQKLSAgICBzdGFydCBzdGF0c2QKLSAgICBzdGFydCBuZXRkCi0gICAgc3RhcnQgenlnb3RlCi0gICAgc3RhcnQgenlnb3RlX3NlY29uZGFyeQotCi1vbiB6eWdvdGUtc3RhcnQgJiYgcHJvcGVydHk6cm8uY3J5cHRvLnN0YXRlPXVuc3VwcG9ydGVkCi0gICAgd2FpdF9mb3JfcHJvcCBvZHNpZ24udmVyaWZpY2F0aW9uLmRvbmUgMQotICAgICMgQS9CIHVwZGF0ZSB2ZXJpZmllciB0aGF0IG1hcmtzIGEgc3VjY2Vzc2Z1bCBib290LgotICAgIGV4ZWNfc3RhcnQgdXBkYXRlX3ZlcmlmaWVyX25vbmVuY3J5cHRlZAotICAgIHN0YXJ0IHN0YXRzZAotICAgIHN0YXJ0IG5ldGQKLSAgICBzdGFydCB6eWdvdGUKLSAgICBzdGFydCB6eWdvdGVfc2Vjb25kYXJ5Ci0KLW9uIHp5Z290ZS1zdGFydCAmJiBwcm9wZXJ0eTpyby5jcnlwdG8uc3RhdGU9ZW5jcnlwdGVkICYmIHByb3BlcnR5OnJvLmNyeXB0by50eXBlPWZpbGUKLSAgICB3YWl0X2Zvcl9wcm9wIG9kc2lnbi52ZXJpZmljYXRpb24uZG9uZSAxCi0gICAgIyBBL0IgdXBkYXRlIHZlcmlmaWVyIHRoYXQgbWFya3MgYSBzdWNjZXNzZnVsIGJvb3QuCi0gICAgZXhlY19zdGFydCB1cGRhdGVfdmVyaWZpZXJfbm9uZW5jcnlwdGVkCisgICAgZXhlY19zdGFydCB1cGRhdGVfdmVyaWZpZXIKICAgICBzdGFydCBzdGF0c2QKICAgICBzdGFydCBuZXRkCiAgICAgc3RhcnQgenlnb3RlCkBAIC0xMTAxLDYgKzEwNjUsOSBAQAogICAgIHdyaXRlIC9wcm9jL3N5cy92bS9kaXJ0eV9leHBpcmVfY2VudGlzZWNzIDIwMAogICAgIHdyaXRlIC9wcm9jL3N5cy92bS9kaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvICA1CiAKK29uIGJvb3QgJiYgcHJvcGVydHk6c3VzcGVuZC5kaXNhYmxlX3N5bmNfb25fc3VzcGVuZD10cnVlCisgICAgd3JpdGUgL3N5cy9wb3dlci9zeW5jX29uX3N1c3BlbmQgMAorCiBvbiBib290CiAgICAgIyBiYXNpYyBuZXR3b3JrIGluaXQKICAgICBpZnVwIGxvCkBAIC0xMTQyLDcgKzExMDksNyBAQAogICAgIHdyaXRlIC9kZXYvc3lzL2ZzL2J5LW5hbWUvdXNlcmRhdGEvaW9zdGF0X2VuYWJsZSAxCiAKICAgICAjIHNldCByZWFkYWhlYWQgbXVsdGlwbGllciBmb3IgUE9TSVhfRkFEVl9TRVFVRU5USUFMIGZpbGVzCi0gICAgd3JpdGUgL2Rldi9zeXMvZnMvYnktbmFtZS91c2VyZGF0YS9zZXFfZmlsZV9yYV9tdWwgMTYKKyAgICB3cml0ZSAvZGV2L3N5cy9mcy9ieS1uYW1lL3VzZXJkYXRhL3NlcV9maWxlX3JhX211bCAxMjgKIAogICAgICMgbGltaXQgZGlzY2FyZCBzaXplIHRvIDEyOE1CIGluIG9yZGVyIHRvIGF2b2lkIGxvbmcgSU8gbGF0ZW5jeQogICAgICMgZm9yIGZpbGVzeXN0ZW0gdHVuaW5nIGZpcnN0IChkbSBvciBzZGEpCmRpZmYgLS1naXQgYS9yb290ZGlyL2luaXQudXNiLnJjIGIvcm9vdGRpci9pbml0LnVzYi5yYwppbmRleCAwNzMwY2NlLi5kZGU3ODRlIDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQudXNiLnJjCisrKyBiL3Jvb3RkaXIvaW5pdC51c2IucmMKQEAgLTE4LDYgKzE4LDcgQEAKICAgICBkaXNhYmxlZAogICAgIHVwZGF0YWJsZQogICAgIHNlY2xhYmVsIHU6cjphZGJkOnMwCisgICAgdXNlciByb290CiAKIG9uIHByb3BlcnR5OnZlbmRvci5zeXMudXNiLmFkYi5kaXNhYmxlZD0qCiAgICAgc2V0cHJvcCBzeXMudXNiLmFkYi5kaXNhYmxlZCAke3ZlbmRvci5zeXMudXNiLmFkYi5kaXNhYmxlZH0KZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC56eWdvdGUzMi5yYyBiL3Jvb3RkaXIvaW5pdC56eWdvdGUzMi5yYwppbmRleCAyZjBlYzhhLi40NDJiZDE1IDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQuenlnb3RlMzIucmMKKysrIGIvcm9vdGRpci9pbml0Lnp5Z290ZTMyLnJjCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW9zZXJ2ZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBjYW1lcmFzZXJ2ZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBtZWRpYQotICAgIG9ucmVzdGFydCByZXN0YXJ0IG1lZGlhLnR1bmVyCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgLS1vbmx5LWlmLXJ1bm5pbmcgbWVkaWEudHVuZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBuZXRkCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgd2lmaWNvbmQKICAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC56eWdvdGU2NC5yYyBiL3Jvb3RkaXIvaW5pdC56eWdvdGU2NC5yYwppbmRleCA3NGE2NGM4Li4zNDIyMTIxIDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQuenlnb3RlNjQucmMKKysrIGIvcm9vdGRpci9pbml0Lnp5Z290ZTY0LnJjCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW9zZXJ2ZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBjYW1lcmFzZXJ2ZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBtZWRpYQotICAgIG9ucmVzdGFydCByZXN0YXJ0IG1lZGlhLnR1bmVyCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgLS1vbmx5LWlmLXJ1bm5pbmcgbWVkaWEudHVuZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBuZXRkCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgd2lmaWNvbmQKICAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2ggTWF4UGVyZm9ybWFuY2UKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvdWV2ZW50ZC5yYyBiL3Jvb3RkaXIvdWV2ZW50ZC5yYwppbmRleCAwYjdmZmI4Li4zOTI3NTAxIDEwMDY0NAotLS0gYS9yb290ZGlyL3VldmVudGQucmMKKysrIGIvcm9vdGRpci91ZXZlbnRkLnJjCkBAIC0yMyw2ICsyMywxMSBAQAogc3Vic3lzdGVtIGRtYV9oZWFwCiAgICBkZXZuYW1lIHVldmVudF9kZXZwYXRoCiAgICBkaXJuYW1lIC9kZXYvZG1hX2hlYXAKKworc3Vic3lzdGVtIHZmaW8KKyAgICBkZXZuYW1lIHVldmVudF9kZXZwYXRoCisgICAgZGlybmFtZSAvZGV2L3ZmaW8KKwogIyB1ZXZlbnRkIGNhbiBvbmx5IHNldCBwZXJtaXNzaW9ucyBvbiBkZXZpY2Ugbm9kZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQKICMgc3lzZnMgYXR0cmlidXRlcywgbm90IG9uIGFyYml0cmFyeSBwYXRocy4KICMKQEAgLTQzLDYgKzQ4LDcgQEAKIC9kZXYvYmluZGVyICAgICAgICAgICAgICAgMDY2NiAgIHJvb3QgICAgICAgcm9vdAogL2Rldi9od2JpbmRlciAgICAgICAgICAgICAwNjY2ICAgcm9vdCAgICAgICByb290CiAvZGV2L3ZuZGJpbmRlciAgICAgICAgICAgIDA2NjYgICByb290ICAgICAgIHJvb3QKKy9kZXYvdmZpby8qICAgICAgICAgICAgICAgMDY2NiAgIHJvb3QgICAgICAgcm9vdAogCiAvZGV2L3Btc2cwICAgICAgICAgICAgICAgIDAyMjIgICByb290ICAgICAgIGxvZwogL2Rldi9kbWFfaGVhcC9zeXN0ZW0gICAgICAwNDQ0ICAgc3lzdGVtICAgICBzeXN0ZW0KQEAgLTY1LDYgKzcxLDcgQEAKIC9kZXYvbXRwX3VzYiAgICAgICAgICAgICAgMDY2MCAgIHJvb3QgICAgICAgbXRwCiAvZGV2L3VzYl9hY2Nlc3NvcnkgICAgICAgIDA2NjAgICByb290ICAgICAgIHVzYgogL2Rldi90dW4gICAgICAgICAgICAgICAgICAwNjYwICAgc3lzdGVtICAgICB2cG4KKy9kZXYvaGlkcmF3KiAgICAgICAgICAgICAgMDY2MCAgIHN5c3RlbSAgICAgc3lzdGVtCiAKICMgQ0RNQSByYWRpbyBpbnRlcmZhY2UgTVVYCiAvZGV2L3BwcCAgICAgICAgICAgICAgICAgIDA2NjAgICByYWRpbyAgICAgIHZwbgpkaWZmIC0tZ2l0IGEvcnVuLWFzL3J1bi1hcy5jcHAgYi9ydW4tYXMvcnVuLWFzLmNwcAppbmRleCBjYzkyYzY4Li4zMjA1N2I0IDEwMDY0NAotLS0gYS9ydW4tYXMvcnVuLWFzLmNwcAorKysgYi9ydW4tYXMvcnVuLWFzLmNwcApAQCAtNzYsOSArNzYsNiBAQAogICAgIGVycm9yKDEsIGVycm5vLCAiY291bGRuJ3Qgc3RhdCAlcyIsIHBhdGgpOwogICB9CiAKLSAgLy8gL2RhdGEvdXNlci8wIGlzIGEga25vd24gc2FmZSBzeW1saW5rLgotICBpZiAoc3RyY21wKCIvZGF0YS91c2VyLzAiLCBwYXRoKSA9PSAwKSByZXR1cm47Ci0KICAgLy8gTXVzdCBiZSBhIHJlYWwgZGlyZWN0b3J5LCBub3QgYSBzeW1saW5rLgogICBpZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKICAgICBlcnJvcigxLCAwLCAiJXMgbm90IGEgZGlyZWN0b3J5OiAlbyIsIHBhdGgsIHN0LnN0X21vZGUpOwpAQCAtMTkxLDI3ICsxODgsMTcgQEAKICAgfQogCiAgIC8vIFJldHJpZXZlIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSBzeXN0ZW0sIHN3aXRjaGluZyBlZ2lkIHNvIHdlIGNhbiByZWFkIHRoZSBmaWxlLgorICBwa2dfaW5mbyBpbmZvID0gey5uYW1lID0gcGtnbmFtZX07CiAgIGdpZF90IG9sZF9lZ2lkID0gZ2V0ZWdpZCgpOwogICBpZiAoc2V0ZWdpZChBSURfUEFDS0FHRV9JTkZPKSA9PSAtMSkgZXJyb3IoMSwgZXJybm8sICJzZXRlZ2lkKEFJRF9QQUNLQUdFX0lORk8pIGZhaWxlZCIpOwotICBwa2dfaW5mbyBpbmZvOwotICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0gIGluZm8ubmFtZSA9IHBrZ25hbWU7CiAgIGlmICghcGFja2FnZWxpc3RfcGFyc2UocGFja2FnZWxpc3RfcGFyc2VfY2FsbGJhY2ssICZpbmZvKSkgewogICAgIGVycm9yKDEsIGVycm5vLCAicGFja2FnZWxpc3RfcGFyc2UgZmFpbGVkIik7CiAgIH0KLQotICAvLyBIYW5kbGUgYSBtdWx0aS11c2VyIGRhdGEgcGF0aAotICBpZiAodXNlcklkID4gMCkgewotICAgIGZyZWUoaW5mby5kYXRhX2Rpcik7Ci0gICAgaWYgKGFzcHJpbnRmKCZpbmZvLmRhdGFfZGlyLCAiL2RhdGEvdXNlci8lZC8lcyIsIHVzZXJJZCwgcGtnbmFtZSkgPT0gLTEpIHsKLSAgICAgIGVycm9yKDEsIGVycm5vLCAiYXNwcmludGYgZmFpbGVkIik7Ci0gICAgfQotICB9CisgIGlmIChzZXRlZ2lkKG9sZF9lZ2lkKSA9PSAtMSkgZXJyb3IoMSwgZXJybm8sICJjb3VsZG4ndCByZXN0b3JlIGVnaWQiKTsKIAogICBpZiAoaW5mby51aWQgPT0gMCkgewogICAgIGVycm9yKDEsIDAsICJ1bmtub3duIHBhY2thZ2U6ICVzIiwgcGtnbmFtZSk7CiAgIH0KLSAgaWYgKHNldGVnaWQob2xkX2VnaWQpID09IC0xKSBlcnJvcigxLCBlcnJubywgImNvdWxkbid0IHJlc3RvcmUgZWdpZCIpOwogCiAgIC8vIFZlcmlmeSB0aGF0IHVzZXIgaWQgaXMgbm90IHRvbyBiaWcuCiAgIGlmICgoVUlEX01BWCAtIGluZm8udWlkKSAvIEFJRF9VU0VSX09GRlNFVCA8ICh1aWRfdCl1c2VySWQpIHsKQEAgLTIzMSw2ICsyMTgsMTIgQEAKICAgICBlcnJvcigxLCAwLCAicGFja2FnZSBub3QgZGVidWdnYWJsZTogJXMiLCBwa2duYW1lKTsKICAgfQogCisgIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBkYXRhIHBhdGggZm9yIHRoZSBzcGVjaWZpYyB1c2VyLgorICBmcmVlKGluZm8uZGF0YV9kaXIpOworICBpZiAoYXNwcmludGYoJmluZm8uZGF0YV9kaXIsICIvZGF0YS91c2VyLyVkLyVzIiwgdXNlcklkLCBwa2duYW1lKSA9PSAtMSkgeworICAgIGVycm9yKDEsIGVycm5vLCAiYXNwcmludGYgZmFpbGVkIik7CisgIH0KKwogICAvLyBDaGVjayB0aGF0IHRoZSBkYXRhIGRpcmVjdG9yeSBwYXRoIGlzIHZhbGlkLgogICBjaGVja19kYXRhX3BhdGgocGtnbmFtZSwgaW5mby5kYXRhX2RpciwgdXNlckFwcElkKTsKIApkaWZmIC0tZ2l0IGEvc3RvcmFnZWQvQW5kcm9pZC5icCBiL3N0b3JhZ2VkL0FuZHJvaWQuYnAKaW5kZXggYzM0NDdkMi4uMzU3YzBlNiAxMDA2NDQKLS0tIGEvc3RvcmFnZWQvQW5kcm9pZC5icAorKysgYi9zdG9yYWdlZC9BbmRyb2lkLmJwCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjItbmRrIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLVYzLW5kayIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKQEAgLTEzNiwzICsxMzYsMzcgQEAKICAgICBdLAogICAgIHBhdGg6ICJiaW5kZXIiLAogfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogInN0b3JhZ2VkX3NlcnZpY2VfZnV6emVyX2RlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAic3RvcmFnZWRfZGVmYXVsdHMiLAorICAgICAgICAic2VydmljZV9mdXp6ZXJfZGVmYXVsdHMiLAorICAgICAgICAiZnV6emVyX2Rpc2FibGVfbGVha3MiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0b3JhZ2VkIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiZHZhbmRlckBnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgdHJpYWdlX2Fzc2lnbmVlOiAid2FnaHBhd2FuQGdvb2dsZS5jb20iLAorICAgIH0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJzdG9yYWdlZF9zZXJ2aWNlX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInN0b3JhZ2VkX3NlcnZpY2VfZnV6emVyX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHNyY3M6IFsidGVzdHMvZnV6emVycy9zdG9yYWdlZF9zZXJ2aWNlX2Z1enplci5jcHAiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogInN0b3JhZ2VkX3ByaXZhdGVfc2VydmljZV9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJzdG9yYWdlZF9zZXJ2aWNlX2Z1enplcl9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBzcmNzOiBbInRlc3RzL2Z1enplcnMvc3RvcmFnZWRfcHJpdmF0ZV9zZXJ2aWNlX2Z1enplci5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL3N0b3JhZ2VkL2luY2x1ZGUvc3RvcmFnZWRfc2VydmljZS5oIGIvc3RvcmFnZWQvaW5jbHVkZS9zdG9yYWdlZF9zZXJ2aWNlLmgKaW5kZXggN2VjNjg2NC4uYmY3YWY4MCAxMDA2NDQKLS0tIGEvc3RvcmFnZWQvaW5jbHVkZS9zdG9yYWdlZF9zZXJ2aWNlLmgKKysrIGIvc3RvcmFnZWQvaW5jbHVkZS9zdG9yYWdlZF9zZXJ2aWNlLmgKQEAgLTI4LDYgKzI4LDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpvczsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpvczo6c3RvcmFnZWQ7CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKIGNsYXNzIFN0b3JhZ2VkU2VydmljZSA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPFN0b3JhZ2VkU2VydmljZT4sIHB1YmxpYyBCblN0b3JhZ2VkIHsKIHByaXZhdGU6CiAgICAgdm9pZCBkdW1wVWlkUmVjb3Jkc0RlYnVnKGludCBmZCwgY29uc3QgdmVjdG9yPHN0cnVjdCB1aWRfcmVjb3JkPiYgZW50cmllcyk7CkBAIC01Myw0ICs1NCw1IEBACiAKIHNwPElTdG9yYWdlZFByaXZhdGU+IGdldF9zdG9yYWdlZF9wcmlfc2VydmljZSgpOwogCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2VuZGlmIC8qIF9TVE9SQUdFRF9TRVJWSUNFX0hfICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3RvcmFnZWQvc3RvcmFnZWRfc2VydmljZS5jcHAgYi9zdG9yYWdlZC9zdG9yYWdlZF9zZXJ2aWNlLmNwcAppbmRleCA0NWYxZDRkLi4wMGQzNmQ3IDEwMDY0NAotLS0gYS9zdG9yYWdlZC9zdG9yYWdlZF9zZXJ2aWNlLmNwcAorKysgYi9zdG9yYWdlZC9zdG9yYWdlZF9zZXJ2aWNlLmNwcApAQCAtMzgsNiArMzgsNyBAQAogCiBleHRlcm4gc3A8c3RvcmFnZWRfdD4gc3RvcmFnZWRfc3A7CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKIHN0YXR1c190IFN0b3JhZ2VkU2VydmljZTo6c3RhcnQoKSB7CiAgICAgcmV0dXJuIEJpbmRlclNlcnZpY2U8U3RvcmFnZWRTZXJ2aWNlPjo6cHVibGlzaCgpOwogfQpAQCAtMjE4LDMgKzIxOSw0IEBACiAKICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVN0b3JhZ2VkUHJpdmF0ZT4oYmluZGVyKTsKIH0KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3RvcmFnZWQvdGVzdHMvZnV6emVycy9zdG9yYWdlZF9wcml2YXRlX3NlcnZpY2VfZnV6emVyLmNwcCBiL3N0b3JhZ2VkL3Rlc3RzL2Z1enplcnMvc3RvcmFnZWRfcHJpdmF0ZV9zZXJ2aWNlX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlYjc5NgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JhZ2VkL3Rlc3RzL2Z1enplcnMvc3RvcmFnZWRfcHJpdmF0ZV9zZXJ2aWNlX2Z1enplci5jcHAKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmdXp6YmluZGVyL2xpYmJpbmRlcl9kcml2ZXIuaD4KKworI2luY2x1ZGUgPHN0b3JhZ2VkLmg+CisjaW5jbHVkZSA8c3RvcmFnZWRfc2VydmljZS5oPgorCitzcDxzdG9yYWdlZF90PiBzdG9yYWdlZF9zcDsKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplckluaXRpYWxpemUoaW50IC8qKmFyZ2MqLywgY2hhciAvKioqKmFyZ3YqLykgeworICAgIHN0b3JhZ2VkX3NwID0gbmV3IHN0b3JhZ2VkX3QoKTsKKyAgICBzdG9yYWdlZF9zcC0+aW5pdCgpOworICAgIHJldHVybiAwOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgYXV0byBzdG9yYWdlZFByaXZhdGVTZXJ2aWNlID0gbmV3IFN0b3JhZ2VkUHJpdmF0ZVNlcnZpY2UoKTsKKyAgICBmdXp6U2VydmljZShzdG9yYWdlZFByaXZhdGVTZXJ2aWNlLCBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSkpOworICAgIHJldHVybiAwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0b3JhZ2VkL3Rlc3RzL2Z1enplcnMvc3RvcmFnZWRfc2VydmljZV9mdXp6ZXIuY3BwIGIvc3RvcmFnZWQvdGVzdHMvZnV6emVycy9zdG9yYWdlZF9zZXJ2aWNlX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExZWNjMwotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JhZ2VkL3Rlc3RzL2Z1enplcnMvc3RvcmFnZWRfc2VydmljZV9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnV6emJpbmRlci9saWJiaW5kZXJfZHJpdmVyLmg+CisKKyNpbmNsdWRlIDxzdG9yYWdlZC5oPgorI2luY2x1ZGUgPHN0b3JhZ2VkX3NlcnZpY2UuaD4KKworc3A8c3RvcmFnZWRfdD4gc3RvcmFnZWRfc3A7CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJJbml0aWFsaXplKGludCAvKiphcmdjKi8sIGNoYXIgLyoqKiphcmd2Ki8pIHsKKyAgICBzdG9yYWdlZF9zcCA9IG5ldyBzdG9yYWdlZF90KCk7CisgICAgc3RvcmFnZWRfc3AtPmluaXQoKTsKKyAgICByZXR1cm4gMDsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGF1dG8gc3RvcmFnZWRTZXJ2aWNlID0gbmV3IFN0b3JhZ2VkU2VydmljZSgpOworICAgIGZ1enpTZXJ2aWNlKHN0b3JhZ2VkU2VydmljZSwgRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpKTsKKyAgICByZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29sYm94L2dldGV2ZW50LmMgYi90b29sYm94L2dldGV2ZW50LmMKaW5kZXggZTJjNzdjMy4uZjY1YmIyMCAxMDA2NDQKLS0tIGEvdG9vbGJveC9nZXRldmVudC5jCisrKyBiL3Rvb2xib3gvZ2V0ZXZlbnQuYwpAQCAtMTExLDggKzExMSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBiaXRzX3NpemUgPSByZXMgKyAxNjsKICAgICAgICAgICAgIGJpdHMgPSByZWFsbG9jKGJpdHMsIGJpdHNfc2l6ZSAqIDIpOwotICAgICAgICAgICAgaWYoYml0cyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGVycigxLCAiZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBvZiBzaXplICVkXG4iLCAoaW50KWJpdHNfc2l6ZSk7CisgICAgICAgICAgICBpZiAoYml0cyA9PSBOVUxMKSBlcnIoMSwgImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgb2Ygc2l6ZSAlemQiLCBiaXRzX3NpemUpOwogICAgICAgICB9CiAgICAgICAgIHJlczIgPSAwOwogICAgICAgICBzd2l0Y2goaSkgewpkaWZmIC0tZ2l0IGEvdHJ1c3R5L09XTkVSUyBiL3RydXN0eS9PV05FUlMKaW5kZXggNjFiOTdjNi4uNDAxNjc5MiAxMDA2NDQKLS0tIGEvdHJ1c3R5L09XTkVSUworKysgYi90cnVzdHkvT1dORVJTCkBAIC0yLDcgKzIsNyBAQAogYXJ2ZUBhbmRyb2lkLmNvbQogZGFuaWVsYW5nZWxsQGdvb2dsZS5jb20KIGdtYXJAZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCittaWtlbWN0ZXJuYW5AZ29vZ2xlLmNvbQogbW1hdXJlckBnb29nbGUuY29tCiBuY2JyYXlAZ29vZ2xlLmNvbQogc3dpbGxkZW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2FwcGxvYWRlci9hcHBsb2FkZXIuY3BwIGIvdHJ1c3R5L2FwcGxvYWRlci9hcHBsb2FkZXIuY3BwCmluZGV4IDE3ZDA4M2MuLjA5MTVlYWIgMTAwNjQ0Ci0tLSBhL3RydXN0eS9hcHBsb2FkZXIvYXBwbG9hZGVyLmNwcAorKysgYi90cnVzdHkvYXBwbG9hZGVyL2FwcGxvYWRlci5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxCdWZmZXJBbGxvY2F0b3IvQnVmZmVyQWxsb2NhdG9yLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxnZXRvcHQuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CkBAIC0xMDYsNyArMTA3LDExIEBACiAgICAgICAgIHJldHVybiB7fTsKICAgICB9CiAKLSAgICBhc3NlcnQoc3Quc3Rfc2l6ZSA+PSAwKTsKKyAgICBpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlplcm8gbGVuZ3RoIGZpbGUgJyIgPDwgZmlsZV9uYW1lIDw8ICInIjsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKwogICAgIGZpbGVfc2l6ZSA9IHN0LnN0X3NpemU7CiAKICAgICAvKiBUaGUgZG1hYnVmIHNpemUgbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplICovCkBAIC0xMjIsNyArMTI3LDggQEAKICAgICBCdWZmZXJBbGxvY2F0b3IgYWxsb2M7CiAgICAgdW5pcXVlX2ZkIGRtYWJ1Zl9mZChhbGxvYy5BbGxvYyhrRG1hYnVmU3lzdGVtSGVhcE5hbWUsIGZpbGVfcGFnZV9zaXplKSk7CiAgICAgaWYgKCFkbWFidWZfZmQub2soKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciBjcmVhdGluZyBkbWFidWY6ICIgPDwgZG1hYnVmX2ZkLmdldCgpOworICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciBjcmVhdGluZyBkbWFidWYgZm9yICIgPDwgZmlsZV9wYWdlX3NpemUKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJ5dGVzOiAiIDw8IGRtYWJ1Zl9mZC5nZXQoKTsKICAgICAgICAgcmV0dXJuIGRtYWJ1Zl9mZDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3RydXN0eS9hcHBsb2FkZXIvZnV6ei9hcHBfZnV6emVyLmNwcCBiL3RydXN0eS9hcHBsb2FkZXIvZnV6ei9hcHBfZnV6emVyLmNwcAppbmRleCBhYTBjYWNhLi4wYTAzN2Y5IDEwMDY0NAotLS0gYS90cnVzdHkvYXBwbG9hZGVyL2Z1enovYXBwX2Z1enplci5jcHAKKysrIGIvdHJ1c3R5L2FwcGxvYWRlci9mdXp6L2FwcF9mdXp6ZXIuY3BwCkBAIC00MywxMCArNDMsNiBAQAogICAgICAgICB7MHhiNSwgMHhlOCwgMHhhNywgMHhlOSwgMHhlZiwgMHgxNywgMHgzYSwgMHg5N30sCiB9OwogCi1zdGF0aWMgaW5saW5lIHVpbnRwdHJfdCBSb3VuZFBhZ2VVcCh1aW50cHRyX3QgdmFsKSB7Ci0gICAgcmV0dXJuICh2YWwgKyAoUEFHRV9TSVpFIC0gMSkpICYgfihQQUdFX1NJWkUgLSAxKTsKLX0KLQogc3RhdGljIGJvb2wgU2VuZExvYWRNc2coaW50IGNoYW4sIGludCBkbWFfYnVmLCBzaXplX3QgZG1hX2J1Zl9zaXplKSB7CiAgICAgYXBwbG9hZGVyX2hlYWRlciBoZHIgPSB7CiAgICAgICAgICAgICAuY21kID0gQVBQTE9BREVSX0NNRF9MT0FEX0FQUExJQ0FUSU9OLApAQCAtMTA3LDcgKzEwMyw3IEBACiAgICAgICAgIGFuZHJvaWQ6OnRydXN0eTo6ZnV6ejo6QWJvcnQoKTsKICAgICB9CiAKLSAgICB1aW50NjRfdCBzaG1fbGVuID0gc2l6ZSA/IFJvdW5kUGFnZVVwKHNpemUpIDogUEFHRV9TSVpFOworICAgIHVpbnQ2NF90IHNobV9sZW4gPSBzaXplID8gc2l6ZSA6IDQwOTY7CiAgICAgQnVmZmVyQWxsb2NhdG9yIGFsbG9jOwogICAgIHVuaXF1ZV9mZCBkbWFfYnVmKGFsbG9jLkFsbG9jKGtEbWFidWZTeXN0ZW1IZWFwTmFtZSwgc2htX2xlbikpOwogICAgIGlmIChkbWFfYnVmIDwgMCkgewpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2NvbmZpcm1hdGlvbnVpL1RydXN0eUFwcC5jcHAgYi90cnVzdHkvY29uZmlybWF0aW9udWkvVHJ1c3R5QXBwLmNwcAppbmRleCBjZWU4NjU1Li4yMzU2ZWVmIDEwMDY0NAotLS0gYS90cnVzdHkvY29uZmlybWF0aW9udWkvVHJ1c3R5QXBwLmNwcAorKysgYi90cnVzdHkvY29uZmlybWF0aW9udWkvVHJ1c3R5QXBwLmNwcApAQCAtMzAsMTAgKzMwLDYgQEAKIAogdXNpbmcgOjphbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKLXN0YXRpYyBpbmxpbmUgdWludHB0cl90IFJvdW5kUGFnZVVwKHVpbnRwdHJfdCB2YWwpIHsKLSAgICByZXR1cm4gKHZhbCArIChQQUdFX1NJWkUgLSAxKSkgJiB+KFBBR0VfU0laRSAtIDEpOwotfQotCiBzc2l6ZV90IFRydXN0eUFwcDo6VHJ1c3R5UnBjKGNvbnN0IHVpbnQ4X3QqIG9iZWdpbiwgY29uc3QgdWludDhfdCogb2VuZCwgdWludDhfdCogaWJlZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBpZW5kKSB7CiAgICAgdWludDMyX3Qgb2xlbiA9IG9lbmQgLSBvYmVnaW47CkBAIC05OSw3ICs5NSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICB1aW50MzJfdCBzaG1fbGVuID0gUm91bmRQYWdlVXAoQ09ORklSTUFUSU9OVUlfTUFYX01TR19TSVpFKTsKKyAgICB1aW50MzJfdCBzaG1fbGVuID0gQ09ORklSTUFUSU9OVUlfTUFYX01TR19TSVpFOwogICAgIEJ1ZmZlckFsbG9jYXRvciBhbGxvY2F0b3I7CiAgICAgdW5pcXVlX2ZkIGRtYV9idWYoYWxsb2NhdG9yLkFsbG9jKCJzeXN0ZW0iLCBzaG1fbGVuKSk7CiAgICAgaWYgKGRtYV9idWYgPCAwKSB7CmRpZmYgLS1naXQgYS90cnVzdHkvY29uZmlybWF0aW9udWkvZnV6ei9BbmRyb2lkLmJwIGIvdHJ1c3R5L2NvbmZpcm1hdGlvbnVpL2Z1enovQW5kcm9pZC5icAppbmRleCA0NzgwOTQzLi45NjgwNGJkIDEwMDY0NAotLS0gYS90cnVzdHkvY29uZmlybWF0aW9udWkvZnV6ei9BbmRyb2lkLmJwCisrKyBiL3RydXN0eS9jb25maXJtYXRpb251aS9mdXp6L0FuZHJvaWQuYnAKQEAgLTI2LDcgKzI2LDggQEAKICAgICAgICAgIi1EVFJVU1RZX0FQUF9GSUxFTkFNRT1cImNvbmZpcm1hdGlvbnVpLnN5bXMuZWxmXCIiLAogICAgIF0sCiAgICAgZnV6el9jb25maWc6IHsKLSAgICAgICBjYzogWyJ0cm9uZ0Bnb29nbGUuY29tIl0sCisgICAgICAgY2M6IFsibWlrZW1jdGVybmFuQGdvb2dsZS5jb20iXSwKKyAgICAgICBjb21wb25lbnRpZDogMTI5MDIzNywKICAgICB9LAogCiB9CkBAIC00MCw3ICs0MSw4IEBACiAgICAgICAgICJsaWJkbWFidWZoZWFwIiwKICAgICBdLAogICAgIGZ1enpfY29uZmlnOiB7Ci0gICAgICAgY2M6IFsidHJvbmdAZ29vZ2xlLmNvbSJdLAorICAgICAgIGNjOiBbIm1pa2VtY3Rlcm5hbkBnb29nbGUuY29tIl0sCisgICAgICAgY29tcG9uZW50aWQ6IDEyOTAyMzcsCiAgICAgfSwKIAogICAgIC8vIFRoZSBpbml0aWFsIGNvcnB1cyBmb3IgdGhpcyBmdXp6ZXIgd2FzIGRlcml2ZWQgYnkgZHVtcGluZyBtZXNzYWdlcyBmcm9tL3RvCmRpZmYgLS1naXQgYS90cnVzdHkvY292ZXJhZ2UvY292ZXJhZ2UuY3BwIGIvdHJ1c3R5L2NvdmVyYWdlL2NvdmVyYWdlLmNwcAppbmRleCAzYzZiNWM1Li44ZmMyZjVjIDEwMDY0NAotLS0gYS90cnVzdHkvY292ZXJhZ2UvY292ZXJhZ2UuY3BwCisrKyBiL3RydXN0eS9jb3ZlcmFnZS9jb3ZlcmFnZS5jcHAKQEAgLTQzLDEwICs0Myw2IEBACiB1c2luZyBzdGQ6OnRvX3N0cmluZzsKIHVzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKIAotc3RhdGljIGlubGluZSB1aW50cHRyX3QgUm91bmRQYWdlVXAodWludHB0cl90IHZhbCkgewotICAgIHJldHVybiAodmFsICsgKFBBR0VfU0laRSAtIDEpKSAmIH4oUEFHRV9TSVpFIC0gMSk7Ci19Ci0KIENvdmVyYWdlUmVjb3JkOjpDb3ZlcmFnZVJlY29yZChzdHJpbmcgdGlwY19kZXYsIHN0cnVjdCB1dWlkKiB1dWlkKQogICAgIDogdGlwY19kZXZfKHN0ZDo6bW92ZSh0aXBjX2RldikpLAogICAgICAgY292ZXJhZ2Vfc3J2X2ZkXygtMSksCkBAIC0xMzYsNyArMTMyLDcgQEAKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byBvcGVuIGNvdmVyYWdlIGNsaWVudDogIiA8PCByZXQuZXJyb3IoKTsKICAgICB9CiAgICAgcmVjb3JkX2xlbl8gPSByZXNwLm9wZW5fYXJncy5yZWNvcmRfbGVuOwotICAgIHNobV9sZW5fID0gUm91bmRQYWdlVXAocmVjb3JkX2xlbl8pOworICAgIHNobV9sZW5fID0gcmVjb3JkX2xlbl87CiAKICAgICBCdWZmZXJBbGxvY2F0b3IgYWxsb2NhdG9yOwogCmRpZmYgLS1naXQgYS90cnVzdHkvZnV6ei9pbmNsdWRlL3RydXN0eS9mdXp6L3V0aWxzLmggYi90cnVzdHkvZnV6ei9pbmNsdWRlL3RydXN0eS9mdXp6L3V0aWxzLmgKaW5kZXggYzkwNjQxMi4uY2Y0OTYyZSAxMDA2NDQKLS0tIGEvdHJ1c3R5L2Z1enovaW5jbHVkZS90cnVzdHkvZnV6ei91dGlscy5oCisrKyBiL3RydXN0eS9mdXp6L2luY2x1ZGUvdHJ1c3R5L2Z1enovdXRpbHMuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKLSNkZWZpbmUgVElQQ19NQVhfTVNHX1NJWkUgUEFHRV9TSVpFCisjZGVmaW5lIFRJUENfTUFYX01TR19TSVpFIDQwOTYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHRydXN0eSB7CmRpZmYgLS1naXQgYS90cnVzdHkvZnV6ei90aXBjX2Z1enplci5jcHAgYi90cnVzdHkvZnV6ei90aXBjX2Z1enplci5jcHAKaW5kZXggZjI2NWNlZC4uZWRjMmE3OSAxMDA2NDQKLS0tIGEvdHJ1c3R5L2Z1enovdGlwY19mdXp6ZXIuY3BwCisrKyBiL3RydXN0eS9mdXp6L3RpcGNfZnV6emVyLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dHJ1c3R5L2NvdmVyYWdlL2NvdmVyYWdlLmg+CiAjaW5jbHVkZSA8dHJ1c3R5L2NvdmVyYWdlL3V1aWQuaD4KQEAgLTIzLDYgKzI1LDcgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxtZW1vcnk+CiAKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDsKIHVzaW5nIGFuZHJvaWQ6OnRydXN0eTo6Y292ZXJhZ2U6OkNvdmVyYWdlUmVjb3JkOwogdXNpbmcgYW5kcm9pZDo6dHJ1c3R5OjpmdXp6OjpFeHRyYUNvdW50ZXJzOwogdXNpbmcgYW5kcm9pZDo6dHJ1c3R5OjpmdXp6OjpUcnVzdHlBcHA7CkBAIC00MSw3ICs0NCwxNCBAQAogI2Vycm9yICJCaW5hcnkgZmlsZSBuYW1lIG11c3QgYmUgcGFyYW1ldGVyaXplZCB1c2luZyAtRFRSVVNUWV9BUFBfRklMRU5BTUUuIgogI2VuZGlmCiAKLXN0YXRpYyBUcnVzdHlBcHAga1RydXN0eUFwcChUSVBDX0RFViwgVFJVU1RZX0FQUF9QT1JUKTsKKyNpZmRlZiBUUlVTVFlfQVBQX01BWF9DT05ORUNUSU9OUworY29uc3RleHByIHNpemVfdCBNQVhfQ09OTkVDVElPTlMgPSBUUlVTVFlfQVBQX01BWF9DT05ORUNUSU9OUzsKKyNlbHNlCitjb25zdGV4cHIgc2l6ZV90IE1BWF9DT05ORUNUSU9OUyA9IDE7CisjZW5kaWYKKworc3RhdGljX2Fzc2VydChNQVhfQ09OTkVDVElPTlMgPj0gMSk7CisKIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q292ZXJhZ2VSZWNvcmQ+IHJlY29yZDsKIAogZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplckluaXRpYWxpemUoaW50KiAvKiBhcmdjICovLCBjaGFyKioqIC8qIGFyZ3YgKi8pIHsKQEAgLTUzLDcgKzYzLDggQEAKICAgICB9CiAKICAgICAvKiBNYWtlIHN1cmUgbGF6eS1sb2FkZWQgVEFzIGhhdmUgc3RhcnRlZCBhbmQgY29ubmVjdGVkIHRvIGNvdmVyYWdlIHNlcnZpY2UuICovCi0gICAgYXV0byByZXQgPSBrVHJ1c3R5QXBwLkNvbm5lY3QoKTsKKyAgICBUcnVzdHlBcHAgdGEoVElQQ19ERVYsIFRSVVNUWV9BUFBfUE9SVCk7CisgICAgYXV0byByZXQgPSB0YS5Db25uZWN0KCk7CiAgICAgaWYgKCFyZXQub2soKSkgewogICAgICAgICBzdGQ6OmNlcnIgPDwgcmV0LmVycm9yKCkgPDwgc3RkOjplbmRsOwogICAgICAgICBleGl0KC0xKTsKQEAgLTczLDI0ICs4NCw1NiBAQAogICAgIHJldHVybiAwOwogfQogCi1leHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgc3RhdGljIHVpbnQ4X3QgYnVmW1RJUENfTUFYX01TR19TSVpFXTsKK1Jlc3VsdDx2b2lkPiB0ZXN0T25lSW5wdXQoRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlcikgeworICAgIHN0ZDo6dmVjdG9yPFRydXN0eUFwcD4gdHJ1c3R5QXBwczsKIAorICAgIHdoaWxlIChwcm92aWRlci5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKKyAgICAgICAgaWYgKHRydXN0eUFwcHMuc2l6ZSgpIDwgTUFYX0NPTk5FQ1RJT05TICYmIHByb3ZpZGVyLkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgICAgIGF1dG8mIHRhID0gdHJ1c3R5QXBwcy5lbXBsYWNlX2JhY2soVElQQ19ERVYsIFRSVVNUWV9BUFBfUE9SVCk7CisgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IHRhLkNvbm5lY3QoKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgYXV0byBpID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHRydXN0eUFwcHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHN0ZDo6c3dhcCh0cnVzdHlBcHBzW2ldLCB0cnVzdHlBcHBzLmJhY2soKSk7CisKKyAgICAgICAgICAgIGlmIChwcm92aWRlci5Db25zdW1lQm9vbCgpKSB7CisgICAgICAgICAgICAgICAgYXV0byYgdGEgPSB0cnVzdHlBcHBzLmJhY2soKTsKKworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gZGF0YSA9IHByb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IHRhLldyaXRlKGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQub2soKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwgVElQQ19NQVhfTVNHX1NJWkU+IGJ1ZjsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0YS5SZWFkKGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpOworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSZWNvbm5lY3QgdG8gZW5zdXJlIHRoYXQgdGhlIHNlcnZpY2UgaXMgc3RpbGwgdXAuCisgICAgICAgICAgICAgICAgdGEuRGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRhLkNvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5vaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCByZXN1bHQuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnRydXN0eTo6ZnV6ejo6QWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRydXN0eUFwcHMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge307Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBFeHRyYUNvdW50ZXJzIGNvdW50ZXJzKHJlY29yZC5nZXQoKSk7CiAgICAgY291bnRlcnMuUmVzZXQoKTsKIAotICAgIGF1dG8gcmV0ID0ga1RydXN0eUFwcC5Xcml0ZShkYXRhLCBzaXplKTsKLSAgICBpZiAocmV0Lm9rKCkpIHsKLSAgICAgICAgcmV0ID0ga1RydXN0eUFwcC5SZWFkKCZidWYsIHNpemVvZihidWYpKTsKLSAgICB9Ci0KLSAgICAvLyBSZWNvbm5lY3QgdG8gZW5zdXJlIHRoYXQgdGhlIHNlcnZpY2UgaXMgc3RpbGwgdXAKLSAgICBrVHJ1c3R5QXBwLkRpc2Nvbm5lY3QoKTsKLSAgICByZXQgPSBrVHJ1c3R5QXBwLkNvbm5lY3QoKTsKLSAgICBpZiAoIXJldC5vaygpKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCByZXQuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIGFuZHJvaWQ6OnRydXN0eTo6ZnV6ejo6QWJvcnQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0Lm9rKCkgPyAwIDogLTE7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIHByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0gdGVzdE9uZUlucHV0KHByb3ZpZGVyKTsKKyAgICByZXR1cm4gcmVzdWx0Lm9rKCkgPyAwIDogLTE7CiB9CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWFzdGVyL1RFU1RfTUFQUElORyBiL3RydXN0eS9rZXltYXN0ZXIvVEVTVF9NQVBQSU5HCmluZGV4IDA0NzVlMDQuLjRmMDgyZDggMTAwNjQ0Ci0tLSBhL3RydXN0eS9rZXltYXN0ZXIvVEVTVF9NQVBQSU5HCisrKyBiL3RydXN0eS9rZXltYXN0ZXIvVEVTVF9NQVBQSU5HCkBAIC0xMCwxMyArMTAsMTUgQEAKICAgICAgICAgIm5hbWUiOiAiUmtwZEFwcFVuaXRUZXN0cyIKICAgICAgIH0sCiAgICAgICB7Ci0gICAgICAgICJuYW1lIjogIlJrcGRBcHBHb29nbGVVbml0VGVzdHMiCisgICAgICAgICJuYW1lIjogIlJrcGRBcHBHb29nbGVVbml0VGVzdHMiLAorICAgICAgICAia2V5d29yZHMiOiBbImludGVybmFsIl0KICAgICAgIH0sCiAgICAgICB7CiAgICAgICAgICJuYW1lIjogIlJrcGRBcHBJbnRlZ3JhdGlvblRlc3RzIgogICAgICAgfSwKICAgICAgIHsKLSAgICAgICAgIm5hbWUiOiAiUmtwZEFwcEdvb2dsZUludGVncmF0aW9uVGVzdHMiCisgICAgICAgICJuYW1lIjogIlJrcGRBcHBHb29nbGVJbnRlZ3JhdGlvblRlc3RzIiwKKyAgICAgICAgImtleXdvcmRzIjogWyJpbnRlcm5hbCJdCiAgICAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltYXN0ZXIvVHJ1c3R5S2V5bWFzdGVyLmNwcCBiL3RydXN0eS9rZXltYXN0ZXIvVHJ1c3R5S2V5bWFzdGVyLmNwcAppbmRleCBhYzk4Njk1Li5iMTE4YTIwIDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWFzdGVyL1RydXN0eUtleW1hc3Rlci5jcHAKKysrIGIvdHJ1c3R5L2tleW1hc3Rlci9UcnVzdHlLZXltYXN0ZXIuY3BwCkBAIC0yMTgsNiArMjE4LDExIEBACiAgICAgRm9yd2FyZENvbW1hbmQoS01fREVMRVRFX0FMTF9LRVlTLCByZXF1ZXN0LCByZXNwb25zZSk7CiB9CiAKK3ZvaWQgVHJ1c3R5S2V5bWFzdGVyOjpEZXN0cm95QXR0ZXN0YXRpb25JZHMoY29uc3QgRGVzdHJveUF0dGVzdGF0aW9uSWRzUmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdHJveUF0dGVzdGF0aW9uSWRzUmVzcG9uc2UqIHJlc3BvbnNlKSB7CisgICAgRm9yd2FyZENvbW1hbmQoS01fREVTVFJPWV9BVFRFU1RBVElPTl9JRFMsIHJlcXVlc3QsIHJlc3BvbnNlKTsKK30KKwogdm9pZCBUcnVzdHlLZXltYXN0ZXI6OkJlZ2luT3BlcmF0aW9uKGNvbnN0IEJlZ2luT3BlcmF0aW9uUmVxdWVzdCYgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWdpbk9wZXJhdGlvblJlc3BvbnNlKiByZXNwb25zZSkgewogICAgIEZvcndhcmRDb21tYW5kKEtNX0JFR0lOX09QRVJBVElPTiwgcmVxdWVzdCwgcmVzcG9uc2UpOwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1hc3Rlci9mdXp6L0FuZHJvaWQuYnAgYi90cnVzdHkva2V5bWFzdGVyL2Z1enovQW5kcm9pZC5icAppbmRleCA1ZjI0YmM2Li5iMTBmNzI3IDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWFzdGVyL2Z1enovQW5kcm9pZC5icAorKysgYi90cnVzdHkva2V5bWFzdGVyL2Z1enovQW5kcm9pZC5icApAQCAtMjYsNyArMjYsOSBAQAogICAgICAgICAiLURUUlVTVFlfQVBQX0ZJTEVOQU1FPVwia2V5bWFzdGVyLnN5bXMuZWxmXCIiLAogICAgIF0sCiAgICAgZnV6el9jb25maWc6IHsKLSAgICAgICBjYzogWyJ0cm9uZ0Bnb29nbGUuY29tIl0sCisgICAgICAgY2M6IFsidHJvbmdAZ29vZ2xlLmNvbSIsICJkcnlzZGFsZUBnb29nbGUuY29tIl0sCisgICAgICAgY29tcG9uZW50aWQ6IDEwODQ3MzMsCisgICAgICAgaG90bGlzdHM6IFsiNDI3MTY5NiJdLAogICAgIH0sCiAKICAgICAvLyBUaGUgaW5pdGlhbCBjb3JwdXMgZm9yIHRoaXMgZnV6emVyIHdhcyBkZXJpdmVkIGJ5IGR1bXBpbmcgbWVzc2FnZXMgZnJvbQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvVHJ1c3R5S2V5bWFzdGVyLmggYi90cnVzdHkva2V5bWFzdGVyL2luY2x1ZGUvdHJ1c3R5X2tleW1hc3Rlci9UcnVzdHlLZXltYXN0ZXIuaAppbmRleCA2MGQzZjg3Li5jNTAxNzhiIDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWFzdGVyL2luY2x1ZGUvdHJ1c3R5X2tleW1hc3Rlci9UcnVzdHlLZXltYXN0ZXIuaAorKysgYi90cnVzdHkva2V5bWFzdGVyL2luY2x1ZGUvdHJ1c3R5X2tleW1hc3Rlci9UcnVzdHlLZXltYXN0ZXIuaApAQCAtNTUsNiArNTUsOCBAQAogICAgIHZvaWQgVXBncmFkZUtleShjb25zdCBVcGdyYWRlS2V5UmVxdWVzdCYgcmVxdWVzdCwgVXBncmFkZUtleVJlc3BvbnNlKiByZXNwb25zZSk7CiAgICAgdm9pZCBEZWxldGVLZXkoY29uc3QgRGVsZXRlS2V5UmVxdWVzdCYgcmVxdWVzdCwgRGVsZXRlS2V5UmVzcG9uc2UqIHJlc3BvbnNlKTsKICAgICB2b2lkIERlbGV0ZUFsbEtleXMoY29uc3QgRGVsZXRlQWxsS2V5c1JlcXVlc3QmIHJlcXVlc3QsIERlbGV0ZUFsbEtleXNSZXNwb25zZSogcmVzcG9uc2UpOworICAgIHZvaWQgRGVzdHJveUF0dGVzdGF0aW9uSWRzKGNvbnN0IERlc3Ryb3lBdHRlc3RhdGlvbklkc1JlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdHJveUF0dGVzdGF0aW9uSWRzUmVzcG9uc2UqIHJlc3BvbnNlKTsKICAgICB2b2lkIEJlZ2luT3BlcmF0aW9uKGNvbnN0IEJlZ2luT3BlcmF0aW9uUmVxdWVzdCYgcmVxdWVzdCwgQmVnaW5PcGVyYXRpb25SZXNwb25zZSogcmVzcG9uc2UpOwogICAgIHZvaWQgVXBkYXRlT3BlcmF0aW9uKGNvbnN0IFVwZGF0ZU9wZXJhdGlvblJlcXVlc3QmIHJlcXVlc3QsIFVwZGF0ZU9wZXJhdGlvblJlc3BvbnNlKiByZXNwb25zZSk7CiAgICAgdm9pZCBGaW5pc2hPcGVyYXRpb24oY29uc3QgRmluaXNoT3BlcmF0aW9uUmVxdWVzdCYgcmVxdWVzdCwgRmluaXNoT3BlcmF0aW9uUmVzcG9uc2UqIHJlc3BvbnNlKTsKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltYXN0ZXIvaW5jbHVkZS90cnVzdHlfa2V5bWFzdGVyL2lwYy90cnVzdHlfa2V5bWFzdGVyX2lwYy5oIGIvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvaXBjL3RydXN0eV9rZXltYXN0ZXJfaXBjLmgKaW5kZXggMTYyMDdlNi4uZWZhZDI1NCAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvaXBjL3RydXN0eV9rZXltYXN0ZXJfaXBjLmgKKysrIGIvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvaXBjL3RydXN0eV9rZXltYXN0ZXJfaXBjLmgKQEAgLTIyLDkgKzIyLDkgQEAKIAogX19CRUdJTl9ERUNMUwogCi1jb25zdCB1aW50MzJfdCBUUlVTVFlfS0VZTUFTVEVSX1JFQ1ZfQlVGX1NJWkUgPSAyICogUEFHRV9TSVpFOworY29uc3QgdWludDMyX3QgVFJVU1RZX0tFWU1BU1RFUl9SRUNWX0JVRl9TSVpFID0gMiAqIDQwOTY7CiBjb25zdCB1aW50MzJfdCBUUlVTVFlfS0VZTUFTVEVSX1NFTkRfQlVGX1NJWkUgPQotICAgICAgICAoUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBrZXltYXN0ZXJfbWVzc2FnZSkgLSAxNiAvKiB0aXBjIGhlYWRlciAqLyk7CisgICAgICAgICg0MDk2IC0gc2l6ZW9mKHN0cnVjdCBrZXltYXN0ZXJfbWVzc2FnZSkgLSAxNiAvKiB0aXBjIGhlYWRlciAqLyk7CiAKIGludCB0cnVzdHlfa2V5bWFzdGVyX2Nvbm5lY3Qodm9pZCk7CiBpbnQgdHJ1c3R5X2tleW1hc3Rlcl9jYWxsKHVpbnQzMl90IGNtZCwgdm9pZCogaW4sIHVpbnQzMl90IGluX3NpemUsIHVpbnQ4X3QqIG91dCwKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltYXN0ZXIva2V5bWludC9UcnVzdHlLZXlNaW50RGV2aWNlLmNwcCBiL3RydXN0eS9rZXltYXN0ZXIva2V5bWludC9UcnVzdHlLZXlNaW50RGV2aWNlLmNwcAppbmRleCBiNjk2ZmY5Li5mZWM0YzYwIDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWFzdGVyL2tleW1pbnQvVHJ1c3R5S2V5TWludERldmljZS5jcHAKKysrIGIvdHJ1c3R5L2tleW1hc3Rlci9rZXltaW50L1RydXN0eUtleU1pbnREZXZpY2UuY3BwCkBAIC0yNTgsNyArMjU4LDExIEBACiB9CiAKIFNjb3BlZEFTdGF0dXMgVHJ1c3R5S2V5TWludERldmljZTo6ZGVzdHJveUF0dGVzdGF0aW9uSWRzKCkgewotICAgIHJldHVybiBrbUVycm9yMlNjb3BlZEFTdGF0dXMoS01fRVJST1JfVU5JTVBMRU1FTlRFRCk7CisgICAga2V5bWFzdGVyOjpEZXN0cm95QXR0ZXN0YXRpb25JZHNSZXF1ZXN0IHJlcXVlc3QoaW1wbF8tPm1lc3NhZ2VfdmVyc2lvbigpKTsKKyAgICBrZXltYXN0ZXI6OkRlc3Ryb3lBdHRlc3RhdGlvbklkc1Jlc3BvbnNlIHJlc3BvbnNlKGltcGxfLT5tZXNzYWdlX3ZlcnNpb24oKSk7CisgICAgaW1wbF8tPkRlc3Ryb3lBdHRlc3RhdGlvbklkcyhyZXF1ZXN0LCAmcmVzcG9uc2UpOworCisgICAgcmV0dXJuIGttRXJyb3IyU2NvcGVkQVN0YXR1cyhyZXNwb25zZS5lcnJvcik7CiB9CiAKIFNjb3BlZEFTdGF0dXMgVHJ1c3R5S2V5TWludERldmljZTo6YmVnaW4oS2V5UHVycG9zZSBwdXJwb3NlLCBjb25zdCB2ZWN0b3I8dWludDhfdD4mIGtleUJsb2IsCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWFzdGVyL3NldF9hdHRlc3RhdGlvbl9pZHMvc2V0X2F0dGVzdGF0aW9uX2lkcy5jcHAgYi90cnVzdHkva2V5bWFzdGVyL3NldF9hdHRlc3RhdGlvbl9pZHMvc2V0X2F0dGVzdGF0aW9uX2lkcy5jcHAKaW5kZXggZTk0NDE2Ny4uNmI4ZjkwZiAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9zZXRfYXR0ZXN0YXRpb25faWRzL3NldF9hdHRlc3RhdGlvbl9pZHMuY3BwCisrKyBiL3RydXN0eS9rZXltYXN0ZXIvc2V0X2F0dGVzdGF0aW9uX2lkcy9zZXRfYXR0ZXN0YXRpb25faWRzLmNwcApAQCAtMTcsOCArMTcsMTAgQEAKICNpbmNsdWRlIDxnZXRvcHQuaD4KIAogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8dHJ1c3R5X2tleW1hc3Rlci9pcGMvdHJ1c3R5X2tleW1hc3Rlcl9pcGMuaD4KIAogbmFtZXNwYWNlIHsKQEAgLTM0LDE0ICszNiw2NiBAQAogICAgICAgICB7Im1vZGVsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsICdtJ30sCiAgICAgICAgIHsiaW1laSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCAnaSd9LAogICAgICAgICB7Im1laWQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgJ2MnfSwKKyAgICAgICAgeyJpbWVpMiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCAnMid9LAogICAgICAgICB7MCwgMCwgMCwgMH0sCiB9OwogCitzdGQ6OnN0cmluZyBURUxFUEhPTllfQ01EX0dFVF9JTUVJID0gImNtZCBwaG9uZSBnZXQtaW1laSAiOworCisvLyBSdW4gYSBzaGVsbCBjb21tYW5kIGFuZCBjb2xsZWN0IHRoZSBvdXRwdXQgb2YgaXQuIElmIGFueSBlcnJvciwgc2V0IGFuIGVtcHR5IHN0cmluZyBhcyB0aGUKKy8vIG91dHB1dC4KK3N0ZDo6c3RyaW5nIGV4ZWNfY29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCkgeworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgICBGSUxFKiBwaXBlID0gcG9wZW4oY29tbWFuZC5jX3N0cigpLCAiciIpOworICAgIGlmICghcGlwZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBvcGVuKCclcycpIGZhaWxlZFxuIiwgY29tbWFuZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICB3aGlsZSAoIWZlb2YocGlwZSkpIHsKKyAgICAgICAgaWYgKGZnZXRzKGJ1ZmZlciwgMTI4LCBwaXBlKSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQgKz0gYnVmZmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcGNsb3NlKHBpcGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEdldCBJTUVJIHVzaW5nIFRlbGVwaG9ueSBzZXJ2aWNlIHNoZWxsIGNvbW1hbmQuIElmIGFueSBlcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIGNvbW1hbmQKKy8vIHRoZW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgb3V0cHV0Lgorc3RkOjpzdHJpbmcgZ2V0X2ltZWkoaW50IHNsb3QpIHsKKyAgICBzdGQ6OnN0cmluZyBjbWQgPSBURUxFUEhPTllfQ01EX0dFVF9JTUVJICsgc3RkOjp0b19zdHJpbmcoc2xvdCk7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0ID0gZXhlY19jb21tYW5kKGNtZCk7CisKKyAgICBpZiAob3V0cHV0LmVtcHR5KCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZXRyaWV2ZSBJTUVJIGNvbW1hbmQgKCclcycpIGZhaWxlZFxuIiwgY21kLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dCA9CisgICAgICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OlRva2VuaXplKDo6YW5kcm9pZDo6YmFzZTo6VHJpbShvdXRwdXQpLCAiRGV2aWNlIElNRUk6Iik7CisKKyAgICBpZiAob3V0LnNpemUoKSAhPSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcGFyc2luZyBjb21tYW5kICgnJXMnKSBvdXRwdXQgJyVzJ1xuIiwgY21kLmNfc3RyKCksIG91dHB1dC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGltZWkgPSA6OmFuZHJvaWQ6OmJhc2U6OlRyaW0ob3V0WzBdKTsKKyAgICBpZiAoaW1laS5jb21wYXJlKCJudWxsIikgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIklNRUkgdmFsdWUgZnJvbSBjb21tYW5kICgnJXMnKSBpcyBudWxsLCBza2lwcGluZyIsIGNtZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXR1cm4gaW1laTsKK30KKwogc3RkOjpzdHJpbmcgYnVmMnN0cmluZyhjb25zdCBrZXltYXN0ZXI6OkJ1ZmZlciYgYnVmKSB7CiAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1Zi5wZWVrX3JlYWQoKSksIGJ1Zi5hdmFpbGFibGVfcmVhZCgpKTsKIH0KIAotdm9pZCBwcmludF91c2FnZShjb25zdCBjaGFyKiBwcm9nLCBjb25zdCBrZXltYXN0ZXI6OlNldEF0dGVzdGF0aW9uSWRzUmVxdWVzdCYgcmVxKSB7Cit2b2lkIHByaW50X3VzYWdlKGNvbnN0IGNoYXIqIHByb2csIGNvbnN0IGtleW1hc3Rlcjo6U2V0QXR0ZXN0YXRpb25JZHNLTTNSZXF1ZXN0JiByZXEpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICJVc2FnZTogJXMgW29wdGlvbnNdXG4iCiAgICAgICAgICAgICAiXG4iCkBAIC01NSwzNCArMTA5LDUzIEBACiAgICAgICAgICAgICAiICAtbSwgLS1tb2RlbCA8dmFsPiAgICAgICAgICBzZXQgbW9kZWwgKGRlZmF1bHQgJyVzJylcbiIKICAgICAgICAgICAgICIgIC1pLCAtLWltZWkgPHZhbD4gICAgICAgICAgIHNldCBJTUVJIChkZWZhdWx0ICclcycpXG4iCiAgICAgICAgICAgICAiICAtYywgLS1tZWlkIDx2YWw+ICAgICAgICAgICBzZXQgTUVJRCAoZGVmYXVsdCAnJXMnKVxuIgorICAgICAgICAgICAgIiAgLTIsIC0taW1laTIgPHZhbD4gICAgICAgICAgc2V0IHNlY29uZCBJTUVJIChkZWZhdWx0ICclcycpXG4iCiAgICAgICAgICAgICAiXG4iLAotICAgICAgICAgICAgcHJvZywgYnVmMnN0cmluZyhyZXEuYnJhbmQpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLmRldmljZSkuY19zdHIoKSwKLSAgICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLnByb2R1Y3QpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLnNlcmlhbCkuY19zdHIoKSwKLSAgICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLm1hbnVmYWN0dXJlcikuY19zdHIoKSwgYnVmMnN0cmluZyhyZXEubW9kZWwpLmNfc3RyKCksCi0gICAgICAgICAgICBidWYyc3RyaW5nKHJlcS5pbWVpKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5tZWlkKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHByb2csIGJ1ZjJzdHJpbmcocmVxLmJhc2UuYnJhbmQpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLmJhc2UuZGV2aWNlKS5jX3N0cigpLAorICAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuYmFzZS5wcm9kdWN0KS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLnNlcmlhbCkuY19zdHIoKSwKKyAgICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLmJhc2UubWFudWZhY3R1cmVyKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLm1vZGVsKS5jX3N0cigpLAorICAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuYmFzZS5pbWVpKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLm1laWQpLmNfc3RyKCksCisgICAgICAgICAgICBidWYyc3RyaW5nKHJlcS5zZWNvbmRfaW1laSkuY19zdHIoKSk7Cit9CisKK3ZvaWQgc2V0X3RvKGtleW1hc3Rlcjo6QnVmZmVyKiBidWYsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUuZW1wdHkoKSkgeworICAgICAgICBidWYtPlJlaW5pdGlhbGl6ZSh2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgICAgfQogfQogCiB2b2lkIHNldF9mcm9tX3Byb3Aoa2V5bWFzdGVyOjpCdWZmZXIqIGJ1ZiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ApIHsKICAgICBzdGQ6OnN0cmluZyBwcm9wX3ZhbHVlID0gOjphbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eShwcm9wLCAvKiBkZWZhdWx0X3ZhbHVlID0gKi8gIiIpOwotICAgIGlmICghcHJvcF92YWx1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIGJ1Zi0+UmVpbml0aWFsaXplKHByb3BfdmFsdWUuZGF0YSgpLCBwcm9wX3ZhbHVlLnNpemUoKSk7Ci0gICAgfQorICAgIHNldF90byhidWYsIHByb3BfdmFsdWUpOwogfQogCi12b2lkIHBvcHVsYXRlX2lkcyhrZXltYXN0ZXI6OlNldEF0dGVzdGF0aW9uSWRzUmVxdWVzdCogcmVxKSB7Cit2b2lkIHBvcHVsYXRlX2Jhc2VfaWRzKGtleW1hc3Rlcjo6U2V0QXR0ZXN0YXRpb25JZHNSZXF1ZXN0KiByZXEpIHsKICAgICBzZXRfZnJvbV9wcm9wKCZyZXEtPmJyYW5kLCAicm8ucHJvZHVjdC5icmFuZCIpOwogICAgIHNldF9mcm9tX3Byb3AoJnJlcS0+ZGV2aWNlLCAicm8ucHJvZHVjdC5kZXZpY2UiKTsKICAgICBzZXRfZnJvbV9wcm9wKCZyZXEtPnByb2R1Y3QsICJyby5wcm9kdWN0Lm5hbWUiKTsKICAgICBzZXRfZnJvbV9wcm9wKCZyZXEtPnNlcmlhbCwgInJvLnNlcmlhbG5vIik7CiAgICAgc2V0X2Zyb21fcHJvcCgmcmVxLT5tYW51ZmFjdHVyZXIsICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlciIpOwogICAgIHNldF9mcm9tX3Byb3AoJnJlcS0+bW9kZWwsICJyby5wcm9kdWN0Lm1vZGVsIik7CisgICAgc3RkOjpzdHJpbmcgaW1laSA9IGdldF9pbWVpKDApOworICAgIHNldF90bygmcmVxLT5pbWVpLCBpbWVpKTsKK30KKwordm9pZCBwb3B1bGF0ZV9pZHMoa2V5bWFzdGVyOjpTZXRBdHRlc3RhdGlvbklkc0tNM1JlcXVlc3QqIHJlcSkgeworICAgIHBvcHVsYXRlX2Jhc2VfaWRzKCZyZXEtPmJhc2UpOworCisgICAgLy8gLSAiV2hhdCBhYm91dCBJTUVJPyIKKyAgICAvLyAtICJZb3UndmUgYWxyZWFkeSBoYWQgaXQuIgorICAgIC8vIC0gIldlJ3ZlIGhhZCBvbmUsIHllcy4gV2hhdCBhYm91dCBzZWNvbmQgSU1FST8iCisgICAgLy8gLSAiSSBkb24ndCB0aGluayBoZSBrbm93cyBhYm91dCBzZWNvbmQgSU1FSSwgUGlwLiIKKyAgICBzdGQ6OnN0cmluZyBpbWVpMiA9IGdldF9pbWVpKDEpOworICAgIHNldF90bygmcmVxLT5zZWNvbmRfaW1laSwgaW1laTIpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgLy8gQnkgZGVmYXVsdCwgc2V0IGF0dGVzdGF0aW9uIElEcyB0byB0aGUgdmFsdWVzIGluIHVzZXJzcGFjZSBwcm9wZXJ0aWVzLgotICAgIGtleW1hc3Rlcjo6U2V0QXR0ZXN0YXRpb25JZHNSZXF1ZXN0IHJlcSgvKiB2ZXIgPSAqLyA0KTsKKyAgICBrZXltYXN0ZXI6OlNldEF0dGVzdGF0aW9uSWRzS00zUmVxdWVzdCByZXEoLyogdmVyID0gKi8gNCk7CiAgICAgcG9wdWxhdGVfaWRzKCZyZXEpOwogCiAgICAgd2hpbGUgKHRydWUpIHsKQEAgLTk0LDI4ICsxNjcsMzEgQEAKIAogICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgIHJlcS5icmFuZC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgcmVxLmJhc2UuYnJhbmQuUmVpbml0aWFsaXplKG9wdGFyZywgc3RybGVuKG9wdGFyZykpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgcmVxLmRldmljZS5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgcmVxLmJhc2UuZGV2aWNlLlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgIHJlcS5wcm9kdWN0LlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKKyAgICAgICAgICAgICAgICByZXEuYmFzZS5wcm9kdWN0LlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgIHJlcS5zZXJpYWwuUmVpbml0aWFsaXplKG9wdGFyZywgc3RybGVuKG9wdGFyZykpOworICAgICAgICAgICAgICAgIHJlcS5iYXNlLnNlcmlhbC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgICAgICByZXEubWFudWZhY3R1cmVyLlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKKyAgICAgICAgICAgICAgICByZXEuYmFzZS5tYW51ZmFjdHVyZXIuUmVpbml0aWFsaXplKG9wdGFyZywgc3RybGVuKG9wdGFyZykpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgcmVxLm1vZGVsLlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKKyAgICAgICAgICAgICAgICByZXEuYmFzZS5tb2RlbC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdpJzoKLSAgICAgICAgICAgICAgICByZXEuaW1laS5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgcmVxLmJhc2UuaW1laS5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgICAgICByZXEubWVpZC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgcmVxLmJhc2UubWVpZC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgICByZXEuc2Vjb25kX2ltZWkuUmVpbml0aWFsaXplKG9wdGFyZywgc3RybGVuKG9wdGFyZykpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICAgcHJpbnRfdXNhZ2UoYXJndlswXSwgcmVxKTsKQEAgLTE0NCwxOSArMjIwLDMzIEBACiAgICAgICAgICAgICIgIG1hbnVmYWN0dXJlcjogJXNcbiIKICAgICAgICAgICAgIiAgbW9kZWw6ICAgICAgICAlc1xuIgogICAgICAgICAgICAiICBJTUVJOiAgICAgICAgICVzXG4iCi0gICAgICAgICAgICIgIE1FSUQ6ICAgICAgICAgJXNcbiIsCi0gICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLmJyYW5kKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5kZXZpY2UpLmNfc3RyKCksCi0gICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLnByb2R1Y3QpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLnNlcmlhbCkuY19zdHIoKSwKLSAgICAgICAgICAgYnVmMnN0cmluZyhyZXEubWFudWZhY3R1cmVyKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5tb2RlbCkuY19zdHIoKSwKLSAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuaW1laSkuY19zdHIoKSwgYnVmMnN0cmluZyhyZXEubWVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICIgIE1FSUQ6ICAgICAgICAgJXNcbiIKKyAgICAgICAgICAgIiAgU0VDT05EX0lNRUk6ICAlc1xuXG4iLAorICAgICAgICAgICBidWYyc3RyaW5nKHJlcS5iYXNlLmJyYW5kKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLmRldmljZSkuY19zdHIoKSwKKyAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuYmFzZS5wcm9kdWN0KS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLnNlcmlhbCkuY19zdHIoKSwKKyAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuYmFzZS5tYW51ZmFjdHVyZXIpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLmJhc2UubW9kZWwpLmNfc3RyKCksCisgICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLmJhc2UuaW1laSkuY19zdHIoKSwgYnVmMnN0cmluZyhyZXEuYmFzZS5tZWlkKS5jX3N0cigpLAorICAgICAgICAgICBidWYyc3RyaW5nKHJlcS5zZWNvbmRfaW1laSkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CiAKICAgICBrZXltYXN0ZXI6OkVtcHR5S2V5bWFzdGVyUmVzcG9uc2UgcnNwKC8qIHZlciA9ICovIDQpOwotICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfc2VuZChLTV9TRVRfQVRURVNUQVRJT05fSURTLCByZXEsICZyc3ApOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJTRVRfQVRURVNUQVRJT05fSURTIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0gICAgICAgIHRydXN0eV9rZXltYXN0ZXJfZGlzY29ubmVjdCgpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIGNvbnN0IGNoYXIqIG1zZzsKKyAgICBpZiAocmVxLnNlY29uZF9pbWVpLmF2YWlsYWJsZV9yZWFkKCkgPT0gMCkgeworICAgICAgICAvLyBObyBTRUNPTkRfSU1FSSBzZXQsIHVzZSBiYXNlIGNvbW1hbmQuCisgICAgICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfc2VuZChLTV9TRVRfQVRURVNUQVRJT05fSURTLCByZXEuYmFzZSwgJnJzcCk7CisgICAgICAgIG1zZyA9ICJTRVRfQVRURVNUQVRJT05fSURTIjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTRUNPTkRfSU1FSSBpcyBzZXQsIHVzZSB1cGRhdGVkIGNvbW1hbmQuCisgICAgICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfc2VuZChLTV9TRVRfQVRURVNUQVRJT05fSURTX0tNMywgcmVxLCAmcnNwKTsKKyAgICAgICAgbXNnID0gIlNFVF9BVFRFU1RBVElPTl9JRFNfS00zIjsKICAgICB9CisgICAgdHJ1c3R5X2tleW1hc3Rlcl9kaXNjb25uZWN0KCk7CiAKLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBmYWlsZWQ6ICVkXG4iLCBtc2csIHJldCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJkb25lXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9BbmRyb2lkLmJwIGIvdHJ1c3R5L2tleW1pbnQvQW5kcm9pZC5icAppbmRleCBjMTllYmJkLi4xOWRjYzk4IDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWludC9BbmRyb2lkLmJwCisrKyBiL3RydXN0eS9rZXltaW50L0FuZHJvaWQuYnAKQEAgLTM1LDYgKzM1LDcgQEAKICAgICAgICAgImxpYmxpYmMiLAogICAgICAgICAibGlibG9nX3J1c3QiLAogICAgIF0sCisgICAgcHJlZmVyX3JsaWI6IHRydWUsCiAgICAgcmVxdWlyZWQ6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGFyZHdhcmVfa2V5c3RvcmUueG1sIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9BbmRyb2lkLmJwIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzNkYjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJ0cnVzdHlfa2V5bWludF9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbInRydXN0eV9mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIjp0cnVzdHlfdGlwY19mdXp6ZXIiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EVFJVU1RZX0FQUF9QT1JUPVwiY29tLmFuZHJvaWQudHJ1c3R5LmtleW1pbnRcIiIsCisgICAgICAgICItRFRSVVNUWV9BUFBfVVVJRD1cIjVmOTAyYWNlLTVlNWMtNGNkOC1hZTU0LTg3Yjg4YzIyZGRhZlwiIiwKKyAgICAgICAgIi1EVFJVU1RZX0FQUF9GSUxFTkFNRT1cImtleW1pbnRfYXBwLnN5bXMuZWxmXCIiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICBjYzogWyJkcnlzZGFsZUBnb29nbGUuY29tIl0sCisgICAgICAgY29tcG9uZW50aWQ6IDEwODQ3MzMsCisgICAgICAgaG90bGlzdHM6IFsiNDI3MTY5NiJdLAorICAgIH0sCisKKyAgICAvLyBUaGUgaW5pdGlhbCBjb3JwdXMgZm9yIHRoaXMgZnV6emVyIHdhcyBkZXJpdmVkIGJ5IGR1bXBpbmcgbWVzc2FnZXMgZnJvbQorICAgIC8vIHRoZSBIQUwgc2VydmljZSB3aGlsZSBydW5uaW5nIHRoZSBWVFMgdGVzdHMgZm9yIEtleU1pbnQuCisgICAgY29ycHVzOiBbImNvcnB1cy8qIl0sCit9CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMTgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMTgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmY2UyNQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjExODAtMApAQCAtMCwwICsxIEBACiuCEYAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMjgxNDAtMCBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEyODE0MC0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNmY2NDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMjgxNDAtMApAQCAtMCwwICsxIEBACiuCEoFAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTQzLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMjgxNDMtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjI5ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTQzLTAKQEAgLTAsMCArMSBAQAorghKBQ2ZvbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEyODE1OC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTU4LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhMzJhYgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEyODE1OC0wCkBAIC0wLDAgKzEgQEAKK4ISgVhAE1TEZMOCmpm9m6MlcrMP9asZ4zE6j+Ed6XqcufA3A+pY2P8k6RPT+/V2YPQ0h6jC3XJjnavYSiFSca+7Mz9aRApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEyODE1OC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTU4LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzNzUzNAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEyODE1OC0xCkBAIC0wLDAgKzEsMiBAQAorghKBWECWdopFEClZvDBqm0nqhLs6IIo8cSr31uO6pworI+99+OqTNEMSVCRk8awD9CKCo1kTT4PHH6gVU9byrTsJZVC0HgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4NS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5MGYyMgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4NS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4NS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5NWE0NgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4NS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4NS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlNjFhNAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4NS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4NS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyNzY3MwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4NS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ni0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiNmE5YgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ni0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ni0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhYzI3MwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ni0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ni0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwZDQwNQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ni0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ni0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmMDIwYQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ni0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ny0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzNjU4MAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ny0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ny0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlYWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ny0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ny0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3NTQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ny0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ny0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMjRlZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Ny0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzMjg1YQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhMGE1YgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OC0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OC0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1YmExNwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OC0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OC0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3ODU0ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OC0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4YjU5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZGNkYgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzYzYxOQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1MWUwMQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4OS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4YS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3M2NhMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4YS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4YS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1Y2UyMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4YS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4YS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlNWIwNgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4YS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4YS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1ODE4YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4YS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yi0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxZGU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yi0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yi0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzOTRjMgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yi0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yi0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwN2M5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yi0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yi0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwOTRiMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yi0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yy0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkYTgwMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yy0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yy0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlZGNmNgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yy0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yy0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmOGZhZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yy0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yy0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmMzYwYwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Yy0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzODhiMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzOGQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZC0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZC0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5OGFjMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZC0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZC0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiZGMzZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZC0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjZmEyNAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlM2JiMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmN2QxYwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2NzQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4ZS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Zi0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4NTE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Zi0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Zi0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxZDE5MgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Zi0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Zi0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyZDlhMQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Zi0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Zi0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyNDZmOAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI4Zi0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI5MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2NWNhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI5MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI5MC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkwLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYzNjlmNwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI5MC0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI5Mi0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkyLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjZmZiZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEzODI5Mi0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4NS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0MWJkZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4NS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4NS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmNzRjZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4NS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4NS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkNDg4OAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4NS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4NS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzM2UxYwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4NS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ni0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjMjEwNgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ni0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ni0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0YzYzYQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ni0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ni0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5YzQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ni0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ni0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3YTMyMgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ni0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ny0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0ZWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ny0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ny0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1ZDkwZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ny0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ny0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2NjY2NAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ny0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ny0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2YTJkZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Ny0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkZTA0ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlYzlmZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OC0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OC0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwYWEzMgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OC0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OC0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0MTRlNAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OC0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNDhhNQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzYmE3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxYTc1NgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkYTk5YQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4OS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4YS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4YzE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4YS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4YS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4MTMyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4YS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4YS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3MzVmNAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4YS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4YS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxNDhhMQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4YS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Yi0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhiLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzYTdmYwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE0ODQ4Yi0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE1ODY1OS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4OThhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE1ODY1OS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE1ODY1OS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyYjk4OQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE1ODY1OS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE1ODY1OS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyYTZkZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE1ODY1OS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE1ODY1OS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiYjExMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE1ODY1OS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE2ODI1OC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTY4MjU4LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4ZTI4MQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE2ODI1OC0wCkBAIC0wLDAgKzEgQEAKK4IWglg0anVzdCBzb21lIGdhcmJhZ2UgZGF0YSB3aGljaCBpcyBub3QgYSB2YWxpZCBrZXkgYmxvYoKCOm///aZIY2xpZW50aWSCOm///UNHYXBwZGF0YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE2ODI1OC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTY4MjU4LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5NDIyMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE2ODI1OC0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0MWJmZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzMDVkMgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OC0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OC0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5Y2M4NAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OC0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OC0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkMDdjYgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OC0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3ZDI3YQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1MTVjYwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmNTc3YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzYjI0YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE3ODE1OS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWE4NC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5MDQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWE4NC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWE4NC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyMzNkNwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWE4NC0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWE4NC0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5Yzk1MwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWE4NC0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWE4NC0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4YjJiZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWE4NC0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWU4My0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4MTIzNwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWU4My0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWU4My0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhZDM1NwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWU4My0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWU4My0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2N2NhZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWU4My0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWU4My0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1NTM3YgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MWU4My0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzE4NC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0ZjdhOAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzE4NC0wCkBAIC0wLDAgKzEgQEAKK4IYMYQbP48UVPbWyURGZm9vYmFygIAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMxODQtMSBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzE4NC0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWEzMWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMxODQtMQpAQCAtMCwwICsxIEBACiuCGDGEO09p7MHIXsYnRmZvb2JhcoCAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMxODQtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODU4NmYwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTIKQEAgLTAsMCArMSBAQAorghgxhBtZl+nNkS6gIEZmb29iYXKAgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzE4NC0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmYjEyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzE4NC0zCkBAIC0wLDAgKzEgQEAKK4IYMYQbGvpieEGbTmBGZm9vYmFygIAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMyODQtMCBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODE5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMyODQtMApAQCAtMCwwICsxIEBACiuCGDKEOyrG9ZYo2tD3WQb4YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWGAgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMjg0LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1YTA1NgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMjg0LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5YjI0YgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0yCkBAIC0wLDAgKzEgQEAKK4IYMoQbX9vISx01XXJZBvdhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhgIAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMyODQtMyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZDcxM2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMyODQtMwpAQCAtMCwwICsxLDIgQEAKK4IYMoQ7CiuZRT2krpT+WQb5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhgIAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMzODYtMCBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjM3NGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMzODYtMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMzODYtMSBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzUxNWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMzODYtMQpAQCAtMCwwICsxIEBACiuCGDOGGxrBNtguWxKLgUxIZWxsbyBXb3JsZCGBQICAgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMzg2LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3MDEyNgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMzg2LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjODcwMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzQ4MS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzNDgxLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0OTEzZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzQ4MS0wCkBAIC0wLDAgKzEgQEAKK4IYNIE7esGrCMqWlPEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMSBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzQ4MS0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODk1MDEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMQpAQCAtMCwwICsxIEBACiuCGDSBGxXfhsL3mRA2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzNDgxLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTlkYmIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzNDgxLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzNDgxLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg3NWFjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzNDgxLTMKQEAgLTAsMCArMSBAQAorghg0gRsg6KiiDyWYnwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4NDE4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTg0MTgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhNmM1NQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4NDE4MC0wCkBAIC0wLDAgKzEgQEAKK4IYQYAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODQyODEtMCBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4NDI4MS0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NWJiNGIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODQyODEtMApAQCAtMCwwICsxIEBACiuCGEKB9ApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDAzNTUwNC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMDM1NTA0LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwMDE2OQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDAzNTUwNC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDFlMTcwZC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMWUxNzBkLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2YWRjMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDFlMTcwZC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDMwMzAzMS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzAzMDMxLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5NjVkOQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDMwMzAzMS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDMxMzU2My0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzEzNTYzLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkM2E2NwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDMxMzU2My0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDMzMzIzMy0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzMzMjMzLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4ZTE3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDMzMzIzMy0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDM2NWExNy0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzY1YTE3LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0YWNiMgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDM2NWExNy0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDNjYzBjYy0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwM2NjMGNjLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmY2VjOAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDNjYzBjYy0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDNlN2IxYS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwM2U3YjFhLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlYWM4YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDNlN2IxYS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDQyLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA0Mi0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzAyYWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA0Mi0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDY0NjYzMC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwNjQ2NjMwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjY2U4NQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDY0NjYzMC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMDA4MS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0YTlkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMDA4MS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMDA4MS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2MTgyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMDA4MS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMDA4MS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NWEyZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMDA4MS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMDA4MS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzNTlkYQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMDA4MS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjE4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyMTgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZTVhZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjE4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjI4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyMjgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5N2MyMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjI4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjU4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNTgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5MTc5NQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjU4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjY4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNjgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1Y2JmMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjY4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjc4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNzgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3OTA2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjc4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjg4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyODgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlYWI0YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjg4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjk4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyOTgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3MmI1NQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMjk4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMmE4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYTgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2MGQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMmE4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMmI4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYjgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjYmE1NAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMmI4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMmM4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYzgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlYjUxZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMmM4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzA4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzMDgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMTUzNQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzA4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzQ4MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzNDgwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxZGY1MAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzQ4MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgxOS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODE5LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjZWZjOAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgxOS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgxZC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODFkLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2MWNkOQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgxZC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgxZS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODFlLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhMjY2NAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgxZS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgyMC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODIwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxYzFmNAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgyMC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgyNS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODI1LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NmVlZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgyNS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgyNy0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODI3LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlYTAxMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgyNy0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgyYi0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODJiLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjYTk4MAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgyYi0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzMy0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODMzLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4ZjYxZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzMy0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzNi0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM2LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkZDliMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzNi0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzNy0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM3LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3OWE3MQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzNy0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzOC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM4LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxZDFiZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzOC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzOS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM5LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5NzExMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzOS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzYS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODNhLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmYzgwNAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzYS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzZS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODNlLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiYzk3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzgzZS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3MzIxMQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0MS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQxLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5YmMyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0MS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0Ni0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQ2LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0MDQzMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0Ni0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0ZC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRkLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNTE2ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0ZC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0ZS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRlLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmMjkzMAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0ZS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0Zi0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRmLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiNjdjMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg0Zi0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg1MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODUwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyNTFjYwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzg1MC0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzkwMy0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzOTAzLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNDIwNgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDgyMzkwMy0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDlhODFmYS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwOWE4MWZhLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmZmE3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDlhODFmYS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMGI1YWU3OS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwYjVhZTc5LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmMDg1YgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMGI1YWU3OS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMTgyMDA4MS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4YTM3NwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMTgyMDA4MS0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMTgyMDA4MS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmNGFmNQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMTgyMDA4MS0xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMTgyMDA4MS0yIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2OGY0YgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMTgyMDA4MS0yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMTgyMDA4MS0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhNWYyMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMTgyMDA4MS0zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9saWJ0cnVzdHktcnMvc3JjL2xpYi5ycyBiL3RydXN0eS9saWJ0cnVzdHktcnMvc3JjL2xpYi5ycwppbmRleCAyOGVhMDc1Li4yMmI4OTRhIDEwMDY0NAotLS0gYS90cnVzdHkvbGlidHJ1c3R5LXJzL3NyYy9saWIucnMKKysrIGIvdHJ1c3R5L2xpYnRydXN0eS1ycy9zcmMvbGliLnJzCkBAIC0xMDIsNiArMTAyLDggQEAKICAgICAgICAgbGV0IGZpbGUgPSBGaWxlOjpvcHRpb25zKCkucmVhZCh0cnVlKS53cml0ZSh0cnVlKS5vcGVuKGRldmljZSk/OwogCiAgICAgICAgIGxldCBzcnZfbmFtZSA9IENTdHJpbmc6Om5ldyhzZXJ2aWNlKS5leHBlY3QoIlNlcnZpY2UgbmFtZSBjb250YWluZWQgbnVsbCBieXRlcyIpOworICAgICAgICAvLyBTQUZFVFk6IFRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgdmFsaWQgYmVjYXVzZSBpdCBjYW1lIGZyb20gYSBgRmlsZWAsIGFuZCB0aGUgbmFtZSBpcyBhCisgICAgICAgIC8vIHZhbGlkIEMgc3RyaW5nIGJlY2F1c2UgaXQgY2FtZSBmcm9tIGEgYENTdHJpbmdgLgogICAgICAgICB1bnNhZmUgewogICAgICAgICAgICAgdGlwY19jb25uZWN0KGZpbGUuYXNfcmF3X2ZkKCksIHNydl9uYW1lLmFzX3B0cigpKT87CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RydXN0eS9saWJ0cnVzdHkvdGlwYy10ZXN0L3RpcGNfdGVzdC5jIGIvdHJ1c3R5L2xpYnRydXN0eS90aXBjLXRlc3QvdGlwY190ZXN0LmMKaW5kZXggODFjOTg4MS4uZGFiZTExOCAxMDA2NDQKLS0tIGEvdHJ1c3R5L2xpYnRydXN0eS90aXBjLXRlc3QvdGlwY190ZXN0LmMKKysrIGIvdHJ1c3R5L2xpYnRydXN0eS90aXBjLXRlc3QvdGlwY190ZXN0LmMKQEAgLTIyLDggKzIyLDEwIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjZGVmaW5lIF9fVVNFX0dOVQorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgogCiAjaW5jbHVkZSA8QnVmZmVyQWxsb2NhdG9yL0J1ZmZlckFsbG9jYXRvcldyYXBwZXIuaD4KIApAQCAtMzEsOCArMzMsMjcgQEAKIAogI2RlZmluZSBUSVBDX0RFRkFVTFRfREVWTkFNRSAiL2Rldi90cnVzdHktaXBjLWRldjAiCiAKLXN0YXRpYyBjb25zdCBjaGFyICpkZXZfbmFtZSA9IE5VTEw7Ci1zdGF0aWMgY29uc3QgY2hhciAqdGVzdF9uYW1lID0gTlVMTDsKKy8qIGNsYW5nLWZvcm1hdCBvZmYgKi8KKyNkZWZpbmUgQkVOQ0hfUkVTVUxUX1RQTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyJ7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgXCJzY2hlbWFfdmVyc2lvblwiOiAzLCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgXCJzdWl0ZV9uYW1lXCI6IFwiY3J5cHRvXCIsIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgXCJiZW5jaF9uYW1lXCI6IFwiJXNcIiwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgXCJyZXN1bHRzXCI6IFsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgIHsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcIm1ldHJpY19uYW1lXCI6IFwidGltZV9taWNyb19zZWNcIiwiICAgICAgICAgIFwKKyIgICAgICAgICAgICBcIm1pblwiOiBcIiUiIFBSSWQ2NCAiXCIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcIm1heFwiOiBcIiUiIFBSSWQ2NCAiXCIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcImF2Z1wiOiBcIiUiIFBSSWQ2NCAiXCIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcImNvbGRcIjogXCIlIiBQUklkNjQgIlwiLCIgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcInJhd19taW5cIjogJSIgUFJJZDY0ICIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcInJhd19tYXhcIjogJSIgUFJJZDY0ICIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcInJhd19hdmdcIjogJSIgUFJJZDY0ICIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcInJhd19jb2xkXCI6ICUiIFBSSWQ2NCAiIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgIH0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgXSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyJ9IgorLyogY2xhbmctZm9ybWF0IG9uICovCiAKIHN0YXRpYyBjb25zdCBjaGFyICp1dWlkX25hbWUgPSAiY29tLmFuZHJvaWQuaXBjLXVuaXR0ZXN0LnNydi51dWlkIjsKIHN0YXRpYyBjb25zdCBjaGFyICplY2hvX25hbWUgPSAiY29tLmFuZHJvaWQuaXBjLXVuaXR0ZXN0LnNydi5lY2hvIjsKQEAgLTQ0LDggKzY1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpjbG9zZXIzX25hbWUgPSAiY29tLmFuZHJvaWQuaXBjLXVuaXR0ZXN0LnNydi5jbG9zZXIzIjsKIHN0YXRpYyBjb25zdCBjaGFyICptYWluX2N0cmxfbmFtZSA9ICJjb20uYW5kcm9pZC5pcGMtdW5pdHRlc3QuY3RybCI7CiBzdGF0aWMgY29uc3QgY2hhciogcmVjZWl2ZXJfbmFtZSA9ICJjb20uYW5kcm9pZC50cnVzdHkubWVtcmVmLnJlY2VpdmVyIjsKK3N0YXRpYyBjb25zdCBzaXplX3QgbWVtcmVmX2NodW5rX3NpemUgPSA0MDk2OwogCi1zdGF0aWMgY29uc3QgY2hhciogX3NvcHRzID0gImhzdkRTOnQ6cjptOmI6IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBfc29wdHMgPSAiaHN2RFM6dDpyOm06YjpCOiI7CiAvKiBjbGFuZy1mb3JtYXQgb2ZmICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBfbG9wdHNbXSA9ICB7CiAgICAgeyJoZWxwIiwgICAgbm9fYXJndW1lbnQsICAgICAgIDAsICdoJ30sCkBAIC01Niw2ICs3OCw4IEBACiAgICAgeyJyZXBlYXQiLCAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdyJ30sCiAgICAgeyJidXJzdCIsICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdiJ30sCiAgICAgeyJtc2dzaXplIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdtJ30sCisgICAgeyJ0ZXN0IiwgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCisgICAgeyJiZW5jaCIsICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdCJ30sCiAgICAgezAsIDAsIDAsIDB9CiB9OwogLyogY2xhbmctZm9ybWF0IG9uICovCkBAIC03Myw2ICs5Nyw3IEBACiAgICAgICAgICIgIC1tLCAtLW1zZ3NpemUgc2l6ZSAgICBtYXggbWVzc2FnZSBzaXplXG4iCiAgICAgICAgICIgIC12LCAtLXZhcmlhYmxlICAgICAgICB2YXJpYWJsZSBtZXNzYWdlIHNpemVcbiIKICAgICAgICAgIiAgLXMsIC0tc2lsZW50ICAgICAgICAgIHNpbGVudFxuIgorICAgICAgICAiICAtQiwgLS1iZW5jaCAgICAgICAgICAgUnVuIGFzIEJlbmNobWFyayBOIHRpbWVzXG4iCiAgICAgICAgICJcbiI7CiAKIHN0YXRpYyBjb25zdCBjaGFyKiB1c2FnZV9sb25nID0KQEAgLTk1LDEyICsxMjAsMzQgQEAKICAgICAgICAgIiAgIHNlbmQtZmQgICAgICAtIHRyYW5zbWl0IGRtYV9idWYgdG8gdHJ1c3R5LCB1c2UgYXMgc2htXG4iCiAgICAgICAgICJcbiI7CiAKLXN0YXRpYyB1aW50IG9wdF9yZXBlYXQgID0gMTsKLXN0YXRpYyB1aW50IG9wdF9tc2dzaXplID0gMzI7Ci1zdGF0aWMgdWludCBvcHRfbXNnYnVyc3QgPSAzMjsKLXN0YXRpYyBib29sIG9wdF92YXJpYWJsZSA9IGZhbHNlOwotc3RhdGljIGJvb2wgb3B0X3NpbGVudCA9IGZhbHNlOwotc3RhdGljIGNoYXIqIHNydl9uYW1lID0gTlVMTDsKK3N0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zIHsKKyAgICB1aW50IHJlcGVhdDsKKyAgICB1aW50IG1zZ3NpemU7CisgICAgdWludCBtc2didXJzdDsKKyAgICBib29sIHZhcmlhYmxlOworICAgIGJvb2wgc2lsZW50OworICAgIHVpbnQgYmVuY2g7CisgICAgY2hhciogc3J2X25hbWU7CisgICAgY2hhciogZGV2X25hbWU7CisgICAgY2hhciogdGVzdF9uYW1lOworfTsKK3R5cGVkZWYgaW50ICgqdGlwY190ZXN0X2Z1bmNfdCkoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqKTsKKworc3RydWN0IHRpcGNfdGVzdF9kZWYgeworICAgIGNoYXIqIHRlc3RfbmFtZTsKKyAgICB0aXBjX3Rlc3RfZnVuY190IGZ1bmM7Cit9OworCitzdGF0aWMgdm9pZCBpbml0X3BhcmFtcyhzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CisgICAgcGFyYW1zLT5yZXBlYXQgPSAxOworICAgIHBhcmFtcy0+bXNnc2l6ZSA9IDMyOworICAgIHBhcmFtcy0+bXNnYnVyc3QgPSAzMjsKKyAgICBwYXJhbXMtPnZhcmlhYmxlID0gZmFsc2U7CisgICAgcGFyYW1zLT5zaWxlbnQgPSBmYWxzZTsKKyAgICBwYXJhbXMtPmJlbmNoID0gMDsKKyAgICBwYXJhbXMtPnNydl9uYW1lID0gTlVMTDsKKyAgICBwYXJhbXMtPnRlc3RfbmFtZSA9IE5VTEw7Cit9CiAKIHN0YXRpYyB2b2lkIHByaW50X3VzYWdlX2FuZF9leGl0KGNvbnN0IGNoYXIgKnByb2csIGludCBjb2RlLCBib29sIHZlcmJvc2UpCiB7CkBAIC0xMDksOCArMTU2LDcgQEAKICAgICBleGl0KGNvZGUpOwogfQogCi1zdGF0aWMgdm9pZCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKK3N0YXRpYyB2b2lkIHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2LCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgaW50IGM7CiAgICAgaW50IG9pZHggPSAwOwogCkBAIC0xMjAsMzUgKzE2NiwzOSBAQAogCiAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgZGV2X25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPmRldl9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgIHNydl9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zcnZfbmFtZSA9IHN0cmR1cChvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICB0ZXN0X25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnRlc3RfbmFtZSA9IHN0cmR1cChvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgICAgICBvcHRfdmFyaWFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHBhcmFtcy0+dmFyaWFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICBvcHRfcmVwZWF0ID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+cmVwZWF0ID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICBvcHRfbXNnc2l6ZSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPm1zZ3NpemUgPSBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgIG9wdF9tc2didXJzdCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPm1zZ2J1cnN0ID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICBvcHRfc2lsZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNpbGVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIHBhcmFtcy0+YmVuY2ggPSBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgJ2gnOgpAQCAtMTYxLDMyICsyMTEsMzEgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgY29ubmVjdF90ZXN0KHVpbnQgcmVwZWF0KQoteworc3RhdGljIGludCBjb25uZWN0X3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIHVpbnQgaTsKICAgICBpbnQgZWNob19mZDsKICAgICBpbnQgZHNpbmtfZmQ7CiAgICAgaW50IGN1c3RvbV9mZDsKIAotICAgIGlmICghb3B0X3NpbGVudCkgewotICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgPSAldVxuIiwgX19mdW5jX18sIHJlcGVhdCk7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgeworICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgPSAldVxuIiwgX19mdW5jX18sIHBhcmFtcy0+cmVwZWF0KTsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKLSAgICAgICAgaWYgKHNydl9uYW1lKSB7Ci0gICAgICAgICAgICBjdXN0b21fZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIHNydl9uYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5yZXBlYXQ7IGkrKykgeworICAgICAgICBpZiAocGFyYW1zLT5zcnZfbmFtZSkgeworICAgICAgICAgICAgY3VzdG9tX2ZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIHBhcmFtcy0+c3J2X25hbWUpOwogICAgICAgICAgICAgaWYgKGN1c3RvbV9mZCA8IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgc3J2X25hbWUpOworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCBwYXJhbXMtPnNydl9uYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjdXN0b21fZmQgPj0gMCkgewogICAgICAgICAgICAgICAgIHRpcGNfY2xvc2UoY3VzdG9tX2ZkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVjaG9fZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIGVjaG9fbmFtZSk7CisgICAgICAgICAgICBlY2hvX2ZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGVjaG9fbmFtZSk7CiAgICAgICAgICAgICBpZiAoZWNob19mZCA8IDApIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgImVjaG8iKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzaW5rX2ZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBkYXRhc2lua19uYW1lKTsKKyAgICAgICAgICAgIGRzaW5rX2ZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGRhdGFzaW5rX25hbWUpOwogICAgICAgICAgICAgaWYgKGRzaW5rX2ZkIDwgMCkgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCAiZGF0YXNpbmsiKTsKICAgICAgICAgICAgIH0KQEAgLTIwMCw3OSArMjQ5LDc1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjb25uZWN0X2Zvbyh1aW50IHJlcGVhdCkKLXsKK3N0YXRpYyBpbnQgY29ubmVjdF9mb28oY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIHVpbnQgaTsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ID0gJXVcbiIsIF9fZnVuY19fLCByZXBlYXQpOworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKKyAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ID0gJXVcbiIsIF9fZnVuY19fLCBwYXJhbXMtPnJlcGVhdCk7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7Ci0gICAgICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCAiZm9vIik7CisgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+cmVwZWF0OyBpKyspIHsKKyAgICAgICAgZmQgPSB0aXBjX2Nvbm5lY3QocGFyYW1zLT5kZXZfbmFtZSwgImZvbyIpOwogICAgICAgICBpZiAoZmQgPj0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzdWNjZWVkZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJmb28iKTsKICAgICAgICAgICAgIHRpcGNfY2xvc2UoZmQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBjbG9zZXIxX3Rlc3QodWludCByZXBlYXQpCi17CitzdGF0aWMgaW50IGNsb3NlcjFfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgdWludCBpOwogICAgIGludCBmZDsKIAotICAgIGlmICghb3B0X3NpbGVudCkgewotICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgPSAldVxuIiwgX19mdW5jX18sIHJlcGVhdCk7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgeworICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgPSAldVxuIiwgX19mdW5jX18sIHBhcmFtcy0+cmVwZWF0KTsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKLSAgICAgICAgZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIGNsb3NlcjFfbmFtZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+cmVwZWF0OyBpKyspIHsKKyAgICAgICAgZmQgPSB0aXBjX2Nvbm5lY3QocGFyYW1zLT5kZXZfbmFtZSwgY2xvc2VyMV9uYW1lKTsKICAgICAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJjbG9zZXIxIik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICAgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICAgICAgcHJpbnRmKCIlczogY29ubmVjdGVkXG4iLCBfX2Z1bmNfXyk7CiAgICAgICAgIH0KICAgICAgICAgdGlwY19jbG9zZShmZCk7CiAgICAgfQogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2xvc2VyMl90ZXN0KHVpbnQgcmVwZWF0KQoteworc3RhdGljIGludCBjbG9zZXIyX3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIHVpbnQgaTsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ID0gJXVcbiIsIF9fZnVuY19fLCByZXBlYXQpOworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKKyAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ID0gJXVcbiIsIF9fZnVuY19fLCBwYXJhbXMtPnJlcGVhdCk7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7Ci0gICAgICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBjbG9zZXIyX25hbWUpOworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnJlcGVhdDsgaSsrKSB7CisgICAgICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGNsb3NlcjJfbmFtZSk7CiAgICAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgICAgIGlmICghb3B0X3NpbGVudCkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICAgICAgICAgIHByaW50ZigiZmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCAiY2xvc2VyMiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewpAQCAtMjgyLDM4ICszMjcsMzcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCIlczogZG9uZVxuIiwgX19mdW5jX18pOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNsb3NlcjNfdGVzdCh1aW50IHJlcGVhdCkKLXsKK3N0YXRpYyBpbnQgY2xvc2VyM190ZXN0KGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICB1aW50IGksIGo7CiAgICAgc3NpemVfdCByYzsKICAgICBpbnQgZmRbNF07CiAgICAgY2hhciBidWZbNjRdOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7Ci0gICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCA9ICV1XG4iLCBfX2Z1bmNfXywgcmVwZWF0KTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCA9ICV1XG4iLCBfX2Z1bmNfXywgcGFyYW1zLT5yZXBlYXQpOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnJlcGVhdDsgaSsrKSB7CiAgICAgICAgIC8qIG9wZW4gNCBjb25uZWN0aW9ucyB0byBjbG9zZXIzIHNlcnZpY2UgKi8KICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotICAgICAgICAgICAgZmRbal0gPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIGNsb3NlcjNfbmFtZSk7CisgICAgICAgICAgICBmZFtqXSA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBjbG9zZXIzX25hbWUpOwogICAgICAgICAgICAgaWYgKGZkW2pdIDwgMCkgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmRbJWRdOiBmYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsIGosICJjbG9zZXIzIik7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghb3B0X3NpbGVudCkgeworICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogZmRbJWRdPSVkOiBjb25uZWN0ZWRcbiIsIF9fZnVuY19fLCBqLCBmZFtqXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1lbXNldChidWYsIGkgKyBqLCBzaXplb2YoYnVmKSk7CiAgICAgICAgICAgICAgICAgcmMgPSB3cml0ZShmZFtqXSwgYnVmLCBzaXplb2YoYnVmKSk7CiAgICAgICAgICAgICAgICAgaWYgKHJjICE9IHNpemVvZihidWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb3B0X3NpbGVudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBmZFslZF09JWQ6IHdyaXRlIHJldHVybmVkICA9ICV6ZFxuIiwgX19mdW5jX18sIGosIGZkW2pdLCByYyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCJjbG9zZXIzX3Rlc3Q6IHdyaXRlIik7CkBAIC0zMjksNyArMzczLDcgQEAKICAgICAgICAgICAgIGlmIChmZFtqXSA8IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgcmMgPSB3cml0ZShmZFtqXSwgYnVmLCBzaXplb2YoYnVmKSk7CiAgICAgICAgICAgICBpZiAocmMgIT0gc2l6ZW9mKGJ1ZikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IGZkWyVkXT0lZDogd3JpdGUgcmV0dXJuZWQgPSAlemRcbiIsIF9fZnVuY19fLCBqLCBmZFtqXSwgcmMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwZXJyb3IoImNsb3NlcjNfdGVzdDogd3JpdGUiKTsKQEAgLTM0NCwzOCArMzg4LDM2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IGVjaG9fdGVzdCh1aW50IHJlcGVhdCwgdWludCBtc2dzeiwgYm9vbCB2YXIpCi17CitzdGF0aWMgaW50IGVjaG9fdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgdWludCBpOwogICAgIHNzaXplX3QgcmM7CiAgICAgc2l6ZV90IG1zZ19sZW47CiAgICAgaW50IGVjaG9fZmQgPSAtMTsKLSAgICBjaGFyIHR4X2J1Zlttc2dzel07Ci0gICAgY2hhciByeF9idWZbbXNnc3pdOworICAgIGNoYXIgdHhfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CisgICAgY2hhciByeF9idWZbcGFyYW1zLT5tc2dzaXplXTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgewotICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgJXU6IG1zZ3N6ICV1OiB2YXJpYWJsZSAlc1xuIiwgX19mdW5jX18sIHJlcGVhdCwgbXNnc3osCi0gICAgICAgICAgICAgICB2YXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldTogcGFyYW1zLT5tc2dzaXplICV1OiB2YXJpYWJsZSAlc1xuIiwgX19mdW5jX18sIHBhcmFtcy0+cmVwZWF0LAorICAgICAgICAgICAgICAgcGFyYW1zLT5tc2dzaXplLCBwYXJhbXMtPnZhcmlhYmxlID8gInRydWUiIDogImZhbHNlIik7CiAgICAgfQogCi0gICAgZWNob19mZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgZWNob19uYW1lKTsKKyAgICBlY2hvX2ZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGVjaG9fbmFtZSk7CiAgICAgaWYgKGVjaG9fZmQgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmljZVxuIik7CiAgICAgICAgIHJldHVybiBlY2hvX2ZkOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewotICAgICAgICBtc2dfbGVuID0gbXNnc3o7Ci0gICAgICAgIGlmIChvcHRfdmFyaWFibGUgJiYgbXNnc3opIHsKLSAgICAgICAgICAgIG1zZ19sZW4gPSByYW5kKCkgJSBtc2dzejsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5yZXBlYXQ7IGkrKykgeworICAgICAgICBtc2dfbGVuID0gcGFyYW1zLT5tc2dzaXplOworICAgICAgICBpZiAocGFyYW1zLT52YXJpYWJsZSAmJiBwYXJhbXMtPm1zZ3NpemUpIHsKKyAgICAgICAgICAgIG1zZ19sZW4gPSByYW5kKCkgJSBwYXJhbXMtPm1zZ3NpemU7CiAgICAgICAgIH0KIAogICAgICAgICBtZW1zZXQodHhfYnVmLCBpICsgMSwgbXNnX2xlbik7CkBAIC00MDUsMzcgKzQ0NywzNyBAQAogCiAgICAgdGlwY19jbG9zZShlY2hvX2ZkKTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCIlczogZG9uZVxuIiwgX19mdW5jX18pOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJ1cnN0X3dyaXRlX3Rlc3QodWludCByZXBlYXQsIHVpbnQgbXNnYnVyc3QsIHVpbnQgbXNnc3osIGJvb2wgdmFyKQoteworc3RhdGljIGludCBidXJzdF93cml0ZV90ZXN0KGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICBpbnQgZmQ7CiAgICAgdWludCBpLCBqOwogICAgIHNzaXplX3QgcmM7CiAgICAgc2l6ZV90IG1zZ19sZW47Ci0gICAgY2hhciB0eF9idWZbbXNnc3pdOworICAgIGNoYXIgdHhfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ICV1OiBidXJzdCAldTogbXNnc3ogJXU6IHZhcmlhYmxlICVzXG4iLCBfX2Z1bmNfXywgcmVwZWF0LCBtc2didXJzdCwKLSAgICAgICAgICAgICAgIG1zZ3N6LCB2YXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldTogYnVyc3QgJXU6IHBhcmFtcy0+bXNnc2l6ZSAldTogdmFyaWFibGUgJXNcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgcGFyYW1zLT5yZXBlYXQsIHBhcmFtcy0+bXNnYnVyc3QsIHBhcmFtcy0+bXNnc2l6ZSwKKyAgICAgICAgICAgICAgIHBhcmFtcy0+dmFyaWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKLSAgICAgICAgZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIGRhdGFzaW5rX25hbWUpOworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnJlcGVhdDsgaSsrKSB7CisgICAgICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGRhdGFzaW5rX25hbWUpOwogICAgICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgImRhdGFzaW5rIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBtc2didXJzdDsgaisrKSB7Ci0gICAgICAgICAgICBtc2dfbGVuID0gbXNnc3o7Ci0gICAgICAgICAgICBpZiAodmFyICYmIG1zZ3N6KSB7Ci0gICAgICAgICAgICAgICAgbXNnX2xlbiA9IHJhbmQoKSAlIG1zZ3N6OworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGFyYW1zLT5tc2didXJzdDsgaisrKSB7CisgICAgICAgICAgICBtc2dfbGVuID0gcGFyYW1zLT5tc2dzaXplOworICAgICAgICAgICAgaWYgKHBhcmFtcy0+dmFyaWFibGUgJiYgcGFyYW1zLT5tc2dzaXplKSB7CisgICAgICAgICAgICAgICAgbXNnX2xlbiA9IHJhbmQoKSAlIHBhcmFtcy0+bXNnc2l6ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbWVtc2V0KHR4X2J1ZiwgaSArIDEsIG1zZ19sZW4pOwpAQCAtNDQ5LDIzICs0OTEsMjEgQEAKICAgICAgICAgdGlwY19jbG9zZShmZCk7CiAgICAgfQogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBfd2FpdF9mb3JfbXNnKGludCBmZCwgdWludCBtc2dzeiwgaW50IHRpbWVvdXQpCi17CitzdGF0aWMgaW50IF93YWl0X2Zvcl9tc2coaW50IGZkLCBpbnQgdGltZW91dCwgY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIGludCByYzsKICAgICBmZF9zZXQgcmZkczsKICAgICB1aW50IG1zZ2NudCA9IDA7Ci0gICAgY2hhciByeF9idWZbbXNnc3pdOworICAgIGNoYXIgcnhfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CiAgICAgc3RydWN0IHRpbWV2YWwgdHY7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50Zigid2FpdGluZyAoJWQpIGZvciBtc2dcbiIsIHRpbWVvdXQpOwogICAgIH0KIApAQCAtNDc5LDcgKzUxOSw3IEBACiAgICAgICAgIHJjID0gc2VsZWN0KGZkICsgMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7CiAKICAgICAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgICAgIGlmICghb3B0X3NpbGVudCkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICAgICAgICAgIHByaW50Zigic2VsZWN0IHRpbWVkb3V0XG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTAxLDQyICs1NDEsNDAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCJnb3QgJXUgbWVzc2FnZXNcbiIsIG1zZ2NudCk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBzZWxlY3RfdGVzdCh1aW50IHJlcGVhdCwgdWludCBtc2didXJzdCwgdWludCBtc2dzeikKLXsKK3N0YXRpYyBpbnQgc2VsZWN0X3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIGludCBmZDsKICAgICB1aW50IGksIGo7CiAgICAgc3NpemVfdCByYzsKLSAgICBjaGFyIHR4X2J1Zlttc2dzel07CisgICAgY2hhciB0eF9idWZbcGFyYW1zLT5tc2dzaXplXTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgewotICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgJXVcbiIsIF9fZnVuY19fLCByZXBlYXQpOworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKKyAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ICV1XG4iLCBfX2Z1bmNfXywgcGFyYW1zLT5yZXBlYXQpOwogICAgIH0KIAotICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBlY2hvX25hbWUpOworICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGVjaG9fbmFtZSk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgImVjaG8iKTsKICAgICAgICAgcmV0dXJuIGZkOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewotICAgICAgICBfd2FpdF9mb3JfbXNnKGZkLCBtc2dzeiwgMSk7CisgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+cmVwZWF0OyBpKyspIHsKKyAgICAgICAgX3dhaXRfZm9yX21zZyhmZCwgMSwgcGFyYW1zKTsKIAotICAgICAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgICAgIHByaW50Zigic2VuZGluZyBidXJzdDogJXUgbXNnXG4iLCBtc2didXJzdCk7CisgICAgICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKKyAgICAgICAgICAgIHByaW50Zigic2VuZGluZyBidXJzdDogJXUgbXNnXG4iLCBwYXJhbXMtPm1zZ2J1cnN0KTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBtc2didXJzdDsgaisrKSB7Ci0gICAgICAgICAgICBtZW1zZXQodHhfYnVmLCBpICsgaiwgbXNnc3opOwotICAgICAgICAgICAgcmMgPSB3cml0ZShmZCwgdHhfYnVmLCBtc2dzeik7Ci0gICAgICAgICAgICBpZiAoKHNpemVfdClyYyAhPSBtc2dzeikgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGFyYW1zLT5tc2didXJzdDsgaisrKSB7CisgICAgICAgICAgICBtZW1zZXQodHhfYnVmLCBpICsgaiwgcGFyYW1zLT5tc2dzaXplKTsKKyAgICAgICAgICAgIHJjID0gd3JpdGUoZmQsIHR4X2J1ZiwgcGFyYW1zLT5tc2dzaXplKTsKKyAgICAgICAgICAgIGlmICgoc2l6ZV90KXJjICE9IHBhcmFtcy0+bXNnc2l6ZSkgewogICAgICAgICAgICAgICAgIHBlcnJvcigiYnVyc3RfdGVzdDogd3JpdGUiKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTU0NSwzNyArNTgzLDM2IEBACiAKICAgICB0aXBjX2Nsb3NlKGZkKTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCIlczogZG9uZVxuIiwgX19mdW5jX18pOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJsb2NrZWRfcmVhZF90ZXN0KHVpbnQgcmVwZWF0KQoteworc3RhdGljIGludCBibG9ja2VkX3JlYWRfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgaW50IGZkOwogICAgIHVpbnQgaTsKICAgICBzc2l6ZV90IHJjOwogICAgIGNoYXIgcnhfYnVmWzUxMl07CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ICV1XG4iLCBfX2Z1bmNfXywgcmVwZWF0KTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldVxuIiwgX19mdW5jX18sIHBhcmFtcy0+cmVwZWF0KTsKICAgICB9CiAKLSAgICBmZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgZWNob19uYW1lKTsKKyAgICBmZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBlY2hvX25hbWUpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJlY2hvIik7CiAgICAgICAgIHJldHVybiBmZDsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5yZXBlYXQ7IGkrKykgewogICAgICAgICByYyA9IHJlYWQoZmQsIHJ4X2J1Ziwgc2l6ZW9mKHJ4X2J1ZikpOwogICAgICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgICAgICBwZXJyb3IoInNlbGVjdF90ZXN0OiByZWFkIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghb3B0X3NpbGVudCkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICAgICAgICAgIHByaW50ZigiZ290ICV6ZCBieXRlc1xuIiwgcmMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01ODMsMTUgKzYyMCwxNCBAQAogCiAgICAgdGlwY19jbG9zZShmZCk7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0YTJ0YV9pcGNfdGVzdCh2b2lkKQoteworc3RhdGljIGludCB0YTJ0YV9pcGNfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgZW51bSB0ZXN0X21lc3NhZ2VfaGVhZGVyIHsKICAgICAgICAgVEVTVF9QQVNTRUQgPSAwLAogICAgICAgICBURVNUX0ZBSUxFRCA9IDEsCkBAIC02MDMsMTEgKzYzOSwxMSBAQAogICAgIGludCByZXQ7CiAgICAgdW5zaWduZWQgY2hhciByeF9idWZbMjU2XTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCIlczpcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKLSAgICBmZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgbWFpbl9jdHJsX25hbWUpOworICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIG1haW5fY3RybF9uYW1lKTsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCAibWFpbl9jdHJsIik7CiAgICAgICAgIHJldHVybiBmZDsKQEAgLTY1NywxMyArNjkzLDEyIEBACiAgICAgICAgICAgIHV1aWQtPmNsb2NrX3NlcV9hbmRfbm9kZVs3XSk7CiB9CiAKLXN0YXRpYyBpbnQgZGV2X3V1aWRfdGVzdCh2b2lkKQoteworc3RhdGljIGludCBkZXZfdXVpZF90ZXN0KGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICBpbnQgZmQ7CiAgICAgc3NpemVfdCByYzsKICAgICB1dWlkX3QgdXVpZDsKIAotICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCB1dWlkX25hbWUpOworICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIHV1aWRfbmFtZSk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgInV1aWQiKTsKICAgICAgICAgcmV0dXJuIGZkOwpAQCAtNjc2LDcgKzcxMSw3IEBACiAgICAgfSBlbHNlIGlmIChyYyAhPSBzaXplb2YodXVpZCkpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmV4cGVjdGVkIHV1aWQgc2l6ZSAoJWQgdnMuICVkKVxuIiwgKGludClyYywgKGludClzaXplb2YodXVpZCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50X3V1aWQoZGV2X25hbWUsICZ1dWlkKTsKKyAgICAgICAgcHJpbnRfdXVpZChwYXJhbXMtPmRldl9uYW1lLCAmdXVpZCk7CiAgICAgfQogCiAgICAgdGlwY19jbG9zZShmZCk7CkBAIC02ODQsNjEgKzcxOSw1OCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRhX2FjY2Vzc190ZXN0KHZvaWQpCi17CitzdGF0aWMgaW50IHRhX2FjY2Vzc190ZXN0KGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6XG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCi0gICAgZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIHRhX29ubHlfbmFtZSk7CisgICAgZmQgPSB0aXBjX2Nvbm5lY3QocGFyYW1zLT5kZXZfbmFtZSwgdGFfb25seV9uYW1lKTsKICAgICBpZiAoZmQgPj0gMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlN1Y2NlZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJ0YV9vbmx5Iik7CiAgICAgICAgIHRpcGNfY2xvc2UoZmQpOwogICAgIH0KIAotICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBuc19vbmx5X25hbWUpOworICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIG5zX29ubHlfbmFtZSk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgIm5zX29ubHkiKTsKICAgICAgICAgcmV0dXJuIGZkOwogICAgIH0KICAgICB0aXBjX2Nsb3NlKGZkKTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCIlczogZG9uZVxuIiwgX19mdW5jX18pOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgd3JpdGV2X3Rlc3QodWludCByZXBlYXQsIHVpbnQgbXNnc3osIGJvb2wgdmFyKQoteworc3RhdGljIGludCB3cml0ZXZfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgdWludCBpOwogICAgIHNzaXplX3QgcmM7CiAgICAgc2l6ZV90IG1zZ19sZW47CiAgICAgaW50IGVjaG9fZmQgPSAtMTsKLSAgICBjaGFyIHR4MF9idWZbbXNnc3pdOwotICAgIGNoYXIgdHgxX2J1Zlttc2dzel07Ci0gICAgY2hhciByeF9idWZbbXNnc3pdOworICAgIGNoYXIgdHgwX2J1ZltwYXJhbXMtPm1zZ3NpemVdOworICAgIGNoYXIgdHgxX2J1ZltwYXJhbXMtPm1zZ3NpemVdOworICAgIGNoYXIgcnhfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CiAgICAgc3RydWN0IGlvdmVjIGlvdnNbMl0gPSB7e3R4MF9idWYsIDB9LCB7dHgxX2J1ZiwgMH19OwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7Ci0gICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldTogbXNnc3ogJXU6IHZhcmlhYmxlICVzXG4iLCBfX2Z1bmNfXywgcmVwZWF0LCBtc2dzeiwKLSAgICAgICAgICAgICAgIHZhciA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKKyAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ICV1OiBwYXJhbXMtPm1zZ3NpemUgJXU6IHZhcmlhYmxlICVzXG4iLCBfX2Z1bmNfXywgcGFyYW1zLT5yZXBlYXQsCisgICAgICAgICAgICAgICBwYXJhbXMtPm1zZ3NpemUsIHBhcmFtcy0+dmFyaWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICB9CiAKLSAgICBlY2hvX2ZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBlY2hvX25hbWUpOworICAgIGVjaG9fZmQgPSB0aXBjX2Nvbm5lY3QocGFyYW1zLT5kZXZfbmFtZSwgZWNob19uYW1lKTsKICAgICBpZiAoZWNob19mZCA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byBzZXJ2aWNlXG4iKTsKICAgICAgICAgcmV0dXJuIGVjaG9fZmQ7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7Ci0gICAgICAgIG1zZ19sZW4gPSBtc2dzejsKLSAgICAgICAgaWYgKG9wdF92YXJpYWJsZSAmJiBtc2dzeikgewotICAgICAgICAgICAgbXNnX2xlbiA9IHJhbmQoKSAlIG1zZ3N6OworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnJlcGVhdDsgaSsrKSB7CisgICAgICAgIG1zZ19sZW4gPSBwYXJhbXMtPm1zZ3NpemU7CisgICAgICAgIGlmIChwYXJhbXMtPnZhcmlhYmxlICYmIHBhcmFtcy0+bXNnc2l6ZSkgeworICAgICAgICAgICAgbXNnX2xlbiA9IHJhbmQoKSAlIHBhcmFtcy0+bXNnc2l6ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlvdnNbMF0uaW92X2xlbiA9IG1zZ19sZW4gLyAzOwpAQCAtNzg1LDM5ICs4MTcsMzggQEAKIAogICAgIHRpcGNfY2xvc2UoZWNob19mZCk7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWFkdl90ZXN0KHVpbnQgcmVwZWF0LCB1aW50IG1zZ3N6LCBib29sIHZhcikKLXsKK3N0YXRpYyBpbnQgcmVhZHZfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgdWludCBpOwogICAgIHNzaXplX3QgcmM7CiAgICAgc2l6ZV90IG1zZ19sZW47CiAgICAgaW50IGVjaG9fZmQgPSAtMTsKLSAgICBjaGFyIHR4X2J1Zlttc2dzel07Ci0gICAgY2hhciByeDBfYnVmW21zZ3N6XTsKLSAgICBjaGFyIHJ4MV9idWZbbXNnc3pdOworICAgIGNoYXIgdHhfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CisgICAgY2hhciByeDBfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CisgICAgY2hhciByeDFfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CiAgICAgc3RydWN0IGlvdmVjIGlvdnNbMl0gPSB7e3J4MF9idWYsIDB9LCB7cngxX2J1ZiwgMH19OwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7Ci0gICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldTogbXNnc3ogJXU6IHZhcmlhYmxlICVzXG4iLCBfX2Z1bmNfXywgcmVwZWF0LCBtc2dzeiwKLSAgICAgICAgICAgICAgIHZhciA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKKyAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ICV1OiBwYXJhbXMtPm1zZ3NpemUgJXU6IHZhcmlhYmxlICVzXG4iLCBfX2Z1bmNfXywgcGFyYW1zLT5yZXBlYXQsCisgICAgICAgICAgICAgICBwYXJhbXMtPm1zZ3NpemUsIHBhcmFtcy0+dmFyaWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICB9CiAKLSAgICBlY2hvX2ZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBlY2hvX25hbWUpOworICAgIGVjaG9fZmQgPSB0aXBjX2Nvbm5lY3QocGFyYW1zLT5kZXZfbmFtZSwgZWNob19uYW1lKTsKICAgICBpZiAoZWNob19mZCA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byBzZXJ2aWNlXG4iKTsKICAgICAgICAgcmV0dXJuIGVjaG9fZmQ7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7Ci0gICAgICAgIG1zZ19sZW4gPSBtc2dzejsKLSAgICAgICAgaWYgKG9wdF92YXJpYWJsZSAmJiBtc2dzeikgewotICAgICAgICAgICAgbXNnX2xlbiA9IHJhbmQoKSAlIG1zZ3N6OworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnJlcGVhdDsgaSsrKSB7CisgICAgICAgIG1zZ19sZW4gPSBwYXJhbXMtPm1zZ3NpemU7CisgICAgICAgIGlmIChwYXJhbXMtPnZhcmlhYmxlICYmIHBhcmFtcy0+bXNnc2l6ZSkgeworICAgICAgICAgICAgbXNnX2xlbiA9IHJhbmQoKSAlIHBhcmFtcy0+bXNnc2l6ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlvdnNbMF0uaW92X2xlbiA9IG1zZ19sZW4gLyAzOwpAQCAtODY0LDIzICs4OTUsMjMgQEAKIAogICAgIHRpcGNfY2xvc2UoZWNob19mZCk7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzZW5kX2ZkX3Rlc3Qodm9pZCkgeworc3RhdGljIGludCBzZW5kX2ZkX3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIGludCByZXQ7CiAgICAgaW50IGRtYV9idWYgPSAtMTsKICAgICBpbnQgZmQgPSAtMTsKICAgICB2b2xhdGlsZSBjaGFyKiBidWYgPSBNQVBfRkFJTEVEOwogICAgIEJ1ZmZlckFsbG9jYXRvciogYWxsb2NhdG9yID0gTlVMTDsKIAotICAgIGNvbnN0IHNpemVfdCBudW1fcGFnZXMgPSAxMDsKKyAgICBjb25zdCBzaXplX3QgbnVtX2NodW5rcyA9IDEwOwogCi0gICAgZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIHJlY2VpdmVyX25hbWUpOworICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIHJlY2VpdmVyX25hbWUpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byB0ZXN0IHN1cHBvcnQgVEEgLSBpcyBpdCBtaXNzaW5nP1xuIik7CiAgICAgICAgIHJldCA9IC0xOwpAQCAtODk0LDcgKzkyNSw3IEBACiAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICB9CiAKLSAgICBzaXplX3QgYnVmX3NpemUgPSBQQUdFX1NJWkUgKiBudW1fcGFnZXM7CisgICAgc2l6ZV90IGJ1Zl9zaXplID0gbWVtcmVmX2NodW5rX3NpemUgKiBudW1fY2h1bmtzOwogICAgIGRtYV9idWYgPSBEbWFidWZIZWFwQWxsb2MoYWxsb2NhdG9yLCAic3lzdGVtIiwgYnVmX3NpemUsIDAsIDAgLyogbGVnYWN5IGFsaWduICovKTsKICAgICBpZiAoZG1hX2J1ZiA8IDApIHsKICAgICAgICAgcmV0ID0gZG1hX2J1ZjsKQEAgLTkyNywxMyArOTU4LDE3IEBACiAgICAgdGlwY19jbG9zZShmZCk7CiAKICAgICByZXQgPSAwOwotICAgIGZvciAoc2l6ZV90IHNraXAgPSAwOyBza2lwIDwgbnVtX3BhZ2VzOyBza2lwKyspIHsKLSAgICAgICAgcmV0IHw9IHN0cmNtcCgiSGVsbG8gZnJvbSBUcnVzdHkhIiwgKGNvbnN0IGNoYXIqKSZidWZbc2tpcCAqIFBBR0VfU0laRV0pID8gKC0xKSA6IDA7CisgICAgZm9yIChzaXplX3Qgc2tpcCA9IDA7IHNraXAgPCBudW1fY2h1bmtzOyBza2lwKyspIHsKKyAgICAgICAgaW50IGNtcCA9IHN0cmNtcCgiSGVsbG8gZnJvbSBUcnVzdHkhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopJmJ1Zltza2lwICogbWVtcmVmX2NodW5rX3NpemVdKSA/ICgtMSkgOiAwOworICAgICAgICBpZiAoY21wKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQ6IFVuZXhwZWN0ZWQgY29udGVudCBhdCBwYWdlICV6dSBpbiBkbWFidWZcbiIsIHNraXApOworICAgICAgICByZXQgfD0gY21wOwogICAgIH0KIAogY2xlYW51cDoKICAgICBpZiAoYnVmICE9IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgbXVubWFwKChjaGFyKilidWYsIFBBR0VfU0laRSk7CisgICAgICAgIG11bm1hcCgoY2hhciopYnVmLCBidWZfc2l6ZSk7CiAgICAgfQogICAgIGNsb3NlKGRtYV9idWYpOwogICAgIGlmIChhbGxvY2F0b3IpIHsKQEAgLTk0Myw2ICs5NzgsNzMgQEAKICAgICByZXR1cm4gcmV0OwogfQogCit1aW50NjRfdCBnZXRfdGltZV91cyh2b2lkKSB7CisgICAgc3RydWN0IHRpbWVzcGVjIHNwZWM7CisKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnNwZWMpOworICAgIHJldHVybiBzcGVjLnR2X3NlYyAqIDEwMDAwMDAgKyBzcGVjLnR2X25zZWMgLyAxMDAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9kZWYgdGlwY190ZXN0c1tdID0geworICAgICAgICB7ImNvbm5lY3QiLCBjb25uZWN0X3Rlc3R9LAorICAgICAgICB7ImNvbm5lY3RfZm9vIiwgY29ubmVjdF9mb299LAorICAgICAgICB7ImJ1cnN0X3dyaXRlIiwgYnVyc3Rfd3JpdGVfdGVzdH0sCisgICAgICAgIHsic2VsZWN0Iiwgc2VsZWN0X3Rlc3R9LAorICAgICAgICB7ImJsb2NrZWRfcmVhZCIsIGJsb2NrZWRfcmVhZF90ZXN0fSwKKyAgICAgICAgeyJjbG9zZXIxIiwgY2xvc2VyMV90ZXN0fSwKKyAgICAgICAgeyJjbG9zZXIyIiwgY2xvc2VyMl90ZXN0fSwKKyAgICAgICAgeyJjbG9zZXIzIiwgY2xvc2VyM190ZXN0fSwKKyAgICAgICAgeyJlY2hvIiwgZWNob190ZXN0fSwKKyAgICAgICAgeyJ0YTJ0YS1pcGMiLCB0YTJ0YV9pcGNfdGVzdH0sCisgICAgICAgIHsiZGV2LXV1aWQiLCBkZXZfdXVpZF90ZXN0fSwKKyAgICAgICAgeyJ0YS1hY2Nlc3MiLCB0YV9hY2Nlc3NfdGVzdH0sCisgICAgICAgIHsid3JpdGV2Iiwgd3JpdGV2X3Rlc3R9LAorICAgICAgICB7InJlYWR2IiwgcmVhZHZfdGVzdH0sCisgICAgICAgIHsic2VuZC1mZCIsIHNlbmRfZmRfdGVzdH0sCit9OworCit0aXBjX3Rlc3RfZnVuY190IGdldF90ZXN0X2Z1bmN0aW9uKGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZih0aXBjX3Rlc3RzKSAvIHNpemVvZih0aXBjX3Rlc3RzWzBdKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAocGFyYW1zLT50ZXN0X25hbWUsIHRpcGNfdGVzdHNbaV0udGVzdF9uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdGlwY190ZXN0c1tpXS5mdW5jOworICAgICAgICB9CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIHRlc3QgbmFtZSAnJXMnXG4iLCBwYXJhbXMtPnRlc3RfbmFtZSk7CisgICAgZXhpdCgxKTsKK30KKworc3RhdGljIGludCBydW5fYXNfYmVuY2goY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgeworICAgIGludCByYyA9IDA7CisgICAgaW50NjRfdCBtaW4gPSBJTlQ2NF9NQVg7CisgICAgaW50NjRfdCBtYXggPSAwOworICAgIGludDY0X3QgYXZnID0gMDsKKyAgICBpbnQ2NF90IGNvbGQgPSAwOworCisgICAgdWludDY0X3Qgc3RhcnQ7CisgICAgdWludDY0X3QgZW5kOworCisgICAgdGlwY190ZXN0X2Z1bmNfdCB0ZXN0ID0gZ2V0X3Rlc3RfZnVuY3Rpb24ocGFyYW1zKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHBhcmFtcy0+YmVuY2ggKyAxKSAmJiByYyA9PSAwOyArK2kpIHsKKyAgICAgICAgc3RhcnQgPSBnZXRfdGltZV91cygpOworICAgICAgICByYyB8PSB0ZXN0KHBhcmFtcyk7CisgICAgICAgIGVuZCA9IGdldF90aW1lX3VzKCk7CisgICAgICAgIGludDY0X3QgdCA9IGVuZCAtIHN0YXJ0OworCisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGNvbGQgPSB0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWluID0gKHQgPCBtaW4pID8gdCA6IG1pbjsKKyAgICAgICAgICAgIG1heCA9ICh0ID4gbWF4KSA/IHQgOiBtYXg7CisgICAgICAgICAgICBhdmcgKz0gdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdmcgLz0gcGFyYW1zLT5iZW5jaDsKKworICAgIGZwcmludGYoc3RkZXJyLCBCRU5DSF9SRVNVTFRfVFBMLCBwYXJhbXMtPnRlc3RfbmFtZSwgbWluLCBtYXgsIGF2ZywgY29sZCwgbWluLCBtYXgsIGF2ZywgY29sZCk7CisgICAgcmV0dXJuIHJjOworfQorCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAgICAgaW50IHJjID0gMDsKQEAgLTk1MCw1MiArMTA1MiwyNSBAQAogICAgIGlmIChhcmdjIDw9IDEpIHsKICAgICAgICAgcHJpbnRfdXNhZ2VfYW5kX2V4aXQoYXJndlswXSwgRVhJVF9GQUlMVVJFLCBmYWxzZSk7CiAgICAgfQorICAgIHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zIHBhcmFtczsKKyAgICBpbml0X3BhcmFtcygmcGFyYW1zKTsKKyAgICBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsICZwYXJhbXMpOwogCi0gICAgcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2KTsKLQotICAgIGlmICghZGV2X25hbWUpIHsKLSAgICAgICAgZGV2X25hbWUgPSBUSVBDX0RFRkFVTFRfREVWTkFNRTsKKyAgICBpZiAoIXBhcmFtcy5kZXZfbmFtZSkgeworICAgICAgICBwYXJhbXMuZGV2X25hbWUgPSBUSVBDX0RFRkFVTFRfREVWTkFNRTsKICAgICB9CiAKLSAgICBpZiAoIXRlc3RfbmFtZSkgeworICAgIGlmICghcGFyYW1zLnRlc3RfbmFtZSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5lZWQgYSBUZXN0IHRvIHJ1blxuIik7CiAgICAgICAgIHByaW50X3VzYWdlX2FuZF9leGl0KGFyZ3ZbMF0sIEVYSVRfRkFJTFVSRSwgdHJ1ZSk7CiAgICAgfQogCi0gICAgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJjb25uZWN0IikgPT0gMCkgewotICAgICAgICByYyA9IGNvbm5lY3RfdGVzdChvcHRfcmVwZWF0KTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJjb25uZWN0X2ZvbyIpID09IDApIHsKLSAgICAgICAgcmMgPSBjb25uZWN0X2ZvbyhvcHRfcmVwZWF0KTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJidXJzdF93cml0ZSIpID09IDApIHsKLSAgICAgICAgcmMgPSBidXJzdF93cml0ZV90ZXN0KG9wdF9yZXBlYXQsIG9wdF9tc2didXJzdCwgb3B0X21zZ3NpemUsIG9wdF92YXJpYWJsZSk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAic2VsZWN0IikgPT0gMCkgewotICAgICAgICByYyA9IHNlbGVjdF90ZXN0KG9wdF9yZXBlYXQsIG9wdF9tc2didXJzdCwgb3B0X21zZ3NpemUpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHRlc3RfbmFtZSwgImJsb2NrZWRfcmVhZCIpID09IDApIHsKLSAgICAgICAgcmMgPSBibG9ja2VkX3JlYWRfdGVzdChvcHRfcmVwZWF0KTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJjbG9zZXIxIikgPT0gMCkgewotICAgICAgICByYyA9IGNsb3NlcjFfdGVzdChvcHRfcmVwZWF0KTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJjbG9zZXIyIikgPT0gMCkgewotICAgICAgICByYyA9IGNsb3NlcjJfdGVzdChvcHRfcmVwZWF0KTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJjbG9zZXIzIikgPT0gMCkgewotICAgICAgICByYyA9IGNsb3NlcjNfdGVzdChvcHRfcmVwZWF0KTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJlY2hvIikgPT0gMCkgewotICAgICAgICByYyA9IGVjaG9fdGVzdChvcHRfcmVwZWF0LCBvcHRfbXNnc2l6ZSwgb3B0X3ZhcmlhYmxlKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJ0YTJ0YS1pcGMiKSA9PSAwKSB7Ci0gICAgICAgIHJjID0gdGEydGFfaXBjX3Rlc3QoKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJkZXYtdXVpZCIpID09IDApIHsKLSAgICAgICAgcmMgPSBkZXZfdXVpZF90ZXN0KCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAidGEtYWNjZXNzIikgPT0gMCkgewotICAgICAgICByYyA9IHRhX2FjY2Vzc190ZXN0KCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAid3JpdGV2IikgPT0gMCkgewotICAgICAgICByYyA9IHdyaXRldl90ZXN0KG9wdF9yZXBlYXQsIG9wdF9tc2dzaXplLCBvcHRfdmFyaWFibGUpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHRlc3RfbmFtZSwgInJlYWR2IikgPT0gMCkgewotICAgICAgICByYyA9IHJlYWR2X3Rlc3Qob3B0X3JlcGVhdCwgb3B0X21zZ3NpemUsIG9wdF92YXJpYWJsZSk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAic2VuZC1mZCIpID09IDApIHsKLSAgICAgICAgcmMgPSBzZW5kX2ZkX3Rlc3QoKTsKKyAgICBpZiAocGFyYW1zLmJlbmNoID4gMCkgeworICAgICAgICByYyA9IHJ1bl9hc19iZW5jaCgmcGFyYW1zKTsKKyAgICAgICAgcGFyYW1zLmJlbmNoID0gMDsKICAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCB0ZXN0IG5hbWUgJyVzJ1xuIiwgdGVzdF9uYW1lKTsKLSAgICAgICAgcHJpbnRfdXNhZ2VfYW5kX2V4aXQoYXJndlswXSwgRVhJVF9GQUlMVVJFLCB0cnVlKTsKKyAgICAgICAgdGlwY190ZXN0X2Z1bmNfdCB0ZXN0ID0gZ2V0X3Rlc3RfZnVuY3Rpb24oJnBhcmFtcyk7CisgICAgICAgIHJjID0gdGVzdCgmcGFyYW1zKTsKICAgICB9Ci0KICAgICByZXR1cm4gcmMgPT0gMCA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRTsKIH0KZGlmZiAtLWdpdCBhL3RydXN0eS9saW5lLWNvdmVyYWdlL0FuZHJvaWQuYnAgYi90cnVzdHkvbGluZS1jb3ZlcmFnZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTczYWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkvbGluZS1jb3ZlcmFnZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuLVNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJ0cnVzdHlfbGluZV9jb3ZlcmFnZSIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJjb3ZlcmFnZS5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJleHQyX3V1aWQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAorICAgICAgICAibGlidHJ1c3R5IiwKKyAgICBdLAorfQorCmRpZmYgLS1naXQgYS90cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5jcHAgYi90cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3YjNhMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9saW5lLWNvdmVyYWdlL2NvdmVyYWdlLmNwcApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJldGUgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImxpbmUtY292ZXJhZ2UiCisKKyNpbmNsdWRlIDxCdWZmZXJBbGxvY2F0b3IvQnVmZmVyQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDx0cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5oPgorI2luY2x1ZGUgPHRydXN0eS9saW5lLWNvdmVyYWdlL3RpcGMuaD4KKyNpbmNsdWRlIDx0cnVzdHkvdGlwYy5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjZGVmaW5lIExJTkVfQ09WRVJBR0VfQ0xJRU5UX1BPUlQgImNvbS5hbmRyb2lkLnRydXN0eS5saW5lY292ZXJhZ2UuY2xpZW50IgorCitzdHJ1Y3QgY29udHJvbCB7CisgICAgLyogV3JpdHRlbiBieSBjb250cm9sbGVyLCByZWFkIGJ5IGluc3RydW1lbnRlZCBUQSAqLworICAgIHVpbnQ2NF90ICAgICAgICBjbnRybF9mbGFnczsKKworICAgIC8qIFdyaXR0ZW4gYnkgaW5zdHJ1bWVudGVkIFRBLCByZWFkIGJ5IGNvbnRyb2xsZXIgKi8KKyAgICB1aW50NjRfdCAgICAgICAgb3Blcl9mbGFnczsKKyAgICB1aW50NjRfdCAgICAgICAgd3JpdGVfYnVmZmVyX3N0YXJ0X2NvdW50OworICAgIHVpbnQ2NF90ICAgICAgICB3cml0ZV9idWZmZXJfY29tcGxldGVfY291bnQ7Cit9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdHJ1c3R5IHsKK25hbWVzcGFjZSBsaW5lX2NvdmVyYWdlIHsKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpFcnJub0Vycm9yOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpFcnJvcjsKK3VzaW5nIDo6c3RkOjpzdHJpbmc7CisKK0NvdmVyYWdlUmVjb3JkOjpDb3ZlcmFnZVJlY29yZChzdHJpbmcgdGlwY19kZXYsIHN0cnVjdCB1dWlkKiB1dWlkKQorICAgIDogdGlwY19kZXZfKHN0ZDo6bW92ZSh0aXBjX2RldikpLAorICAgICAgY292ZXJhZ2Vfc3J2X2ZkXygtMSksCisgICAgICB1dWlkXygqdXVpZCksCisgICAgICByZWNvcmRfbGVuXygwKSwKKyAgICAgIHNobV8oTlVMTCksCisgICAgICBzaG1fbGVuXygwKSB7fQorCitDb3ZlcmFnZVJlY29yZDo6fkNvdmVyYWdlUmVjb3JkKCkgeworICAgIGlmIChzaG1fKSB7CisgICAgICAgIG11bm1hcCgodm9pZCopc2htXywgc2htX2xlbl8pOworICAgIH0KK30KKwordm9sYXRpbGUgdm9pZCAqQ292ZXJhZ2VSZWNvcmQ6OmdldFNobSgpIHsKKyAgICBpZighSXNPcGVuKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nISBTSE0gaXMgTlVMTCFcbiIpOworICAgIH0KKyAgICByZXR1cm4gc2htXzsKK30KKworUmVzdWx0PHZvaWQ+IENvdmVyYWdlUmVjb3JkOjpScGMoc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3JlcSogcmVxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcV9mZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXNwKiByZXNwKSB7CisgICAgaW50IHJjOworCisgICAgaWYgKHJlcV9mZCA8IDApIHsKKyAgICAgICAgcmMgPSB3cml0ZShjb3ZlcmFnZV9zcnZfZmRfLCByZXEsIHNpemVvZigqcmVxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW92ZWMgaW92ID0geworICAgICAgICAgICAgICAgIC5pb3ZfYmFzZSA9IHJlcSwKKyAgICAgICAgICAgICAgICAuaW92X2xlbiA9IHNpemVvZigqcmVxKSwKKyAgICAgICAgfTsKKworICAgICAgICB0cnVzdHlfc2htIHNobSA9IHsKKyAgICAgICAgICAgICAgICAuZmQgPSByZXFfZmQsCisgICAgICAgICAgICAgICAgLnRyYW5zZmVyID0gVFJVU1RZX1NIQVJFLAorICAgICAgICB9OworCisgICAgICAgIHJjID0gdGlwY19zZW5kKGNvdmVyYWdlX3Nydl9mZF8sICZpb3YsIDEsICZzaG0sIDEpOworICAgIH0KKworICAgIGlmIChyYyAhPSAoaW50KXNpemVvZigqcmVxKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmYWlsZWQgdG8gc2VuZCByZXF1ZXN0IHRvIGNvdmVyYWdlIHNlcnZlcjogIjsKKyAgICB9CisKKyAgICByYyA9IHJlYWQoY292ZXJhZ2Vfc3J2X2ZkXywgcmVzcCwgc2l6ZW9mKCpyZXNwKSk7CisgICAgaWYgKHJjICE9IChpbnQpc2l6ZW9mKCpyZXNwKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmYWlsZWQgdG8gcmVhZCByZXBseSBmcm9tIGNvdmVyYWdlIHNlcnZlcjogIjsKKyAgICB9CisKKyAgICBpZiAocmVzcC0+aGRyLmNtZCAhPSAocmVxLT5oZHIuY21kIHwgTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX1JFU1BfQklUKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJ1bmtub3duIHJlc3BvbnNlIGNtZDogIiA8PCByZXNwLT5oZHIuY21kOworICAgIH0KKworICAgIHJldHVybiB7fTsKK30KKworUmVzdWx0PHZvaWQ+IENvdmVyYWdlUmVjb3JkOjpPcGVuKGludCBmZCkgeworICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXEgcmVxOworICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXNwIHJlc3A7CisKKyAgICBpZiAoc2htXykgeworICAgICAgICByZXR1cm4ge307IC8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKyAgICB9CisKKyAgICBjb3ZlcmFnZV9zcnZfZmRfPSBmZDsKKworICAgIHJlcS5oZHIuY21kID0gTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX09QRU47CisgICAgcmVxLm9wZW5fYXJncy51dWlkID0gdXVpZF87CisgICAgYXV0byByZXQgPSBScGMoJnJlcSwgLTEsICZyZXNwKTsKKyAgICBpZiAoIXJldC5vaygpKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJmYWlsZWQgdG8gb3BlbiBjb3ZlcmFnZSBjbGllbnQ6ICIgPDwgcmV0LmVycm9yKCk7CisgICAgfQorICAgIHJlY29yZF9sZW5fID0gcmVzcC5vcGVuX2FyZ3MucmVjb3JkX2xlbjsKKyAgICBzaG1fbGVuXyA9IHJlY29yZF9sZW5fOworCisgICAgQnVmZmVyQWxsb2NhdG9yIGFsbG9jYXRvcjsKKworICAgIGZkID0gYWxsb2NhdG9yLkFsbG9jKCJzeXN0ZW0iLCBzaG1fbGVuXyk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIGRtYWJ1ZiBvZiBzaXplICIgPDwgc2htX2xlbl8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGVyciBjb2RlOiAiIDw8IGZkOworICAgIH0KKyAgICB1bmlxdWVfZmQgZG1hX2J1ZihmZCk7CisKKyAgICB2b2lkKiBzaG0gPSBtbWFwKDAsIHNobV9sZW5fLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBkbWFfYnVmLCAwKTsKKyAgICBpZiAoc2htID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiZmFpbGVkIHRvIG1hcCBtZW1mZDogIjsKKyAgICB9CisKKyAgICByZXEuaGRyLmNtZCA9IExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TSEFSRV9SRUNPUkQ7CisgICAgcmVxLnNoYXJlX3JlY29yZF9hcmdzLnNobV9sZW4gPSBzaG1fbGVuXzsKKyAgICByZXQgPSBScGMoJnJlcSwgZG1hX2J1ZiwgJnJlc3ApOworICAgIGlmICghcmV0Lm9rKCkpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byBzZW5kIHNoYXJlZCBtZW1vcnk6ICIgPDwgcmV0LmVycm9yKCk7CisgICAgfQorCisgICAgc2htXyA9IHNobTsKKworICAgIHJlcS5oZHIuY21kID0gTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX09QRU47CisgICAgcmVxLm9wZW5fYXJncy51dWlkID0gdXVpZF87CisgICAgcmV0ID0gUnBjKCZyZXEsIC0xLCAmcmVzcCk7CisgICAgaWYgKCFyZXQub2soKSkgeworICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiZmFpbGVkIHRvIG9wZW4gY292ZXJhZ2UgY2xpZW50OiAiIDw8IHJldC5lcnJvcigpOworICAgIH0KKworICAgIHJldHVybiB7fTsKK30KKworYm9vbCBDb3ZlcmFnZVJlY29yZDo6SXNPcGVuKCkgeworICAgIHJldHVybiBzaG1fOworfQorCitSZXN1bHQ8dm9pZD4gQ292ZXJhZ2VSZWNvcmQ6OlNhdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICAgIGlmKCFJc09wZW4oKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJXYXJuaW5nISBTSE0gaXMgTlVMTCEiOworICAgIH0KKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgb3V0cHV0X2ZkKFRFTVBfRkFJTFVSRV9SRVRSWShjcmVhdChmaWxlbmFtZS5jX3N0cigpLCAwMDY0NCkpKTsKKyAgICBpZiAoIW91dHB1dF9mZC5vaygpKSB7CisgICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlIjsKKyAgICB9CisKKyAgICB1aW50cHRyX3QqIGJlZ2luID0gKHVpbnRwdHJfdCopKChjaGFyICopc2htXyArIHNpemVvZihzdHJ1Y3QgY29udHJvbCkpOworICAgIGJvb2wgcmV0ID0gV3JpdGVGdWxseShvdXRwdXRfZmQsIGJlZ2luLCByZWNvcmRfbGVuXyk7CisgICAgaWYoIXJldCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdmVyYWdlIHdyaXRlIHRvIGZpbGUgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4ge307Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsaW5lX2NvdmVyYWdlCit9ICAvLyBuYW1lc3BhY2UgdHJ1c3R5Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvaW5jbHVkZS90cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5oIGIvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvaW5jbHVkZS90cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTAxYmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkvbGluZS1jb3ZlcmFnZS9pbmNsdWRlL3RydXN0eS9saW5lLWNvdmVyYWdlL2NvdmVyYWdlLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0cnVzdHkvbGluZS1jb3ZlcmFnZS90aXBjLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB0cnVzdHkgeworbmFtZXNwYWNlIGxpbmVfY292ZXJhZ2UgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKK2NsYXNzIENvdmVyYWdlUmVjb3JkIHsKKyAgcHVibGljOgorICAgIENvdmVyYWdlUmVjb3JkKHN0ZDo6c3RyaW5nIHRpcGNfZGV2LCBzdHJ1Y3QgdXVpZCogdXVpZCk7CisKKyAgICB+Q292ZXJhZ2VSZWNvcmQoKTsKKyAgICBSZXN1bHQ8dm9pZD4gT3BlbihpbnQgZmQpOworICAgIGJvb2wgSXNPcGVuKCk7CisgICAgUmVzdWx0PHZvaWQ+IFNhdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisgICAgdm9sYXRpbGUgdm9pZCogZ2V0U2htKCk7CisKKyAgcHJpdmF0ZToKKyAgICBSZXN1bHQ8dm9pZD4gUnBjKHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXEqIHJlcSwgXAorICAgICAgICAgICAgICAgICAgICAgIGludCByZXFfZmQsIFwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfcmVzcCogcmVzcCk7CisKKyAgICBSZXN1bHQ8c3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90Pj4gR2V0UmVnaW9uQm91bmRzKHVpbnQzMl90IHJlZ2lvbl90eXBlKTsKKworICAgIHN0ZDo6c3RyaW5nIHRpcGNfZGV2XzsKKyAgICBpbnQgY292ZXJhZ2Vfc3J2X2ZkXzsKKyAgICBzdHJ1Y3QgdXVpZCB1dWlkXzsKKyAgICBzaXplX3QgcmVjb3JkX2xlbl87CisgICAgdm9sYXRpbGUgdm9pZCogc2htXzsKKyAgICBzaXplX3Qgc2htX2xlbl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbGluZV9jb3ZlcmFnZQorfSAgLy8gbmFtZXNwYWNlIHRydXN0eQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3RydXN0eS9saW5lLWNvdmVyYWdlL2luY2x1ZGUvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvdGlwYy5oIGIvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvaW5jbHVkZS90cnVzdHkvbGluZS1jb3ZlcmFnZS90aXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlODU1YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9saW5lLWNvdmVyYWdlL2luY2x1ZGUvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvdGlwYy5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogVGhpcyBmaWxlIG5lZWRzIHRvIGJlIGtlcHQgaW4tc3luYyB3aXRoIGl0cyBjb3VudGVycGFydCBvbiBUcnVzdHkgc2lkZSAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRydXN0eS9saW5lLWNvdmVyYWdlL3V1aWQuaD4KKworCisjZGVmaW5lIExJTkVfQ09WRVJBR0VfQ0xJRU5UX1BPUlQgImNvbS5hbmRyb2lkLnRydXN0eS5saW5lY292ZXJhZ2UuY2xpZW50IgorCisvKioKKyAqIGVudW0gbGluZV9jb3ZlcmFnZV9jbGllbnRfY21kIC0gY29tbWFuZCBpZGVudGlmaWVycyBmb3IgY292ZXJhZ2UgY2xpZW50IGludGVyZmFjZQorICogQExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9SRVNQX0JJVDogICAgIHJlc3BvbnNlIGJpdCBzZXQgYXMgcGFydCBvZiByZXNwb25zZQorICogQExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TSElGVDogICAgICAgIG51bWJlciBvZiBiaXRzIHVzZWQgYnkgcmVzcG9uc2UgYml0CisgKiBATElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX09QRU46ICAgICAgICAgY29tbWFuZCB0byBvcGVuIGNvdmVyYWdlIHJlY29yZAorICogQExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TSEFSRV9SRUNPUkQ6IGNvbW1hbmQgdG8gcmVnaXN0ZXIgYSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBjb3ZlcmFnZSByZWNvcmQgd2lsbCBiZSB3cml0dGVuIHRvCisgKi8KK2VudW0gbGluZV9jb3ZlcmFnZV9jbGllbnRfY21kIHsKKyAgICBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfUkVTUF9CSVQgPSAxVSwKKyAgICBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0hJRlQgPSAxVSwKKyAgICBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfT1BFTiA9ICgxVSA8PCBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0hJRlQpLAorICAgIExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TSEFSRV9SRUNPUkQgPSAoMlUgPDwgTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX1NISUZUKSwKKyAgICBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0VORF9MSVNUID0gKDNVIDw8IExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TSElGVCksCit9OworCisvKioKKyAqIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9oZHIgLSBoZWFkZXIgZm9yIGNvdmVyYWdlIGNsaWVudCBtZXNzYWdlcworICogQGNtZDogY29tbWFuZCBpZGVudGlmaWVyCisgKgorICogTm90ZSB0aGF0IG5vIG1lc3NhZ2VzIHJldHVybiBhIHN0YXR1cyBjb2RlLiBBbnkgZXJyb3Igb24gdGhlIHNlcnZlciBzaWRlCisgKiByZXN1bHRzIGluIHRoZSBjb25uZWN0aW9uIGJlaW5nIGNsb3NlZC4gU28sIG9wZXJhdGlvbnMgY2FuIGJlIGFzc3VtZWQgdG8gYmUKKyAqIHN1Y2Nlc3NmdWwgaWYgdGhleSByZXR1cm4gYSByZXNwb25zZS4KKyAqLworc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X2hkciB7CisgICAgdWludDMyX3QgY21kOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfb3Blbl9yZXEgLSBhcmd1bWVudHMgZm9yIHJlcXVlc3QgdG8gb3BlbiBjb3ZlcmFnZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZAorICogQHV1aWQ6IFVVSUQgb2YgdGFyZ2V0IFRBCisgKgorICogVGhlcmUgaXMgb25lIGNvdmVyYWdlIHJlY29yZCBwZXIgVEEuIEB1dWlkIGlzIHVzZWQgdG8gaWRlbnRpZnkgYm90aCB0aGUgVEEKKyAqIGFuZCBjb3JyZXNwb25kaW5nIGNvdmVyYWdlIHJlY29yZC4KKyAqLworc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X29wZW5fcmVxIHsKKyAgICBzdHJ1Y3QgdXVpZCB1dWlkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfb3Blbl9yZXNwIC0gYXJndW1lbnRzIGZvciByZXNwb25zZSB0byBvcGVuIGNvdmVyYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZAorICogQHJlY29yZF9sZW46IGxlbmd0aCBvZiBjb3ZlcmFnZSByZWNvcmQgdGhhdCB3aWxsIGJlIGVtaXR0ZWQgYnkgdGFyZ2V0IFRBCisgKgorICogU2hhcmVkIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgY292ZXJhZ2UgcmVjb3JkIG11c3QgbGFyZ2VyIHRoYW4KKyAqIEByZWNvcmRfbGVuLgorICovCitzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfb3Blbl9yZXNwIHsKKyAgICB1aW50MzJfdCByZWNvcmRfbGVuOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfc2VuZF9saXN0X3Jlc3AgLSBhcmd1bWVudHMgZm9yIHJlc3BvbnNlIHRvIHNlbmQgbGlzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZAorICogQHV1aWQ6IFVVSUQgb2YgVEEgdGhhdCBjb25uZWN0ZWQgdG8gYWdncmVnYXRvcgorICovCitzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfc2VuZF9saXN0X3Jlc3AgeworICAgIHN0cnVjdCB1dWlkIHV1aWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9zZW5kX2xpc3RfcmVzcCAtIGFyZ3VtZW50cyBmb3IgcmVzcG9uc2UgdG8gc2VuZCBsaXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkCisgKiBAaW5kZXg6IGluZGV4IG9mIHRoZSBsaXN0IGJlaW5nIHJlcXVlc3RlZAorICovCitzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfc2VuZF9saXN0X3JlcSB7CisgICAgdWludDMyX3QgaW5kZXg7Cit9OworCisvKioKKyAqIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9zaGFyZV9yZWNvcmRfcmVxIC0gYXJndW1lbnRzIGZvciByZXF1ZXN0IHRvIHNoYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgZm9yIGNvdmVyYWdlIHJlY29yZAorICogQHNobV9sZW46IGxlbmd0aCBvZiBtZW1vcnkgcmVnaW9uIGJlaW5nIHNoYXJlZAorICoKKyAqIEEgaGFuZGxlIHRvIGEgbWVtb3J5IHJlZ2lvbiBtdXN0IGJlIHNlbnQgYWxvbmcgd2l0aCB0aGlzIG1lc3NhZ2UuIFRoaXMgbWVtb3J5CisgKiBpcyB1c2VkIHRvIHN0b3JlIGNvdmVyYWdlIHJlY29yZC4KKyAqCisgKiBVcG9uIHN1Y2Nlc3MsIHRoaXMgbWVtb3J5IHJlZ2lvbiBjYW4gYmUgYXNzdW1lZCB0byBiZSBzaGFyZWQgYmV0d2VlbiB0aGUKKyAqIGNsaWVudCBhbmQgdGFyZ2V0IFRBLgorICovCitzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfc2hhcmVfcmVjb3JkX3JlcSB7CisgICAgdWludDMyX3Qgc2htX2xlbjsKK307CisKKy8qKgorICogc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3JlcSAtIHN0cnVjdHVyZSBmb3IgYSBjb3ZlcmFnZSBjbGllbnQgcmVxdWVzdAorICogQGhkcjogICAgICAgICAgICAgICBtZXNzYWdlIGhlYWRlcgorICogQG9wZW5fYXJnczogICAgICAgICBhcmd1bWVudHMgZm9yICVDT1ZFUkFHRV9DTElFTlRfQ01EX09QRU4gcmVxdWVzdAorICogQHNoYXJlX3JlY29yZF9hcmdzOiBhcmd1bWVudHMgZm9yICVDT1ZFUkFHRV9DTElFTlRfQ01EX1NIQVJFX1JFQ09SRCByZXF1ZXN0CisgKiBAaW5kZXg6IGFyZ3VtZW50cyBmb3IgJUNPVkVSQUdFX0NMSUVOVF9DTURfU0hBUkVfUkVDT1JEIHJlcXVlc3QKKyAqLworc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3JlcSB7CisgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X2hkciBoZHI7CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfb3Blbl9yZXEgb3Blbl9hcmdzOworICAgICAgICBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfc2hhcmVfcmVjb3JkX3JlcSBzaGFyZV9yZWNvcmRfYXJnczsKKyAgICAgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3NlbmRfbGlzdF9yZXEgc2VuZF9saXN0X2FyZ3M7CisgICAgfTsKK307CisKKy8qKgorICogc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3Jlc3AgLSBzdHJ1Y3R1cmUgZm9yIGEgY292ZXJhZ2UgY2xpZW50IHJlc3BvbnNlCisgKiBAaGRyOiAgICAgICBtZXNzYWdlIGhlYWRlcgorICogQG9wZW5fYXJnczogYXJndW1lbnRzIGZvciAlQ09WRVJBR0VfQ0xJRU5UX0NNRF9PUEVOIHJlc3BvbnNlCisgKiBAc2VuZF9saXN0X2FyZ3M6IGFyZ3VtZW50cyBmb3IgJUNPVkVSQUdFX0NMSUVOVF9DTURfU0hBUkVfUkVDT1JEIHJlc3BvbnNlCisgKi8KK3N0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXNwIHsKKyAgICBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfaGRyIGhkcjsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9vcGVuX3Jlc3Agb3Blbl9hcmdzOworICAgICAgICBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfc2VuZF9saXN0X3Jlc3Agc2VuZF9saXN0X2FyZ3M7CisgICAgfTsKK307CmRpZmYgLS1naXQgYS90cnVzdHkvbGluZS1jb3ZlcmFnZS9pbmNsdWRlL3RydXN0eS9saW5lLWNvdmVyYWdlL3V1aWQuaCBiL3RydXN0eS9saW5lLWNvdmVyYWdlL2luY2x1ZGUvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvdXVpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzM5ODAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkvbGluZS1jb3ZlcmFnZS9pbmNsdWRlL3RydXN0eS9saW5lLWNvdmVyYWdlL3V1aWQuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBVVUNNUCh1MSwgdTIpIGlmICh1MSAhPSB1MikgcmV0dXJuIHUxIDwgdTIKKworc3RydWN0IHV1aWQgeworICAgIHVpbnQzMl90IHRpbWVfbG93OworICAgIHVpbnQxNl90IHRpbWVfbWlkOworICAgIHVpbnQxNl90IHRpbWVfaGlfYW5kX3ZlcnNpb247CisgICAgdWludDhfdCBjbG9ja19zZXFfYW5kX25vZGVbOF07CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBzdHJ1Y3QgdXVpZCYgcmhzKSBjb25zdAorICAgIHsKKyAgICAgICAgVVVDTVAodGltZV9sb3csIHJocy50aW1lX2xvdyk7CisgICAgICAgIFVVQ01QKHRpbWVfbWlkLCByaHMudGltZV9taWQpOworICAgICAgICBVVUNNUCh0aW1lX2hpX2FuZF92ZXJzaW9uLCByaHMudGltZV9oaV9hbmRfdmVyc2lvbik7CisgICAgICAgIHJldHVybiBtZW1jbXAoY2xvY2tfc2VxX2FuZF9ub2RlLCByaHMuY2xvY2tfc2VxX2FuZF9ub2RlLCA4KTsKKyAgICB9Cit9OwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3NlY3JldGtlZXBlci9BbmRyb2lkLmJwIGIvdHJ1c3R5L3NlY3JldGtlZXBlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2Yjc0MGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkvc2VjcmV0a2VlcGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5NiBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuLVNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK3J1c3RfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5IiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnJjIl0sCisgICAgdmludGZfZnJhZ21lbnRzOiBbImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkuc2VjcmV0a2VlcGVyLnRydXN0eS54bWwiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvaGFsX21haW4ucnMiLAorICAgIF0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFuZHJvaWRfbG9nZ2VyIiwKKyAgICAgICAgImxpYmJpbmRlcl9ycyIsCisgICAgICAgICJsaWJhdXRoZ3JhcGhfaGFsIiwKKyAgICAgICAgImxpYnRydXN0eS1ycyIsCisgICAgICAgICJsaWJsaWJjIiwKKyAgICAgICAgImxpYmxvZ19ydXN0IiwKKyAgICAgICAgImxpYnNlY3JldGtlZXBlcl9oYWwiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInNlY3JldGtlZXBlcl91c2VfbGF0ZXN0X2hhbF9haWRsX3J1c3QiLAorICAgIF0sCisgICAgcHJlZmVyX3JsaWI6IHRydWUsCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAidHJ1c3R5X3NlY3JldGtlZXBlcl9mdXp6X2RlZmF1bHRzIiwKKyAgICBzcmNzOiBbIjp0cnVzdHlfdGlwY19mdXp6ZXIiXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFsYW5zdG9rZXNAZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAiZHJ5c2RhbGVAZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAic2hpa2hhcGFud2FyQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogODY3MTI1LAorICAgICAgICAvLyBUT0RPOiBhZGQgU2VjcmV0a2VlcGVyIGhvdGxpc3QKKyAgICAgICAgLy8gaG90bGlzdHM6IFsiIl0sCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogInRydXN0eV9zZWNyZXRrZWVwZXJfc2tfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAidHJ1c3R5X2Z1enplcl9kZWZhdWx0cyIsCisgICAgICAgICJ0cnVzdHlfc2VjcmV0a2VlcGVyX2Z1enpfZGVmYXVsdHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFRSVVNUWV9BUFBfUE9SVD1cImNvbS5hbmRyb2lkLnRydXN0eS5zZWNyZXRrZWVwZXJcIiIsCisgICAgICAgICItRFRSVVNUWV9BUFBfVVVJRD1cIjQ1ODJiZjEyLTFmN2QtNDgzMC05YmU1LTM2ZTZiZDkxYzJjNlwiIiwKKyAgICAgICAgIi1EVFJVU1RZX0FQUF9GSUxFTkFNRT1cInNlY3JldGtlZXBlcl9hcHAuc3ltcy5lbGZcIiIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogInRydXN0eV9zZWNyZXRrZWVwZXJfYWdfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAidHJ1c3R5X2Z1enplcl9kZWZhdWx0cyIsCisgICAgICAgICJ0cnVzdHlfc2VjcmV0a2VlcGVyX2Z1enpfZGVmYXVsdHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFRSVVNUWV9BUFBfUE9SVD1cImNvbS5hbmRyb2lkLnRydXN0eS5zZWNyZXRrZWVwZXIuYXV0aGdyYXBoXCIiLAorICAgICAgICAiLURUUlVTVFlfQVBQX1VVSUQ9XCI0NTgyYmYxMi0xZjdkLTQ4MzAtOWJlNS0zNmU2YmQ5MWMyYzZcIiIsCisgICAgICAgICItRFRSVVNUWV9BUFBfRklMRU5BTUU9XCJzZWNyZXRrZWVwZXJfYXBwLnN5bXMuZWxmXCIiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJ0cnVzdHlfc2VjcmV0a2VlcGVyX2JsX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInRydXN0eV9mdXp6ZXJfZGVmYXVsdHMiLAorICAgICAgICAidHJ1c3R5X3NlY3JldGtlZXBlcl9mdXp6X2RlZmF1bHRzIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURUUlVTVFlfQVBQX1BPUlQ9XCJjb20uYW5kcm9pZC50cnVzdHkuc2VjcmV0a2VlcGVyLmJvb3Rsb2FkZXJcIiIsCisgICAgICAgICItRFRSVVNUWV9BUFBfVVVJRD1cIjQ1ODJiZjEyLTFmN2QtNDgzMC05YmU1LTM2ZTZiZDkxYzJjNlwiIiwKKyAgICAgICAgIi1EVFJVU1RZX0FQUF9GSUxFTkFNRT1cInNlY3JldGtlZXBlcl9hcHAuc3ltcy5lbGZcIiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3RydXN0eS9zZWNyZXRrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnJjIGIvdHJ1c3R5L3NlY3JldGtlZXBlci9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnNlY3JldGtlZXBlci50cnVzdHkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlMDNhZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9zZWNyZXRrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnJjCkBAIC0wLDAgKzEsNCBAQAorc2VydmljZSB2ZW5kb3Iuc2VjcmV0a2VlcGVyLnRydXN0eSAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnNlY3JldGtlZXBlci50cnVzdHkKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG5vYm9keQorICAgIGdyb3VwIGRybXJwYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9zZWNyZXRrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnhtbCBiL3RydXN0eS9zZWNyZXRrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWMxNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L3NlY3JldGtlZXBlci9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnNlY3JldGtlZXBlci50cnVzdHkueG1sCkBAIC0wLDAgKzEsNyBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZGV2aWNlIj4KKyAgICA8aGFsIGZvcm1hdD0iYWlkbCI+CisgICAgICAgIDxuYW1lPmFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkuc2VjcmV0a2VlcGVyPC9uYW1lPgorICAgICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgorICAgICAgICA8ZnFuYW1lPklTZWNyZXRrZWVwZXIvZGVmYXVsdDwvZnFuYW1lPgorICAgIDwvaGFsPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3RydXN0eS9zZWNyZXRrZWVwZXIvc3JjL2hhbF9tYWluLnJzIGIvdHJ1c3R5L3NlY3JldGtlZXBlci9zcmMvaGFsX21haW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzOWMzNgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9zZWNyZXRrZWVwZXIvc3JjL2hhbF9tYWluLnJzCkBAIC0wLDAgKzEsMTQxIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4tU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBIQUwgc2VydmljZSBmb3IgU2VjcmV0a2VlcGVyIGluIFRydXN0eS4KK3VzZSBhdXRoZ3JhcGhfaGFsOjp7Y2hhbm5lbDo6U2VyaWFsaXplZENoYW5uZWx9OwordXNlIHNlY3JldGtlZXBlcl9oYWw6OlNlY3JldGtlZXBlclNlcnZpY2U7Cit1c2UgYW5kcm9pZF9oYXJkd2FyZV9zZWN1cml0eV9zZWNyZXRrZWVwZXI6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzZWN1cml0eTo6c2VjcmV0a2VlcGVyOjpJU2VjcmV0a2VlcGVyOjp7CisgICAgSVNlY3JldGtlZXBlciwgQnBTZWNyZXRrZWVwZXIsCit9OwordXNlIGxvZzo6e2Vycm9yLCBpbmZvfTsKK3VzZSBzdGQ6OnsKKyAgICBmZmk6OkNTdHJpbmcsCisgICAgcGFuaWMsCisgICAgc3luYzo6e0FyYywgTXV0ZXh9LAorfTsKK3VzZSB0cnVzdHk6OkRFRkFVTFRfREVWSUNFOworCitjb25zdCBTS19USVBDX1NFUlZJQ0VfUE9SVDogJnN0ciA9ICJjb20uYW5kcm9pZC50cnVzdHkuc2VjcmV0a2VlcGVyIjsKK2NvbnN0IEFHX1RJUENfU0VSVklDRV9QT1JUOiAmc3RyID0gImNvbS5hbmRyb2lkLnRydXN0eS5zZWNyZXRrZWVwZXIuYXV0aGdyYXBoIjsKKworc3RhdGljIFNFUlZJQ0VfSU5TVEFOQ0U6ICZzdHIgPSAiZGVmYXVsdCI7CisKKy8vLyBMb2NhbCBlcnJvciB0eXBlIGZvciBmYWlsdXJlcyBpbiB0aGUgSEFMIHNlcnZpY2UuCisjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUpXQorc3RydWN0IEhhbFNlcnZpY2VFcnJvcihTdHJpbmcpOworCisjW2Rlcml2ZShEZWJ1ZyldCitzdHJ1Y3QgVGlwY0NoYW5uZWwgeworICAgIGNoYW5uZWw6IEFyYzxNdXRleDx0cnVzdHk6OlRpcGNDaGFubmVsPj4sCit9CisKK2ltcGwgVGlwY0NoYW5uZWwgeworICAgIGZuIG5ldyhjaGFubmVsOiB0cnVzdHk6OlRpcGNDaGFubmVsKSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7IGNoYW5uZWw6IEFyYzo6bmV3KE11dGV4OjpuZXcoY2hhbm5lbCkpIH0KKyAgICB9Cit9CisKK2ltcGwgU2VyaWFsaXplZENoYW5uZWwgZm9yIFRpcGNDaGFubmVsIHsKKyAgICBjb25zdCBNQVhfU0laRTogdXNpemUgPSA0MDAwOworICAgIGZuIGV4ZWN1dGUoJnNlbGYsIHJlcV9kYXRhOiAmW3U4XSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICAvLyBIb2xkIGxvY2sgYWNyb3NzIGJvdGggcmVxdWVzdCBhbmQgcmVzcG9uc2UuCisgICAgICAgIGxldCBtdXQgY2hhbm5lbCA9IHNlbGYuY2hhbm5lbC5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGNoYW5uZWwuc2VuZChyZXFfZGF0YSkubWFwX2Vycih8ZXwgeworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXM6Om5ld19leGNlcHRpb24oCisgICAgICAgICAgICAgICAgYmluZGVyOjpFeGNlcHRpb25Db2RlOjpUUkFOU0FDVElPTl9GQUlMRUQsCisgICAgICAgICAgICAgICAgU29tZSgKKyAgICAgICAgICAgICAgICAgICAgJkNTdHJpbmc6Om5ldyhmb3JtYXQhKAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZW5kIHRoZSByZXF1ZXN0IHZpYSB0aXBjIGNoYW5uZWwgYmVjYXVzZSBvZiB7Oj99IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApCisgICAgICAgIH0pPzsKKyAgICAgICAgLy8gVE9ETzogY29wZSB3aXRoIGZyYWdtZW50YXRpb24gYW5kIHJlYXNzZW1ibHkKKyAgICAgICAgbGV0IG11dCByc3BfZGF0YSA9IFZlYzo6bmV3KCk7CisgICAgICAgIGNoYW5uZWwucmVjdigmbXV0IHJzcF9kYXRhKS5tYXBfZXJyKHxlfCB7CisgICAgICAgICAgICBiaW5kZXI6OlN0YXR1czo6bmV3X2V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBiaW5kZXI6OkV4Y2VwdGlvbkNvZGU6OlRSQU5TQUNUSU9OX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICBTb21lKAorICAgICAgICAgICAgICAgICAgICAmQ1N0cmluZzo6bmV3KGZvcm1hdCEoCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlY2VpdmUgdGhlIHJlc3BvbnNlIHZpYSB0aXBjIGNoYW5uZWwgYmVjYXVzZSBvZiB7Oj99IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApCisgICAgICAgIH0pPzsKKyAgICAgICAgT2socnNwX2RhdGEpCisgICAgfQorfQorCitmbiBtYWluKCkgeworICAgIGlmIGxldCBFcnIoZSkgPSBpbm5lcl9tYWluKCkgeworICAgICAgICBwYW5pYyEoIkhBTCBzZXJ2aWNlIGZhaWxlZDogezo/fSIsIGUpOworICAgIH0KK30KKworZm4gaW5uZXJfbWFpbigpIC0+IFJlc3VsdDwoKSwgSGFsU2VydmljZUVycm9yPiB7CisgICAgLy8gSW5pdGlhbGl6ZSBBbmRyb2lkIGxvZ2dpbmcuCisgICAgYW5kcm9pZF9sb2dnZXI6OmluaXRfb25jZSgKKyAgICAgICAgYW5kcm9pZF9sb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAud2l0aF90YWcoInNlY3JldGtlZXBlci1oYWwtdHJ1c3R5IikKKyAgICAgICAgICAgIC53aXRoX21pbl9sZXZlbChsb2c6OkxldmVsOjpJbmZvKQorICAgICAgICAgICAgLndpdGhfbG9nX2lkKGFuZHJvaWRfbG9nZ2VyOjpMb2dJZDo6U3lzdGVtKSwKKyAgICApOworICAgIC8vIFJlZGlyZWN0IHBhbmljIG1lc3NhZ2VzIHRvIGxvZ2NhdC4KKyAgICBwYW5pYzo6c2V0X2hvb2soQm94OjpuZXcofHBhbmljX2luZm98IHsKKyAgICAgICAgZXJyb3IhKCJ7fSIsIHBhbmljX2luZm8pOworICAgIH0pKTsKKworICAgIGluZm8hKCJUcnVzdHkgU2VjcmV0a2VlcGVyIEhBTCBzZXJ2aWNlIGlzIHN0YXJ0aW5nLiIpOworCisgICAgaW5mbyEoIlN0YXJ0aW5nIHRocmVhZCBwb29sIG5vdy4iKTsKKyAgICBiaW5kZXI6OlByb2Nlc3NTdGF0ZTo6c3RhcnRfdGhyZWFkX3Bvb2woKTsKKworICAgIC8vIENyZWF0ZSBjb25uZWN0aW9ucyB0byB0aGUgVEEuCisgICAgbGV0IGFnX2Nvbm5lY3Rpb24gPSB0cnVzdHk6OlRpcGNDaGFubmVsOjpjb25uZWN0KERFRkFVTFRfREVWSUNFLCBBR19USVBDX1NFUlZJQ0VfUE9SVCkKKyAgICAgICAgLm1hcF9lcnIofGV8IHsKKyAgICAgICAgICAgIEhhbFNlcnZpY2VFcnJvcihmb3JtYXQhKAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29ubmVjdCB0byBUcnVzdHkgcG9ydCB7QUdfVElQQ19TRVJWSUNFX1BPUlR9IGJlY2F1c2Ugb2Ygezo/fS4iLAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICkpCisgICAgICAgIH0pPzsKKyAgICBsZXQgYWdfdGlwY19jaGFubmVsID0gVGlwY0NoYW5uZWw6Om5ldyhhZ19jb25uZWN0aW9uKTsKKworICAgIGxldCBza19jb25uZWN0aW9uID0gdHJ1c3R5OjpUaXBjQ2hhbm5lbDo6Y29ubmVjdChERUZBVUxUX0RFVklDRSwgU0tfVElQQ19TRVJWSUNFX1BPUlQpCisgICAgICAgIC5tYXBfZXJyKHxlfCB7CisgICAgICAgICAgICBIYWxTZXJ2aWNlRXJyb3IoZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gVHJ1c3R5IHBvcnQge1NLX1RJUENfU0VSVklDRV9QT1JUfSBiZWNhdXNlIG9mIHs6P30uIiwKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICApKQorICAgICAgICB9KT87CisgICAgbGV0IHNrX3RpcGNfY2hhbm5lbCA9IFRpcGNDaGFubmVsOjpuZXcoc2tfY29ubmVjdGlvbik7CisKKyAgICAvLyBSZWdpc3RlciB0aGUgQUlETCBzZXJ2aWNlCisgICAgbGV0IHNlcnZpY2UgPSBTZWNyZXRrZWVwZXJTZXJ2aWNlOjpuZXdfYXNfYmluZGVyKHNrX3RpcGNfY2hhbm5lbCwgYWdfdGlwY19jaGFubmVsKTsKKyAgICBsZXQgc2VydmljZV9uYW1lID0KKyAgICAgICAgZm9ybWF0ISgie30ve30iLCA8QnBTZWNyZXRrZWVwZXIgYXMgSVNlY3JldGtlZXBlcj46OmdldF9kZXNjcmlwdG9yKCksIFNFUlZJQ0VfSU5TVEFOQ0UpOworICAgIGJpbmRlcjo6YWRkX3NlcnZpY2UoJnNlcnZpY2VfbmFtZSwgc2VydmljZS5hc19iaW5kZXIoKSkubWFwX2Vycih8ZXwgeworICAgICAgICBIYWxTZXJ2aWNlRXJyb3IoZm9ybWF0ISgiRmFpbGVkIHRvIHJlZ2lzdGVyIHNlcnZpY2Uge30gYmVjYXVzZSBvZiB7Oj99LiIsIHNlcnZpY2VfbmFtZSwgZSkpCisgICAgfSk/OworCisgICAgaW5mbyEoIlN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIFNlY3JldGtlZXBlciBIQUwgc2VydmljZS4iKTsKKyAgICBpbmZvISgiSm9pbmluZyB0aHJlYWQgcG9vbCBub3cuIik7CisgICAgYmluZGVyOjpQcm9jZXNzU3RhdGU6OmpvaW5fdGhyZWFkX3Bvb2woKTsKKyAgICBpbmZvISgiU2VjcmV0a2VlcGVyIEhBTCBzZXJ2aWNlIGlzIHRlcm1pbmF0aW5nLiIpOyAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICBPaygoKSkKK30KZGlmZiAtLWdpdCBhL3RydXN0eS9zdGF0cy90ZXN0L1JFQURNRS5tZCBiL3RydXN0eS9zdGF0cy90ZXN0L1JFQURNRS5tZAppbmRleCA0NWU2YWY4Li4xNzU0MDllIDEwMDY0NAotLS0gYS90cnVzdHkvc3RhdHMvdGVzdC9SRUFETUUubWQKKysrIGIvdHJ1c3R5L3N0YXRzL3Rlc3QvUkVBRE1FLm1kCkBAIC0xLDggKzEsOCBAQAogIyBEZXZlbG9wbWVudCBOb3RlcwogCi0qICAgIEZpcnN0IGdldCBbcmVwb19wdWxsLnB5IGFuZCBnZXJyaXQucHldKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2RldmVsb3BtZW50LysvbWFzdGVyL3Rvb2xzL3JlcG9fcHVsbC8pIGZyb20gYW9zcC4KKyogICAgRmlyc3QgZ2V0IFtyZXBvX3B1bGwucHkgYW5kIGdlcnJpdC5weV0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZGV2ZWxvcG1lbnQvKy9tYWluL3Rvb2xzL3JlcG9fcHVsbC8pIGZyb20gYW9zcC4KIAotKiAgICBBbHRob3VnaCB0aGlzIHJlcG8gaXMgbm90IGN1cnJlbnRseSBpbiBUcnVzdHnigJlzIG1hbmlmZXN0LCBpdOKAmXMgc3VmZmljaWVudCB0byBjb3B5IHRoZXNlIHR3byBweXRob24gc2NyaXB0cyB0byB0aGUgcm9vdCBvZiB0aGUgVHJ1c3R5IHByb2plY3QgYW5kIHJ1biB0aGVtIGZyb20gdGhlcmUuIE1ha2Ugc3VyZSB0byBmb2xsb3cgdGhlIFtyZXBvX3B1bGwgaW5zdGFsbGF0aW9uXShodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9kZXZlbG9wbWVudC8rL21hc3Rlci90b29scy9yZXBvX3B1bGwvI2luc3RhbGxhdGlvbikgc3RlcHMgaWYgbmVjZXNzYXJ5LgorKiAgICBBbHRob3VnaCB0aGlzIHJlcG8gaXMgbm90IGN1cnJlbnRseSBpbiBUcnVzdHnigJlzIG1hbmlmZXN0LCBpdOKAmXMgc3VmZmljaWVudCB0byBjb3B5IHRoZXNlIHR3byBweXRob24gc2NyaXB0cyB0byB0aGUgcm9vdCBvZiB0aGUgVHJ1c3R5IHByb2plY3QgYW5kIHJ1biB0aGVtIGZyb20gdGhlcmUuIE1ha2Ugc3VyZSB0byBmb2xsb3cgdGhlIFtyZXBvX3B1bGwgaW5zdGFsbGF0aW9uXShodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9kZXZlbG9wbWVudC8rL21haW4vdG9vbHMvcmVwb19wdWxsLyNpbnN0YWxsYXRpb24pIHN0ZXBzIGlmIG5lY2Vzc2FyeS4KIAogIyMgQnVpbGQKIApkaWZmIC0tZ2l0IGEvdHJ1c3R5L3N0YXRzL3Rlc3Qvc3RhdHNfdGVzdC5jcHAgYi90cnVzdHkvc3RhdHMvdGVzdC9zdGF0c190ZXN0LmNwcAppbmRleCAxZWRkZGViLi4xZDZlYjM0IDEwMDY0NAotLS0gYS90cnVzdHkvc3RhdHMvdGVzdC9zdGF0c190ZXN0LmNwcAorKysgYi90cnVzdHkvc3RhdHMvdGVzdC9zdGF0c190ZXN0LmNwcApAQCAtMjUyLDIwICsyNTIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpBbnlPZig6OnRlc3Rpbmc6OkVxKFRydXN0eUF0b21zOjpUcnVzdHlBcHBDcmFzaGVkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkVxKFRydXN0eUF0b21zOjpUcnVzdHlFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpFcShUcnVzdHlBdG9tczo6VHJ1c3R5U3RvcmFnZUVycm9yKSkpOwotICAgICAgICBBU1NFUlRfU1RSRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnJldmVyc2VEb21haW5OYW1lKSwgImdvb2dsZS5hbmRyb2lkLnRydXN0eSIpOworICAgICAgICBBU1NFUlRfRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnJldmVyc2VEb21haW5OYW1lKSwgImdvb2dsZS5hbmRyb2lkLnRydXN0eSIpOwogICAgICAgICBzd2l0Y2ggKHZlbmRvckF0b20uYXRvbUlkKSB7CiAgICAgICAgICAgICBjYXNlIFRydXN0eUF0b21zOjpUcnVzdHlBcHBDcmFzaGVkOgogICAgICAgICAgICAgICAgICsrYXRvbUFwcENyYXNoZWRDbnQ7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1NUUkVRKFN0cmluZzgodmVuZG9yQXRvbS52YWx1ZXNbMF0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6c3RyaW5nVmFsdWU+KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTI0N2QxOWItY2YwOS00MjcyLWE0NTAtM2VmMjBkYmVmYzE0Iik7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKFN0cmluZzgodmVuZG9yQXRvbS52YWx1ZXNbMF0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6c3RyaW5nVmFsdWU+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiNTI0N2QxOWItY2YwOS00MjcyLWE0NTAtM2VmMjBkYmVmYzE0Iik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRydXN0eUF0b21zOjpUcnVzdHlTdG9yYWdlRXJyb3I6CiAgICAgICAgICAgICAgICAgKythdG9tU3RvcmFnZUVycm9yQ250OwogICAgICAgICAgICAgICAgIEFTU0VSVF9FUSh2ZW5kb3JBdG9tLnZhbHVlc1swXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjppbnRWYWx1ZT4oKSwgNSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1NUUkVRKFN0cmluZzgodmVuZG9yQXRvbS52YWx1ZXNbMV0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6c3RyaW5nVmFsdWU+KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTI0N2QxOWItY2YwOS00MjcyLWE0NTAtM2VmMjBkYmVmYzE0Iik7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1NUUkVRKFN0cmluZzgodmVuZG9yQXRvbS52YWx1ZXNbMl0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6c3RyaW5nVmFsdWU+KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTI0N2QxOWItY2YwOS00MjcyLWE0NTAtM2VmMjBkYmVmYzE0Iik7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKFN0cmluZzgodmVuZG9yQXRvbS52YWx1ZXNbMV0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6c3RyaW5nVmFsdWU+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiNTI0N2QxOWItY2YwOS00MjcyLWE0NTAtM2VmMjBkYmVmYzE0Iik7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKFN0cmluZzgodmVuZG9yQXRvbS52YWx1ZXNbMl0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6c3RyaW5nVmFsdWU+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiNTI0N2QxOWItY2YwOS00MjcyLWE0NTAtM2VmMjBkYmVmYzE0Iik7CiAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHZlbmRvckF0b20udmFsdWVzWzNdLmdldDxWZW5kb3JBdG9tVmFsdWU6OmludFZhbHVlPigpLCAxKTsKICAgICAgICAgICAgICAgICBBU1NFUlRfRVEodmVuZG9yQXRvbS52YWx1ZXNbNF0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6aW50VmFsdWU+KCksIDMpOwogICAgICAgICAgICAgICAgIEFTU0VSVF9FUSh2ZW5kb3JBdG9tLnZhbHVlc1s1XS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpsb25nVmFsdWU+KCksCkBAIC0zMzAsMTMgKzMzMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkFueU9mKDo6dGVzdGluZzo6RXEoVHJ1c3R5QXRvbXM6OlRydXN0eUFwcENyYXNoZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6RXEoVHJ1c3R5QXRvbXM6OlRydXN0eUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkVxKFRydXN0eUF0b21zOjpUcnVzdHlTdG9yYWdlRXJyb3IpKSk7Ci0gICAgICAgIEFTU0VSVF9TVFJFUShTdHJpbmc4KHZlbmRvckF0b20ucmV2ZXJzZURvbWFpbk5hbWUpLCAiZ29vZ2xlLmFuZHJvaWQudHJ1c3R5Iik7CisgICAgICAgIEFTU0VSVF9FUShTdHJpbmc4KHZlbmRvckF0b20ucmV2ZXJzZURvbWFpbk5hbWUpLCAiZ29vZ2xlLmFuZHJvaWQudHJ1c3R5Iik7CiAKICAgICAgICAgc3dpdGNoICh2ZW5kb3JBdG9tLmF0b21JZCkgewogICAgICAgICAgICAgY2FzZSBUcnVzdHlBdG9tczo6VHJ1c3R5QXBwQ3Jhc2hlZDoKICAgICAgICAgICAgICAgICArK2F0b21BcHBDcmFzaGVkQ250OwotICAgICAgICAgICAgICAgIEFTU0VSVF9TVFJFUShTdHJpbmc4KHZlbmRvckF0b20udmFsdWVzWzBdLmdldDxWZW5kb3JBdG9tVmFsdWU6OnN0cmluZ1ZhbHVlPigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RydXN0eUNyYXNoZXJVdWlkKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1swXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtUcnVzdHlDcmFzaGVyVXVpZCk7CiAgICAgICAgICAgICAgICAgYXRvbUNyYXNoUmVhc29ucy5wdXNoX2JhY2sodmVuZG9yQXRvbS52YWx1ZXNbMV0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6aW50VmFsdWU+KCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUcnVzdHlBdG9tczo6VHJ1c3R5U3RvcmFnZUVycm9yOgpAQCAtMzQ0LDcgKzM0NCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRydXN0eUF0b21zOjpUcnVzdHlFcnJvcjoKICAgICAgICAgICAgICAgICArK2F0b21UcnVzdHlFcnJvckNudDsKLSAgICAgICAgICAgICAgICBBU1NFUlRfU1RSRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1sxXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksICIiKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1sxXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksICIiKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgRkFJTCgpIDw8ICJVbmtub3duIHZlbmRvciBhdG9tIElEOiAiIDw8IHZlbmRvckF0b20uYXRvbUlkOwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvQW5kcm9pZC5icCBiL3RydXN0eS9zdG9yYWdlL3Byb3h5L0FuZHJvaWQuYnAKaW5kZXggMmU5N2VlMC4uZTM2MmI4YiAxMDA2NDQKLS0tIGEvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvQW5kcm9pZC5icAorKysgYi90cnVzdHkvc3RvcmFnZS9wcm94eS9BbmRyb2lkLmJwCkBAIC0zMyw2ICszMyw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliaGFyZHdhcmVfbGVnYWN5IiwKZGlmZiAtLWdpdCBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L3Byb3h5LmMgYi90cnVzdHkvc3RvcmFnZS9wcm94eS9wcm94eS5jCmluZGV4IGM4OWM1YjYuLjY3ZTkzNWUgMTAwNjQ0Ci0tLSBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L3Byb3h5LmMKKysrIGIvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvcHJveHkuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogI2luY2x1ZGUgImNoZWNrcG9pbnRfaGFuZGxpbmcuaCIKQEAgLTIzOCw2ICsyMzksMTggQEAKICAgICAvKiBwYXJzZSBhcmd1bWVudHMgKi8KICAgICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogCisgICAgLyoKKyAgICAgKiBTdGFydCBiaW5kZXIgdGhyZWFkcG9vbC4gQXQgbGVhc3Qgb25lIGV4dHJhIGJpbmRlciB0aHJlYWQgaXMgbmVlZGVkIHRvCisgICAgICogY29ubmVjdCB0byB0aGUgd2FrZWxvY2sgc2VydmljZSB3aXRob3V0IHJlbHlpbmcgb24gcG9sbGluZy4gSWYgd2UgcG9sbCBvbgorICAgICAqIHRoZSBtYWluIHRocmVhZCB3ZSBlbmQgdXAgcGF1c2luZyBmb3IgYXQgbGVhc3QgMXMgZXZlbiBpZiB0aGUgc2VydmljZQorICAgICAqIHN0YXJ0cyBmYXN0ZXIuIFdlIHNldCB0aGUgbWF4IHRocmVhZCBjb3VudCB0byAwIGJlY2F1c2Ugc3RhcnRUaHJlYWRQb29sCisgICAgICogIlN0YXJ0cyBvbmUgdGhyZWFkLCBQTFVTIHRob3NlIHJlcXVlc3RlZCBpbiBzZXRUaHJlYWRQb29sTWF4VGhyZWFkQ291bnQsCisgICAgICogUExVUyB0aG9zZSBtYW51YWxseSByZXF1ZXN0ZWQgaW4gam9pblRocmVhZFBvb2wuIiBXZSBvbmx5IG5lZWQgYSBzaW5nbGUKKyAgICAgKiBiaW5kZXIgdGhyZWFkIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvbi4KKyAgICAgKi8KKyAgICBBQmluZGVyUHJvY2Vzc19zZXRUaHJlYWRQb29sTWF4VGhyZWFkQ291bnQoMCk7CisgICAgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKCk7CisKICAgICAvKiBpbml0aWFsaXplIHNlY3VyZSBzdG9yYWdlIGRpcmVjdG9yeSAqLwogICAgIHJjID0gc3RvcmFnZV9pbml0KHNzX2RhdGFfcm9vdCk7CiAgICAgaWYgKHJjIDwgMCkgcmV0dXJuIEVYSVRfRkFJTFVSRTsKZGlmZiAtLWdpdCBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L3JwbWIuYyBiL3RydXN0eS9zdG9yYWdlL3Byb3h5L3JwbWIuYwppbmRleCAyMmE4NWE3Li4xZjVkMTA3IDEwMDY0NAotLS0gYS90cnVzdHkvc3RvcmFnZS9wcm94eS9ycG1iLmMKKysrIGIvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvcnBtYi5jCkBAIC0zOTksNiArMzk5LDE0IEBACiAKICAgICBib29sIGlzX3JlcXVlc3Rfd3JpdGUgPSByZXEtPnJlbGlhYmxlX3dyaXRlX3NpemUgPiAwOwogCisgICAgLyoKKyAgICAgKiBJbnRlcm5hbGx5IHRoaXMgY2FsbCBjb25uZWN0cyB0byB0aGUgc3VzcGVuZCBzZXJ2aWNlLCB3aGljaCB3aWxsIGNhdXNlCisgICAgICogdGhpcyBzZXJ2aWNlIHRvIHN0YXJ0IGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcuIElmIHRoZSBiaW5kZXIgdGhyZWFkIHBvb2wKKyAgICAgKiBoYXMgbm90IGJlZW4gc3RhcnRlZCBhdCB0aGlzIHBvaW50LCB0aGlzIGNhbGwgd2lsbCBibG9jayBhbmQgcG9sbCBmb3IgdGhlCisgICAgICogc2VydmljZSBldmVyeSAxcy4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHRocmVhZCBwb29sIGlzIHN0YXJ0ZWQgdG8KKyAgICAgKiByZWNlaXZlIGFuIGFzeW5jIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQgdG8gYXZvaWQKKyAgICAgKiBibG9ja2luZyAoc2VlIG1haW4pLgorICAgICAqLwogICAgIHdsX3JjID0gYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIFVGU19XQUtFX0xPQ0tfTkFNRSk7CiAgICAgaWYgKHdsX3JjIDwgMCkgewogICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBhY3F1aXJlIHdha2Vsb2NrOiAlZCwgJXNcbiIsIF9fZnVuY19fLCB3bF9yYywgc3RyZXJyb3IoZXJybm8pKTsKZGlmZiAtLWdpdCBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L3N0b3JhZ2UuYyBiL3RydXN0eS9zdG9yYWdlL3Byb3h5L3N0b3JhZ2UuYwppbmRleCAyMjk5NDgxLi44YzhlZGI3IDEwMDY0NAotLS0gYS90cnVzdHkvc3RvcmFnZS9wcm94eS9zdG9yYWdlLmMKKysrIGIvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvc3RvcmFnZS5jCkBAIC0zNTMsNyArMzUzLDYgQEAKICAgICBpZiAob3Blbl9mbGFncyAmIE9fQ1JFQVQpIHsKICAgICAgICAgc3luY19wYXJlbnQocGF0aCwgd2F0Y2hlcik7CiAgICAgfQotICAgIGZyZWUocGF0aCk7CiAKICAgICAvKiBhdCB0aGlzIHBvaW50IHJjIGNvbnRhaW5zIHN0b3JhZ2UgZmlsZSBmZCAqLwogICAgIG1zZy0+cmVzdWx0ID0gU1RPUkFHRV9OT19FUlJPUjsKQEAgLTM2MSw2ICszNjAsOSBAQAogICAgIEFMT0dWKCIlczogXCIlc1wiOiBmZCA9ICV1OiBoYW5kbGUgPSAlZFxuIiwKICAgICAgICAgICBfX2Z1bmNfXywgcGF0aCwgcmMsIHJlc3AuaGFuZGxlKTsKIAorICAgIGZyZWUocGF0aCk7CisgICAgcGF0aCA9IE5VTEw7CisKICAgICAvKiBhIGJhY2tpbmcgZmlsZSBoYXMgYmVlbiBvcGVuZWQsIG5vdGlmeSBhbnkgd2FpdGluZyBpbml0IHN0ZXBzICovCiAgICAgaWYgKCFmc19yZWFkeV9pbml0aWFsaXplZCkgewogICAgICAgICByYyA9IHByb3BlcnR5X3NldChGU19SRUFEWV9QUk9QRVJUWSwgIjEiKTsKZGlmZiAtLWdpdCBhL3RydXN0eS90cnVzdHktYmFzZS5tayBiL3RydXN0eS90cnVzdHktYmFzZS5tawppbmRleCAxOTg2YzczLi5kNjQ1YzNlIDEwMDY0NAotLS0gYS90cnVzdHkvdHJ1c3R5LWJhc2UubWsKKysrIGIvdHJ1c3R5L3RydXN0eS1iYXNlLm1rCkBAIC0zNSw4ICszNSwxNiBAQAogICAgIExPQ0FMX0tFWU1JTlRfUFJPRFVDVF9QQUNLQUdFIDo9IGFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnRydXN0eQogZW5kaWYKIAorIyBUT0RPKGIvMzA2MzY0ODczKTogbW92ZSB0aGlzIHRvIGJlIGZsYWctY29udHJvbGxlZD8KK2lmZXEgKCQoU0VDUkVUS0VFUEVSX0VOQUJMRUQpLCkKKyAgICBMT0NBTF9TRUNSRVRLRUVQRVJfUFJPRFVDVF9QQUNLQUdFIDo9CitlbHNlCisgICAgTE9DQUxfU0VDUkVUS0VFUEVSX1BST0RVQ1RfUEFDS0FHRSA6PSBhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnNlY3JldGtlZXBlci50cnVzdHkKK2VuZGlmCisKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogCSQoTE9DQUxfS0VZTUlOVF9QUk9EVUNUX1BBQ0tBR0UpIFwKKwkkKExPQ0FMX1NFQ1JFVEtFRVBFUl9QUk9EVUNUX1BBQ0tBR0UpIFwKIAlhbmRyb2lkLmhhcmR3YXJlLmdhdGVrZWVwZXItc2VydmljZS50cnVzdHkgXAogCXRydXN0eV9hcHBsb2FkZXIgXAogCmRpZmYgLS1naXQgYS90cnVzdHkvdXRpbHMvYWN2cC90cnVzdHlfbW9kdWxld3JhcHBlci5jcHAgYi90cnVzdHkvdXRpbHMvYWN2cC90cnVzdHlfbW9kdWxld3JhcHBlci5jcHAKaW5kZXggNzBmZmI1Mi4uODE3YjYwMCAxMDA2NDQKLS0tIGEvdHJ1c3R5L3V0aWxzL2FjdnAvdHJ1c3R5X21vZHVsZXdyYXBwZXIuY3BwCisrKyBiL3RydXN0eS91dGlscy9hY3ZwL3RydXN0eV9tb2R1bGV3cmFwcGVyLmNwcApAQCAtMjEsMTUgKzIxLDE3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDxtb2R1bGV3cmFwcGVyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9zcGFuLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDx0cnVzdHkvdGlwYy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogI2luY2x1ZGUgImFjdnBfaXBjLmgiCiAKQEAgLTQxLDkgKzQzLDYgQEAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHk7CiAKLXN0YXRpYyBpbmxpbmUgc2l6ZV90IEFsaWduVXBUb1BhZ2Uoc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gKHNpemUgKyAoUEFHRV9TSVpFIC0gMSkpICYgfihQQUdFX1NJWkUgLSAxKTsKLX0KIAogbmFtZXNwYWNlIHsKIApAQCAtMTAzLDE1ICsxMDIsMTIgQEAKICAgICBzdHJ1Y3QgYWN2cF9yZXEgcmVxdWVzdDsKICAgICByZXF1ZXN0Lm51bV9hcmdzID0gYXJncy5zaXplKCk7CiAKLSAgICBzaXplX3QgdG90YWxfYXJnc19zaXplID0gMDsKKyAgICBpbnQgdG90YWxfYXJnc19zaXplID0gMDsKICAgICBmb3IgKGF1dG8gYXJnIDogYXJncykgewogICAgICAgICB0b3RhbF9hcmdzX3NpemUgKz0gYXJnLnNpemUoKTsKICAgICB9CiAKLSAgICBzaG1fc2l6ZV8gPSBBQ1ZQX01JTl9TSEFSRURfTUVNT1JZOwotICAgIGlmICh0b3RhbF9hcmdzX3NpemUgPiBzaG1fc2l6ZV8pIHsKLSAgICAgICAgc2htX3NpemVfID0gQWxpZ25VcFRvUGFnZSh0b3RhbF9hcmdzX3NpemUpOwotICAgIH0KKyAgICBzaG1fc2l6ZV8gPSBzdGQ6Om1heChBQ1ZQX01JTl9TSEFSRURfTUVNT1JZLCB0b3RhbF9hcmdzX3NpemUpOwogICAgIHJlcXVlc3QuYnVmZmVyX3NpemUgPSBzaG1fc2l6ZV87CiAKICAgICBzdHJ1Y3QgaW92ZWMgaW92ID0gewpAQCAtMjA4LDYgKzIwNCwxMSBAQAogICAgIHJldHVybiB7fTsKIH0KIAorc3RhdGljIGJvb2wgRXFTdHJpbmcoYnNzbDo6U3Bhbjxjb25zdCB1aW50OF90PiBjbWQsIGNvbnN0IGNoYXIgKnN0cikgeworICAgIHJldHVybiBjbWQuc2l6ZSgpID09IHN0cmxlbihzdHIpICYmCisgICAgICAgICAgIG1lbWNtcChzdHIsIGNtZC5kYXRhKCksIGNtZC5zaXplKCkpID09IDA7Cit9CisKIGludCBtYWluKCkgewogICAgIGZvciAoOzspIHsKICAgICAgICAgYXV0byBidWZmZXIgPSBic3NsOjphY3ZwOjpSZXF1ZXN0QnVmZmVyOjpOZXcoKTsKQEAgLTIxNywxNyArMjE4LDI0IEBACiAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgICAgICB9CiAKLSAgICAgICAgTW9kdWxlV3JhcHBlciB3cmFwcGVyOwotICAgICAgICBhdXRvIHJlcyA9IHdyYXBwZXIuU2VuZE1lc3NhZ2UoYXJncyk7Ci0gICAgICAgIGlmICghcmVzLm9rKCkpIHsKLSAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCByZXMuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgICAgICB9CisgICAgICAgIGlmIChFcVN0cmluZyhhcmdzWzBdLCAiZmx1c2giKSkgeworICAgICAgICAgICAgaWYgKCFic3NsOjphY3ZwOjpGbHVzaEJ1ZmZlcihTVERPVVRfRklMRU5PKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmx1c2ggdGhlIGJ1ZmZlciB0byBzdGRvdXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNb2R1bGVXcmFwcGVyIHdyYXBwZXI7CisgICAgICAgICAgICBhdXRvIHJlcyA9IHdyYXBwZXIuU2VuZE1lc3NhZ2UoYXJncyk7CisgICAgICAgICAgICBpZiAoIXJlcy5vaygpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8IHJlcy5lcnJvcigpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IHdyYXBwZXIuRm9yd2FyZFJlc3BvbnNlKCk7Ci0gICAgICAgIGlmICghcmVzLm9rKCkpIHsKLSAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCByZXMuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgcmVzID0gd3JhcHBlci5Gb3J3YXJkUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIGlmICghcmVzLm9rKCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgcmVzLmVycm9yKCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3RydXN0eS91dGlscy9jb3ZlcmFnZS1jb250cm9sbGVyL0FuZHJvaWQuYnAgYi90cnVzdHkvdXRpbHMvY292ZXJhZ2UtY29udHJvbGxlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDMwZDkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkvdXRpbHMvY292ZXJhZ2UtY29udHJvbGxlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInRydXN0eS1jb3ZlcmFnZS1jb250cm9sbGVyIiwKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbImNvbnRyb2xsZXIuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliZG1hYnVmaGVhcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlidHJ1c3R5IiwKKyAgICAgICAgImxpYnRydXN0eV9saW5lX2NvdmVyYWdlIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3V0aWxzL2NvdmVyYWdlLWNvbnRyb2xsZXIvY29udHJvbGxlci5jcHAgYi90cnVzdHkvdXRpbHMvY292ZXJhZ2UtY29udHJvbGxlci9jb250cm9sbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODFhNDUyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L3V0aWxzL2NvdmVyYWdlLWNvbnRyb2xsZXIvY29udHJvbGxlci5jcHAKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRydXN0eS9saW5lLWNvdmVyYWdlL2NvdmVyYWdlLmg+CisjaW5jbHVkZSA8dHJ1c3R5L3RpcGMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb250cm9sbGVyLmgiCisKKyNkZWZpbmUgUkVBRF9PTkNFKHgpICgqKCh2b2xhdGlsZSBfX3R5cGVvZl9fKHgpICopICYoeCkpKQorI2RlZmluZSBXUklURV9PTkNFKHgsIHZhbCkgKCooKHZvbGF0aWxlIF9fdHlwZW9mX18odmFsKSAqKSAmKHgpKSA9ICh2YWwpKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdHJ1c3R5IHsKK25hbWVzcGFjZSBjb250cm9sbGVyIHsKKwordXNpbmcgOjphbmRyb2lkOjp0cnVzdHk6OmxpbmVfY292ZXJhZ2U6OkNvdmVyYWdlUmVjb3JkOworCit2b2lkIENvbnRyb2xsZXI6OnJ1bihzdGQ6OnN0cmluZyBvdXRwdXRfZGlyKSB7CisgICAgY29ubmVjdENvdmVyYWdlU2VydmVyKCk7CisgICAgc3RydWN0IGNvbnRyb2wgKmNvbnRyb2w7CisgICAgdWludDY0X3QgY29tcGxldGVfY250ID0gMCwgc3RhcnRfY250ID0gMCwgZmxhZ3M7CisKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIHNldFVwU2htKCk7CisKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHJlY29yZF9saXN0Xy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGNvbnRyb2wgPSAoc3RydWN0IGNvbnRyb2wgKilyZWNvcmRfbGlzdF9baW5kZXhdLT5nZXRTaG0oKTsKKyAgICAgICAgICAgIHN0YXJ0X2NudCA9IFJFQURfT05DRSgoY29udHJvbC0+d3JpdGVfYnVmZmVyX3N0YXJ0X2NvdW50KSk7CisgICAgICAgICAgICBjb21wbGV0ZV9jbnQgPSBSRUFEX09OQ0UoY29udHJvbC0+d3JpdGVfYnVmZmVyX2NvbXBsZXRlX2NvdW50KTsKKyAgICAgICAgICAgIGZsYWdzID0gUkVBRF9PTkNFKGNvbnRyb2wtPmNudHJsX2ZsYWdzKTsKKworICAgICAgICAgICAgaWYgKGNvbXBsZXRlX2NudCAhPSBjb3VudGVyc1tpbmRleF0gJiYgc3RhcnRfY250ID09IGNvbXBsZXRlX2NudCkgeworICAgICAgICAgICAgICAgIFdSSVRFX09OQ0UoY29udHJvbC0+Y250cmxfZmxhZ3MsIEZMQUdfTk9ORSk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWU7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIi8lcy4lIiBQUkl1NjQgIi5wcm9mcmF3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkX2xpc3RfW2luZGV4XS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzW2luZGV4XSk7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUuaW5zZXJ0KDAsIG91dHB1dF9kaXIpOworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiByZXMgPSByZWNvcmRfbGlzdF9baW5kZXhdLT5TYXZlRmlsZShmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgY291bnRlcnNbaW5kZXhdKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihjb21wbGV0ZV9jbnQgPT0gY291bnRlcnNbaW5kZXhdICYmCisgICAgICAgICAgICAgICAgIShmbGFncyAmIEZMQUdfUlVOKSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUlVOOworICAgICAgICAgICAgICAgIFdSSVRFX09OQ0UoY29udHJvbC0+Y250cmxfZmxhZ3MsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb250cm9sbGVyOjpjb25uZWN0Q292ZXJhZ2VTZXJ2ZXIoKSB7CisgICAgY292ZXJhZ2Vfc3J2X2ZkID0gdGlwY19jb25uZWN0KFRJUENfREVWLCBMSU5FX0NPVkVSQUdFX0NMSUVOVF9QT1JUKTsKKyAgICBpZiAoY292ZXJhZ2Vfc3J2X2ZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgXAorICAgICAgICAgICAgICAgICJFcnJvcjogRmFpbGVkIHRvIGNvbm5lY3QgdG8gVHJ1c3R5IGNvdmVyYWdlIHNlcnZlcjogJWRcbiIsIGNvdmVyYWdlX3Nydl9mZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgQ29udHJvbGxlcjo6c2V0VXBTaG0oKSB7CisgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3JlcSByZXE7CisgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3Jlc3AgcmVzcDsKKyAgICB1aW50MzJfdCBjdXJfaW5kZXggPSByZWNvcmRfbGlzdF8uc2l6ZSgpOworICAgIHN0cnVjdCB1dWlkIHplcm9fdXVpZCA9IHswLCAwLCAwLCB7IDAgfX07CisgICAgY2hhciB1dWlkX3N0cltVVUlEX1NUUl9TSVpFXTsKKyAgICByZXEuaGRyLmNtZCA9IExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TRU5EX0xJU1Q7CisgICAgaW50IHJjID0gd3JpdGUoY292ZXJhZ2Vfc3J2X2ZkLCAmcmVxLCBzaXplb2YocmVxKSk7CisgICAgICAgIGlmIChyYyAhPSAoaW50KXNpemVvZihyZXEpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBzZW5kIHJlcXVlc3QgdG8gY292ZXJhZ2Ugc2VydmVyOiAlZFxuIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgcmMgPSByZWFkKGNvdmVyYWdlX3Nydl9mZCwgJnJlc3AsIHNpemVvZihyZXNwKSk7CisgICAgICAgIGlmIChyYyAhPSAoaW50KXNpemVvZihyZXNwKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gcmVhZCByZXBseSBmcm9tIGNvdmVyYWdlIHNlcnZlcjo6ICVkXG4iLCByYyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzcC5oZHIuY21kID09IChyZXEuaGRyLmNtZCB8IExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9SRVNQX0JJVCkpIHsKKyAgICAgICAgICAgIGlmICghbWVtY21wKCZyZXNwLnNlbmRfbGlzdF9hcmdzLnV1aWQsICZ6ZXJvX3V1aWQsIHNpemVvZihzdHJ1Y3QgdXVpZCkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZih1dWlkX3NldF8uZmluZChyZXNwLnNlbmRfbGlzdF9hcmdzLnV1aWQpID09IHV1aWRfc2V0Xy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHV1aWRfc2V0Xy5pbnNlcnQocmVzcC5zZW5kX2xpc3RfYXJncy51dWlkKTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHV1aWRfc3RyLAorICAgICAgICAgICAgICAgICAgICAiJTA4IiBQUkl4MzIgIi0lMDQiIFBSSXgxNiAiLSUwNCIgUFJJeDE2ICItJTAyIiBQUkl4OCAiJTAyIiBQUkl4OAorICAgICAgICAgICAgICAgICAgICAiLSUwMiIgUFJJeDggIiUwMiIgUFJJeDggIiUwMiIgUFJJeDggIiUwMiIgUFJJeDggIiUwMiIgUFJJeDggIiUwMiIgUFJJeDgsCisgICAgICAgICAgICAgICAgICAgIHJlc3Auc2VuZF9saXN0X2FyZ3MudXVpZC50aW1lX2xvdywKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLnRpbWVfbWlkLAorICAgICAgICAgICAgICAgICAgICByZXNwLnNlbmRfbGlzdF9hcmdzLnV1aWQudGltZV9oaV9hbmRfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVswXSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVszXSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVs1XSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVs2XSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVs3XSk7CisgICAgICAgICAgICAgICAgdXVpZF9saXN0Xy5wdXNoX2JhY2sodXVpZF9zdHIpOworICAgICAgICAgICAgICAgIHJlY29yZF9saXN0Xy5wdXNoX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxDb3ZlcmFnZVJlY29yZD4oVElQQ19ERVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNwLnNlbmRfbGlzdF9hcmdzLnV1aWQpKTsKKyAgICAgICAgICAgICAgICBjb3VudGVycy5wdXNoX2JhY2soMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gcmVzcG9uc2UgaGVhZGVyXG4iKTsKKyAgICAgICAgfQorICAgICAgICBjdXJfaW5kZXgrKzsKKyAgICAgICAgcmVxLmhkci5jbWQgPSBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0VORF9MSVNUOworICAgICAgICByZXEuc2VuZF9saXN0X2FyZ3MuaW5kZXggPSBjdXJfaW5kZXg7CisgICAgICAgIGludCByYyA9IHdyaXRlKGNvdmVyYWdlX3Nydl9mZCwgJnJlcSwgc2l6ZW9mKHJlcSkpOworICAgICAgICBpZiAocmMgIT0gKGludClzaXplb2YocmVxKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gc2VuZCByZXF1ZXN0IHRvIGNvdmVyYWdlIHNlcnZlcjogJWRcbiIsIHJjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpbnQgaW5kID0gMCA7IGluZCA8IHJlY29yZF9saXN0Xy5zaXplKCkgOyBpbmQrKykgeworICAgICAgICByZWNvcmRfbGlzdF9baW5kXS0+T3Blbihjb3ZlcmFnZV9zcnZfZmQpOworICAgIH0KK30KKworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbGxlcgorfSAgLy8gbmFtZXNwYWNlIHRydXN0eQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworCisgICAgc3RkOjpzdHJpbmcgb3B0YXJnID0gIiI7CisgICAgZG8geworICAgICAgICBpbnQgYzsKKyAgICAgICAgYyA9IGdldG9wdChhcmdjLCBhcmd2LCAibyIpOworCisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgLW8gW291dHB1dF9kaXJlY3RvcnldXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDEpOworCisgICAgaWYgKGFyZ2MgPiBvcHRpbmQgKyAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHRvbyBtYW55IGFyZ3VtZW50c1xuIiwgYXJndlswXSk7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA+IG9wdGluZCkgeworICAgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZF07CisgICAgfQorICAgIGlmIChvcHRhcmcuc2l6ZSgpPT0wKSB7CisgICAgICAgIG9wdGFyZyA9ICJkYXRhL2xvY2FsL3RtcCI7CisgICAgfQorCisgICAgYW5kcm9pZDo6dHJ1c3R5Ojpjb250cm9sbGVyOjpDb250cm9sbGVyIGN1cjsKKyAgICBjdXIucnVuKG9wdGFyZyk7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS91dGlscy9jb3ZlcmFnZS1jb250cm9sbGVyL2NvbnRyb2xsZXIuaCBiL3RydXN0eS91dGlscy9jb3ZlcmFnZS1jb250cm9sbGVyL2NvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc4OWJmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L3V0aWxzL2NvdmVyYWdlLWNvbnRyb2xsZXIvY29udHJvbGxlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHRydXN0eS9saW5lLWNvdmVyYWdlL2NvdmVyYWdlLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisKKyNkZWZpbmUgVElQQ19ERVYgIi9kZXYvdHJ1c3R5LWlwYy1kZXYwIgorI2RlZmluZSBURVNUX1NSVl9QT1JUICJjb20uYW5kcm9pZC50cnVzdHkuc2FuY292LnRlc3Quc3J2IgorI2RlZmluZSBURVNUX1NSVl9NT0RVTEUgInNydi5zeW1zLmVsZiIKKworI2RlZmluZSBVVUlEX1NUUl9TSVpFICgzNykKKworI2RlZmluZSBGTEFHX05PTkUgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgRkxBR19SVU4gICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIEZMQUdfVE9HR0xFX0NMRUFSICAgICAgIDB4MgorCitzdHJ1Y3QgY29udHJvbCB7CisgICAgLyogV3JpdHRlbiBieSBjb250cm9sbGVyLCByZWFkIGJ5IGluc3RydW1lbnRlZCBUQSAqLworICAgIHVpbnQ2NF90ICAgICAgICBjbnRybF9mbGFnczsKKworICAgIC8qIFdyaXR0ZW4gYnkgaW5zdHJ1bWVudGVkIFRBLCByZWFkIGJ5IGNvbnRyb2xsZXIgKi8KKyAgICB1aW50NjRfdCAgICAgICAgb3Blcl9mbGFnczsKKyAgICB1aW50NjRfdCAgICAgICAgd3JpdGVfYnVmZmVyX3N0YXJ0X2NvdW50OworICAgIHVpbnQ2NF90ICAgICAgICB3cml0ZV9idWZmZXJfY29tcGxldGVfY291bnQ7Cit9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdHJ1c3R5IHsKK25hbWVzcGFjZSBjb250cm9sbGVyIHsKKworY2xhc3MgQ29udHJvbGxlciB7CisgIHB1YmxpYzoKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgcnVuKHN0ZDo6c3RyaW5nIG91dHB1dF9kaXIpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGxpbmVfY292ZXJhZ2U6OkNvdmVyYWdlUmVjb3JkPj5yZWNvcmRfbGlzdF87CisgICAgICAgIHN0ZDo6c2V0PHN0cnVjdCB1dWlkPnV1aWRfc2V0XzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+dXVpZF9saXN0XzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGNvdW50ZXJzOworICAgICAgICBpbnQgY292ZXJhZ2Vfc3J2X2ZkOworCisgICAgICAgIHZvaWQgY29ubmVjdENvdmVyYWdlU2VydmVyKCk7CisgICAgICAgIHZvaWQgc2V0VXBTaG0oKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb250cm9sbGVyCit9ICAvLyBuYW1lc3BhY2UgdHJ1c3R5Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAo=